Macro for traceEntry(Any*)
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/9f3a7d6f Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/9f3a7d6f Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/9f3a7d6f Branch: refs/heads/LOG4J-1181 Commit: 9f3a7d6ffaca7b7ddfd13c31b78c3a5a7a723e81 Parents: ed201df Author: Mikael Ståldal <mikael.stal...@magine.com> Authored: Sat Jun 18 23:31:54 2016 +0200 Committer: Mikael Ståldal <mikael.stal...@magine.com> Committed: Sat Jun 18 23:31:54 2016 +0200 ---------------------------------------------------------------------- .../org/apache/logging/log4j/scala/Logger.scala | 51 +++++++++++--------- .../logging/log4j/scala/LoggerMacro.scala | 24 ++++++++- .../apache/logging/log4j/scala/LoggerTest.scala | 32 +++++++++++- .../org/apache/logging/log4j/scala/Logger.scala | 51 +++++++++++--------- .../logging/log4j/scala/LoggerMacro.scala | 26 ++++++++-- .../apache/logging/log4j/scala/LoggerTest.scala | 32 +++++++++++- 6 files changed, 163 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala ---------------------------------------------------------------------- diff --git a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala index 9a25f1f..ba15f8f 100644 --- a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala +++ b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala @@ -26,7 +26,7 @@ class Logger(val delegate: ExtendedLogger) { private final val FQCN = classOf[Logger].getName - + def fatal(marker: Marker, message: Message): Unit = macro LoggerMacro.fatalMarkerMsg @@ -50,10 +50,10 @@ class Logger(val delegate: ExtendedLogger) { def fatal(message: CharSequence): Unit = macro LoggerMacro.fatalCseq - + def fatal(message: AnyRef): Unit = macro LoggerMacro.fatalObject - + def fatal(message: Message, cause: Throwable): Unit = macro LoggerMacro.fatalMsgThrowable @@ -247,8 +247,8 @@ class Logger(val delegate: ExtendedLogger) { def trace(message: AnyRef, cause: Throwable): Unit = macro LoggerMacro.traceObjectThrowable - - + + def log(level: Level, marker: Marker, message: Message): Unit = macro LoggerMacro.logMarkerMsg @@ -263,10 +263,10 @@ class Logger(val delegate: ExtendedLogger) { def log(level: Level, marker: Marker, message: CharSequence, cause: Throwable): Unit = macro LoggerMacro.logMarkerCseqThrowable - + def log(level: Level, marker: Marker, message: AnyRef, cause: Throwable): Unit = macro LoggerMacro.logMarkerObjectThrowable - + def log(level: Level, message: Message): Unit = macro LoggerMacro.logMsg @@ -275,7 +275,7 @@ class Logger(val delegate: ExtendedLogger) { def log(level: Level, message: AnyRef): Unit = macro LoggerMacro.logObject - + def log(level: Level, message: Message, cause: Throwable): Unit = macro LoggerMacro.logMsgThrowable @@ -284,7 +284,7 @@ class Logger(val delegate: ExtendedLogger) { def log(level: Level, message: AnyRef, cause: Throwable): Unit = macro LoggerMacro.logObjectThrowable - + def isEnabled(level: Level): Boolean = delegate.isEnabled(level) @@ -293,8 +293,8 @@ class Logger(val delegate: ExtendedLogger) { def traceEntry(): EntryMessage = delegate.traceEntry() - def traceEntry(params: AnyRef*): EntryMessage = - delegate.traceEntry(null, params) // TODO would be useful to have this as a macro to avoid varargs array creation + def traceEntry(params: Any*): EntryMessage = + macro LoggerMacro.traceEntryParams def traceEntry(message: Message): EntryMessage = delegate.traceEntry(message) @@ -319,13 +319,14 @@ class Logger(val delegate: ExtendedLogger) { def messageFactory: MessageFactory2 = delegate.getMessageFactory.asInstanceOf[MessageFactory2] + /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified * level is enabled. * - * @param level log level - * @param marker marker or `null` - * @param message message - * @param cause cause or `null` + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` */ private[scala] def logMessage(level: Level, marker: Marker, message: Message, cause: Throwable): Unit = { delegate.logMessage(FQCN, level, marker, message, cause) @@ -334,10 +335,10 @@ class Logger(val delegate: ExtendedLogger) { /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified * level is enabled. * - * @param level log level - * @param marker marker or `null` - * @param message message - * @param cause cause or `null` + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` */ private[scala] def logMessage(level: Level, marker: Marker, message: CharSequence, cause: Throwable): Unit = { delegate.logMessage(FQCN, level, marker, messageFactory.newMessage(message), cause) @@ -346,13 +347,17 @@ class Logger(val delegate: ExtendedLogger) { /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified * level is enabled. * - * @param level log level - * @param marker marker or `null` - * @param message message - * @param cause cause or `null` + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` */ private[scala] def logMessage(level: Level, marker: Marker, message: AnyRef, cause: Throwable): Unit = { delegate.logMessage(FQCN, level, marker, messageFactory.newMessage(message), cause) } + private[scala] def traceEntryWithParams(params: Any*): EntryMessage = { + delegate.traceEntry(null, params) + } + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala ---------------------------------------------------------------------- diff --git a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala index 756975e..a1ebee7 100644 --- a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala +++ b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala @@ -16,7 +16,8 @@ */ package org.apache.logging.log4j.scala -import org.apache.logging.log4j.message.Message +import org.apache.logging.log4j.message.{EntryMessage, Message} +import org.apache.logging.log4j.spi.AbstractLogger import org.apache.logging.log4j.{Level, Marker} import scala.language.experimental.macros @@ -332,5 +333,24 @@ private object LoggerMacro { c.prefix.splice.logMessage(level.splice, null, message.splice, cause.splice) } ) - + + def traceEntryParams(c: LoggerContext)(params: c.Expr[Any]*): c.Expr[EntryMessage] = { + import c.universe._ + val isEnabled = Apply( + Select(Select(c.prefix.tree, newTermName("delegate")), newTermName("isEnabled")), + List( + reify(Level.TRACE).tree, + reify(AbstractLogger.ENTRY_MARKER).tree, + reify(null.asInstanceOf[AnyRef]).tree, + reify(null).tree + ) + ) + + val log = Apply( + Select(c.prefix.tree, newTermName("traceEntryWithParams")), + (params map (_.tree)).toList + ) + c.Expr[EntryMessage](If(isEnabled, log, reify(null).tree)) + } + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala ---------------------------------------------------------------------- diff --git a/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala b/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala index 1c3a126..359281e 100644 --- a/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala +++ b/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala @@ -17,7 +17,7 @@ package org.apache.logging.log4j.scala import org.apache.logging.log4j.message.{Message, ParameterizedMessage, ParameterizedMessageFactory} -import org.apache.logging.log4j.spi.ExtendedLogger +import org.apache.logging.log4j.spi.{AbstractLogger, ExtendedLogger} import org.apache.logging.log4j.{Level, Marker, MarkerManager} import org.junit.runner.RunWith import org.mockito.Matchers.{any, anyString, eq => eqv} @@ -428,4 +428,34 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar { verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) } + + test("traceEntry enabled with params") { + val f = fixture + when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true) + val logger = new Logger(f.mockLogger) + logger.traceEntry("foo", 17) + verify(f.mockLogger).traceEntry(anyString(), any[Array[AnyRef]]) + } + + test("traceEntry disabled with params") { + val f = fixture + when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(false) + val logger = new Logger(f.mockLogger) + logger.traceEntry("foo", 17) + verify(f.mockLogger, never).traceEntry(anyString(), any[Array[AnyRef]]) + } + + test("traceEntry without params") { + val f = fixture + val logger = new Logger(f.mockLogger) + logger.traceEntry() + verify(f.mockLogger).traceEntry() + } + + test("traceEntry with message") { + val f = fixture + val logger = new Logger(f.mockLogger) + logger.traceEntry(msg) + verify(f.mockLogger).traceEntry(eqv(msg)) + } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala ---------------------------------------------------------------------- diff --git a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala index 9a25f1f..ba15f8f 100644 --- a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala +++ b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala @@ -26,7 +26,7 @@ class Logger(val delegate: ExtendedLogger) { private final val FQCN = classOf[Logger].getName - + def fatal(marker: Marker, message: Message): Unit = macro LoggerMacro.fatalMarkerMsg @@ -50,10 +50,10 @@ class Logger(val delegate: ExtendedLogger) { def fatal(message: CharSequence): Unit = macro LoggerMacro.fatalCseq - + def fatal(message: AnyRef): Unit = macro LoggerMacro.fatalObject - + def fatal(message: Message, cause: Throwable): Unit = macro LoggerMacro.fatalMsgThrowable @@ -247,8 +247,8 @@ class Logger(val delegate: ExtendedLogger) { def trace(message: AnyRef, cause: Throwable): Unit = macro LoggerMacro.traceObjectThrowable - - + + def log(level: Level, marker: Marker, message: Message): Unit = macro LoggerMacro.logMarkerMsg @@ -263,10 +263,10 @@ class Logger(val delegate: ExtendedLogger) { def log(level: Level, marker: Marker, message: CharSequence, cause: Throwable): Unit = macro LoggerMacro.logMarkerCseqThrowable - + def log(level: Level, marker: Marker, message: AnyRef, cause: Throwable): Unit = macro LoggerMacro.logMarkerObjectThrowable - + def log(level: Level, message: Message): Unit = macro LoggerMacro.logMsg @@ -275,7 +275,7 @@ class Logger(val delegate: ExtendedLogger) { def log(level: Level, message: AnyRef): Unit = macro LoggerMacro.logObject - + def log(level: Level, message: Message, cause: Throwable): Unit = macro LoggerMacro.logMsgThrowable @@ -284,7 +284,7 @@ class Logger(val delegate: ExtendedLogger) { def log(level: Level, message: AnyRef, cause: Throwable): Unit = macro LoggerMacro.logObjectThrowable - + def isEnabled(level: Level): Boolean = delegate.isEnabled(level) @@ -293,8 +293,8 @@ class Logger(val delegate: ExtendedLogger) { def traceEntry(): EntryMessage = delegate.traceEntry() - def traceEntry(params: AnyRef*): EntryMessage = - delegate.traceEntry(null, params) // TODO would be useful to have this as a macro to avoid varargs array creation + def traceEntry(params: Any*): EntryMessage = + macro LoggerMacro.traceEntryParams def traceEntry(message: Message): EntryMessage = delegate.traceEntry(message) @@ -319,13 +319,14 @@ class Logger(val delegate: ExtendedLogger) { def messageFactory: MessageFactory2 = delegate.getMessageFactory.asInstanceOf[MessageFactory2] + /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified * level is enabled. * - * @param level log level - * @param marker marker or `null` - * @param message message - * @param cause cause or `null` + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` */ private[scala] def logMessage(level: Level, marker: Marker, message: Message, cause: Throwable): Unit = { delegate.logMessage(FQCN, level, marker, message, cause) @@ -334,10 +335,10 @@ class Logger(val delegate: ExtendedLogger) { /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified * level is enabled. * - * @param level log level - * @param marker marker or `null` - * @param message message - * @param cause cause or `null` + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` */ private[scala] def logMessage(level: Level, marker: Marker, message: CharSequence, cause: Throwable): Unit = { delegate.logMessage(FQCN, level, marker, messageFactory.newMessage(message), cause) @@ -346,13 +347,17 @@ class Logger(val delegate: ExtendedLogger) { /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified * level is enabled. * - * @param level log level - * @param marker marker or `null` - * @param message message - * @param cause cause or `null` + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` */ private[scala] def logMessage(level: Level, marker: Marker, message: AnyRef, cause: Throwable): Unit = { delegate.logMessage(FQCN, level, marker, messageFactory.newMessage(message), cause) } + private[scala] def traceEntryWithParams(params: Any*): EntryMessage = { + delegate.traceEntry(null, params) + } + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala ---------------------------------------------------------------------- diff --git a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala index 808a08f..2105ad9 100644 --- a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala +++ b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala @@ -16,7 +16,8 @@ */ package org.apache.logging.log4j.scala -import org.apache.logging.log4j.message.Message +import org.apache.logging.log4j.message.{EntryMessage, Message} +import org.apache.logging.log4j.spi.AbstractLogger import org.apache.logging.log4j.{Level, Marker} import scala.language.experimental.macros @@ -26,7 +27,7 @@ private object LoggerMacro { type LoggerContext = blackbox.Context { type PrefixType = Logger } - + def fatalMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message]) = logMarkerMsg(c)(c.universe.reify(Level.FATAL), marker, message) @@ -332,5 +333,24 @@ private object LoggerMacro { c.prefix.splice.logMessage(level.splice, null, message.splice, cause.splice) } ) - + + def traceEntryParams(c: LoggerContext)(params: c.Expr[Any]*): c.Expr[EntryMessage] = { + import c.universe._ + val isEnabled = Apply( + Select(Select(c.prefix.tree, newTermName("delegate")), newTermName("isEnabled")), + List( + reify(Level.TRACE).tree, + reify(AbstractLogger.ENTRY_MARKER).tree, + reify(null.asInstanceOf[AnyRef]).tree, + reify(null).tree + ) + ) + + val log = Apply( + Select(c.prefix.tree, newTermName("traceEntryWithParams")), + (params map (_.tree)).toList + ) + c.Expr[EntryMessage](If(isEnabled, log, reify(null).tree)) + } + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala ---------------------------------------------------------------------- diff --git a/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala b/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala index 1c3a126..359281e 100644 --- a/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala +++ b/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala @@ -17,7 +17,7 @@ package org.apache.logging.log4j.scala import org.apache.logging.log4j.message.{Message, ParameterizedMessage, ParameterizedMessageFactory} -import org.apache.logging.log4j.spi.ExtendedLogger +import org.apache.logging.log4j.spi.{AbstractLogger, ExtendedLogger} import org.apache.logging.log4j.{Level, Marker, MarkerManager} import org.junit.runner.RunWith import org.mockito.Matchers.{any, anyString, eq => eqv} @@ -428,4 +428,34 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar { verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) } + + test("traceEntry enabled with params") { + val f = fixture + when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true) + val logger = new Logger(f.mockLogger) + logger.traceEntry("foo", 17) + verify(f.mockLogger).traceEntry(anyString(), any[Array[AnyRef]]) + } + + test("traceEntry disabled with params") { + val f = fixture + when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(false) + val logger = new Logger(f.mockLogger) + logger.traceEntry("foo", 17) + verify(f.mockLogger, never).traceEntry(anyString(), any[Array[AnyRef]]) + } + + test("traceEntry without params") { + val f = fixture + val logger = new Logger(f.mockLogger) + logger.traceEntry() + verify(f.mockLogger).traceEntry() + } + + test("traceEntry with message") { + val f = fixture + val logger = new Logger(f.mockLogger) + logger.traceEntry(msg) + verify(f.mockLogger).traceEntry(eqv(msg)) + } }