Macros for throwing and catching
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4668ce28 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4668ce28 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4668ce28 Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure Commit: 4668ce287a6500b9257b6279621a528900931c13 Parents: 7dac62e Author: Mikael Ståldal <mikael.stal...@magine.com> Authored: Fri Jul 1 15:41:14 2016 +0200 Committer: Mikael Ståldal <mikael.stal...@magine.com> Committed: Fri Jul 1 15:41:14 2016 +0200 ---------------------------------------------------------------------- .../org/apache/logging/log4j/scala/Logger.scala | 12 ++++++--- .../logging/log4j/scala/LoggerMacro.scala | 21 +++++++++++++++ .../apache/logging/log4j/scala/LoggerTest.scala | 28 ++++++++++++++++++++ .../org/apache/logging/log4j/scala/Logger.scala | 12 ++++++--- .../logging/log4j/scala/LoggerMacro.scala | 21 +++++++++++++++ .../apache/logging/log4j/scala/LoggerTest.scala | 28 ++++++++++++++++++++ .../logging/log4j/scalasample/LoggingApp.scala | 9 +++++++ 7 files changed, 123 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4668ce28/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 1c19fcd..a5ebacf 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 @@ -534,7 +534,8 @@ class Logger private(val delegate: ExtendedLogger) { * @param t the Throwable * @return `t` */ - def throwing[T <: Throwable](t: T): T = delegate.throwing(t) + def throwing[T <: Throwable](t: T): T = + macro LoggerMacro.throwing[T] /** * Logs an exception or error to be thrown to a specific logging level. @@ -547,14 +548,16 @@ class Logger private(val delegate: ExtendedLogger) { * @param t the Throwable * @return `t` */ - def throwing[T <: Throwable](level: Level, t: T): T = delegate.throwing(level, t) + def throwing[T <: Throwable](level: Level, t: T): T = + macro LoggerMacro.throwingLevel[T] /** * Logs an exception or error that has been caught. * * @param t the Throwable. */ - def catching(t: Throwable): Unit = delegate.catching(t) + def catching(t: Throwable): Unit = + macro LoggerMacro.catching /** * Logs an exception or error that has been caught to a specific logging level. @@ -562,7 +565,8 @@ class Logger private(val delegate: ExtendedLogger) { * @param level The logging Level. * @param t The Throwable. */ - def catching(level: Level, t: Throwable): Unit = delegate.catching(level, t) + def catching(level: Level, t: Throwable): Unit = + macro LoggerMacro.catchingLevel /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4668ce28/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 6ff8e53..24b3c8c 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 @@ -401,4 +401,25 @@ private object LoggerMacro { result.splice } ) + + def throwing[T <: Throwable: c.WeakTypeTag](c: LoggerContext)(t: c.Expr[T]): c.Expr[T] = + c.universe.reify( + c.prefix.splice.delegate.throwing(t.splice) + ) + + def throwingLevel[T <: Throwable: c.WeakTypeTag](c: LoggerContext)(level: c.Expr[Level], t: c.Expr[T]): c.Expr[T] = + c.universe.reify( + c.prefix.splice.delegate.throwing(level.splice, t.splice) + ) + + def catching(c: LoggerContext)(t: c.Expr[Throwable]): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.catching(t.splice) + ) + + def catchingLevel(c: LoggerContext)(level: c.Expr[Level], t: c.Expr[Throwable]): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.catching(level.splice, t.splice) + ) + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4668ce28/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 4c14d5d..ba02437 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 @@ -559,4 +559,32 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar { verify(f.mockLogger, never).traceExit(any[Message], any[AnyRef]) } + test("throwing") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.throwing(cause) + verify(f.mockLogger).throwing(eqv(cause)) + } + + test("throwing with level") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.throwing(Level.INFO, cause) + verify(f.mockLogger).throwing(eqv(Level.INFO), eqv(cause)) + } + + test("catching") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.catching(cause) + verify(f.mockLogger).catching(eqv(cause)) + } + + test("catching with level") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.catching(Level.INFO, cause) + verify(f.mockLogger).catching(eqv(Level.INFO), eqv(cause)) + } + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4668ce28/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 1c19fcd..a5ebacf 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 @@ -534,7 +534,8 @@ class Logger private(val delegate: ExtendedLogger) { * @param t the Throwable * @return `t` */ - def throwing[T <: Throwable](t: T): T = delegate.throwing(t) + def throwing[T <: Throwable](t: T): T = + macro LoggerMacro.throwing[T] /** * Logs an exception or error to be thrown to a specific logging level. @@ -547,14 +548,16 @@ class Logger private(val delegate: ExtendedLogger) { * @param t the Throwable * @return `t` */ - def throwing[T <: Throwable](level: Level, t: T): T = delegate.throwing(level, t) + def throwing[T <: Throwable](level: Level, t: T): T = + macro LoggerMacro.throwingLevel[T] /** * Logs an exception or error that has been caught. * * @param t the Throwable. */ - def catching(t: Throwable): Unit = delegate.catching(t) + def catching(t: Throwable): Unit = + macro LoggerMacro.catching /** * Logs an exception or error that has been caught to a specific logging level. @@ -562,7 +565,8 @@ class Logger private(val delegate: ExtendedLogger) { * @param level The logging Level. * @param t The Throwable. */ - def catching(level: Level, t: Throwable): Unit = delegate.catching(level, t) + def catching(level: Level, t: Throwable): Unit = + macro LoggerMacro.catchingLevel /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4668ce28/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 5e9fa44..a091c97 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 @@ -401,4 +401,25 @@ private object LoggerMacro { result.splice } ) + + def throwing[T <: Throwable: c.WeakTypeTag](c: LoggerContext)(t: c.Expr[T]): c.Expr[T] = + c.universe.reify( + c.prefix.splice.delegate.throwing(t.splice) + ) + + def throwingLevel[T <: Throwable: c.WeakTypeTag](c: LoggerContext)(level: c.Expr[Level], t: c.Expr[T]): c.Expr[T] = + c.universe.reify( + c.prefix.splice.delegate.throwing(level.splice, t.splice) + ) + + def catching(c: LoggerContext)(t: c.Expr[Throwable]): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.catching(t.splice) + ) + + def catchingLevel(c: LoggerContext)(level: c.Expr[Level], t: c.Expr[Throwable]): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.catching(level.splice, t.splice) + ) + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4668ce28/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 4c14d5d..ba02437 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 @@ -559,4 +559,32 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar { verify(f.mockLogger, never).traceExit(any[Message], any[AnyRef]) } + test("throwing") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.throwing(cause) + verify(f.mockLogger).throwing(eqv(cause)) + } + + test("throwing with level") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.throwing(Level.INFO, cause) + verify(f.mockLogger).throwing(eqv(Level.INFO), eqv(cause)) + } + + test("catching") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.catching(cause) + verify(f.mockLogger).catching(eqv(cause)) + } + + test("catching with level") { + val f = fixture + val logger = Logger(f.mockLogger) + logger.catching(Level.INFO, cause) + verify(f.mockLogger).catching(eqv(Level.INFO), eqv(cause)) + } + } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4668ce28/log4j-samples/scala-api/src/main/scala/org/apache/logging/log4j/scalasample/LoggingApp.scala ---------------------------------------------------------------------- diff --git a/log4j-samples/scala-api/src/main/scala/org/apache/logging/log4j/scalasample/LoggingApp.scala b/log4j-samples/scala-api/src/main/scala/org/apache/logging/log4j/scalasample/LoggingApp.scala index f00b9ee..a62620b 100644 --- a/log4j-samples/scala-api/src/main/scala/org/apache/logging/log4j/scalasample/LoggingApp.scala +++ b/log4j-samples/scala-api/src/main/scala/org/apache/logging/log4j/scalasample/LoggingApp.scala @@ -1,5 +1,6 @@ package org.apache.logging.log4j.scalasample +import org.apache.logging.log4j.Level import org.apache.logging.log4j.message.MessageFactory2 import org.apache.logging.log4j.scala.Logging @@ -7,6 +8,8 @@ object LoggingApp extends App with Logging { val s1 = "foo" val s2 = "bar" + val t = new RuntimeException("error") + logger.info(s"Hello, world: $s1 $s2") logger.traceEntry() @@ -19,4 +22,10 @@ object LoggingApp extends App with Logging { logger.traceExit(entryMessage, s2) logger.traceExit(logger.delegate.getMessageFactory.asInstanceOf[MessageFactory2].newMessage("bonsai": CharSequence), s2) + logger.throwing(t) + logger.throwing(Level.INFO, t) + + logger.catching(t) + logger.catching(Level.INFO, t) + } \ No newline at end of file