Only evaluate log message thunk once

When there are multiple console appenders for a logger, we inadvertently
evaluated the message thunk for each appender which would cause side
effects to be unexpectedely evaluated multiple times.

Fixes part of #6126.
This commit is contained in:
Ethan Atkins 2020-11-19 14:58:45 -08:00
parent a185e24fff
commit 3ff85b175d
1 changed files with 6 additions and 4 deletions

View File

@ -116,11 +116,13 @@ object LoggerContext {
private class Log extends MiniLogger { private class Log extends MiniLogger {
private val consoleAppenders: java.util.Vector[(Appender, Level.Value)] = private val consoleAppenders: java.util.Vector[(Appender, Level.Value)] =
new java.util.Vector new java.util.Vector
def log(level: Level.Value, message: => String): Unit = def log(level: Level.Value, message: => String): Unit = {
consoleAppenders.forEach { val toAppend = consoleAppenders.asScala.filter { case (a, l) => level.compare(l) >= 0 }
case (a, l) => if (toAppend.nonEmpty) {
if (level.compare(l) >= 0) a.appendLog(level, message) val m = message
toAppend.foreach { case (a, l) => a.appendLog(level, m) }
} }
}
def log[T](level: Level.Value, message: ObjectEvent[T]): Unit = { def log[T](level: Level.Value, message: ObjectEvent[T]): Unit = {
consoleAppenders.forEach { consoleAppenders.forEach {
case (a, l) => case (a, l) =>