You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/08/28 15:11:38 UTC

[14/50] logging-log4j2 git commit: Fix flow logging macros

Fix flow logging macros


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/0ab01565
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0ab01565
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0ab01565

Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext
Commit: 0ab01565a91eb24e8150d3c41c87746a80bf7cd7
Parents: bce8794
Author: Mikael St�ldal <mi...@magine.com>
Authored: Wed Jun 29 20:25:13 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Wed Jun 29 20:27:32 2016 +0200

----------------------------------------------------------------------
 .../org/apache/logging/log4j/scala/Logger.scala | 36 +++-----
 .../logging/log4j/scala/LoggerMacro.scala       | 29 ++++++-
 .../apache/logging/log4j/scala/LoggerTest.scala | 90 ++++++++++++++++++--
 .../org/apache/logging/log4j/scala/Logger.scala | 31 +++----
 .../logging/log4j/scala/LoggerMacro.scala       | 29 ++++++-
 .../apache/logging/log4j/scala/LoggerTest.scala | 90 ++++++++++++++++++--
 6 files changed, 245 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0ab01565/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 8fe926c..5fa2cb7 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
@@ -60,7 +60,8 @@ object Logger {
   * Since this wrapper is implemented with macros, the String construction and method invocations
   * will only occur when debug logging is enabled.
   */
-class Logger private(val delegate: ExtendedLogger) { // TODO extends AnyVal ?
+class Logger private(val delegate: ExtendedLogger) {
+  // TODO extends AnyVal ?
 
   private final val FQCN = classOf[Logger].getName
 
@@ -431,15 +432,14 @@ class Logger private(val delegate: ExtendedLogger) { // TODO extends AnyVal ?
   def isEnabled(level: Level, marker: Marker): Boolean = delegate.isEnabled(level, marker)
 
 
-  // TODO fix FQCN for flow logging
-
   /**
     * Logs entry to a method. Used when the method in question has no parameters or when the parameters should not be
     * logged.
     *
     * @return The built `EntryMessage`
     */
-  def traceEntry(): EntryMessage = delegate.traceEntry()
+  def traceEntry(): EntryMessage =
+  macro LoggerMacro.traceEntry
 
   /**
     * Logs entry to a method along with its parameters.
@@ -476,7 +476,8 @@ class Logger private(val delegate: ExtendedLogger) { // TODO extends AnyVal ?
   /**
     * Logs exit from a method with no result.
     */
-  def traceExit(): Unit = delegate.traceExit()
+  def traceExit(): Unit =
+  macro LoggerMacro.traceExit
 
   /**
     * Logs exiting from a method with result.
@@ -484,14 +485,16 @@ class Logger private(val delegate: ExtendedLogger) { // TODO extends AnyVal ?
     * @param result The result being returned from the method call
     * @return `result`
     */
-  def traceExit[R](result: R): R = delegate.traceExit(result)
+  def traceExit[R](result: R): R =
+  macro LoggerMacro.traceExitResult[R]
 
   /**
     * Logs exiting from a method with no result.
     *
     * @param entryMessage the `EntryMessage` returned from one of the `traceEntry` methods
     */
-  def traceExit(entryMessage: EntryMessage): Unit = delegate.traceExit(entryMessage)
+  def traceExit(entryMessage: EntryMessage): Unit =
+  macro LoggerMacro.traceExitEntryMessage
 
   /**
     * Logs exiting from a method with result.
@@ -508,7 +511,8 @@ class Logger private(val delegate: ExtendedLogger) { // TODO extends AnyVal ?
     * @param result       The result being returned from the method call
     * @return `result`
     */
-  def traceExit[R](entryMessage: EntryMessage, result: R): R = delegate.traceExit(entryMessage, result)
+  def traceExit[R](entryMessage: EntryMessage, result: R): R =
+  macro LoggerMacro.traceExitEntryMessageResult[R]
 
   /**
     * Logs exiting from a method with result. Allows custom formatting of the result.
@@ -619,22 +623,10 @@ class Logger private(val delegate: ExtendedLogger) { // TODO extends AnyVal ?
     delegate.logMessage(FQCN, level, marker, messageFactory.newMessage(message), cause)
   }
 
-
-  // TODO inline those to get FQCN correct? make macro of other trace methods as well
-
+  // TODO inline this to get FQCN correct
   /** Should normally not be used directly from application code, but needs to be public for access by macros. */
   def traceEntryParams(params: Any*): EntryMessage = {
-    delegate.traceEntry(null, params) // TODO should not do ifEnabled check
-  }
-
-  /** Should normally not be used directly from application code, but needs to be public for access by macros. */
-  def traceEntryMessage(message: Message): EntryMessage = {
-    delegate.traceEntry(message) // TODO should not do ifEnabled check
-  }
-
-  /** Should normally not be used directly from application code, but needs to be public for access by macros. */
-  def traceExitMessageResult[R](message: Message, result: R): Unit = {
-    delegate.traceExit(message, result) // TODO should not do ifEnabled check
+    delegate.traceEntry(null: String, params) // TODO should not do ifEnabled check
   }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0ab01565/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 c915ffb..513dd90 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
@@ -338,6 +338,11 @@ private object LoggerMacro {
     )
 
 
+  def traceEntry(c: LoggerContext)(): c.Expr[EntryMessage] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceEntry()
+    )
+
   def traceEntryParams(c: LoggerContext)(params: c.Expr[Any]*): c.Expr[EntryMessage] = {
     import c.universe._
     val isEnabled = Apply(
@@ -361,17 +366,37 @@ private object LoggerMacro {
   def traceEntryMessage(c: LoggerContext)(message: c.Expr[Message]): c.Expr[EntryMessage] =
     c.universe.reify(
       if (c.prefix.splice.delegate.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)) {
-        c.prefix.splice.traceEntryMessage(message.splice)
+        c.prefix.splice.delegate.traceEntry(message.splice)  // TODO should not do ifEnabled check
       } else {
         null
       }
     )
 
+  def traceExit(c: LoggerContext)(): c.Expr[Unit] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit()
+    )
+
+  def traceExitResult[R: c.WeakTypeTag](c: LoggerContext)(result: c.Expr[R]): c.Expr[R] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit(result.splice)
+    )
+
+  def traceExitEntryMessage(c: LoggerContext)(entryMessage: c.Expr[EntryMessage]): c.Expr[Unit] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit(entryMessage.splice)
+    )
+
+  def traceExitEntryMessageResult[R: c.WeakTypeTag](c: LoggerContext)(entryMessage: c.Expr[EntryMessage], result: c.Expr[R]): c.Expr[R] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit(entryMessage.splice, result.splice)
+    )
+
   def traceExitMessageResult[R: c.WeakTypeTag](c: LoggerContext)(message: c.Expr[Message], result: c.Expr[R]): c.Expr[R] =
     c.universe.reify(
       {
         if (message.splice != null && c.prefix.splice.delegate.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, message.splice, null)) {
-          c.prefix.splice.traceExitMessageResult(message.splice, result.splice)
+          c.prefix.splice.delegate.traceExit(message.splice, result.splice)  // TODO should not do ifEnabled check
         }
         result.splice
       }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0ab01565/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 6595128..d9237a5 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
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.scala
 
-import org.apache.logging.log4j.message.{Message, ParameterizedMessage, ParameterizedMessageFactory}
+import org.apache.logging.log4j.message.{DefaultFlowMessageFactory, EntryMessage, Message, ParameterizedMessage, ParameterizedMessageFactory}
 import org.apache.logging.log4j.spi.{AbstractLogger, ExtendedLogger}
 import org.apache.logging.log4j.{Level, Marker, MarkerManager}
 import org.junit.runner.RunWith
@@ -36,6 +36,7 @@ trait Manager {
 class LoggerTest extends FunSuite with Matchers with MockitoSugar {
 
   val msg = new ParameterizedMessage("msg {}", 17)
+  val entryMsg = new DefaultFlowMessageFactory().newEntryMessage(msg)
   val cseqMsg: CharSequence = new StringBuilder().append("cseq msg")
   val objectMsg = Custom(17)
   val cause = new RuntimeException("cause")
@@ -430,6 +431,22 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar {
   }
 
 
+  test("traceEntry enabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceEntry()
+    verify(f.mockLogger).traceEntry()
+  }
+
+  ignore("traceEntry disabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceEntry()
+    verify(f.mockLogger, never).traceEntry()
+  }
+
   test("traceEntry enabled with params") {
     val f = fixture
     when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true)
@@ -446,13 +463,6 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar {
     verify(f.mockLogger, never).traceEntry(anyString(), any[Array[AnyRef]])
   }
 
-  test("traceEntry without params") {
-    val f = fixture
-    val logger = Logger(f.mockLogger)
-    logger.traceEntry()
-    verify(f.mockLogger).traceEntry()
-  }
-
   test("traceEntry enabled with message") {
     val f = fixture
     when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true)
@@ -469,6 +479,70 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar {
     verify(f.mockLogger, never).traceEntry(any[Message])
   }
 
+  test("traceExit enabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit()
+    verify(f.mockLogger).traceExit()
+  }
+
+  ignore("traceExit disabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit()
+    verify(f.mockLogger, never).traceExit()
+  }
+
+  test("traceExit enabled with result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(result)
+    verify(f.mockLogger).traceExit(result)
+  }
+
+  ignore("traceExit disabled with result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(result)
+    verify(f.mockLogger, never).traceExit(anyString())
+  }
+
+  test("traceExit enabled with entrymessage") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg)
+    verify(f.mockLogger).traceExit(entryMsg)
+  }
+
+  ignore("traceExit disabled with entrymessage") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg)
+    verify(f.mockLogger, never).traceExit(any[EntryMessage])
+  }
+
+  test("traceExit enabled with entrymessage and result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg, result)
+    verify(f.mockLogger).traceExit(entryMsg, result)
+  }
+
+  ignore("traceExit disabled with entrymessage and result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg, result)
+    verify(f.mockLogger, never).traceExit(any[EntryMessage], anyString())
+  }
+
   test("traceExit enabled with message") {
     val f = fixture
     when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0ab01565/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 f58b8df..5fa2cb7 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
@@ -61,6 +61,7 @@ object Logger {
   * will only occur when debug logging is enabled.
   */
 class Logger private(val delegate: ExtendedLogger) {
+  // TODO extends AnyVal ?
 
   private final val FQCN = classOf[Logger].getName
 
@@ -431,15 +432,14 @@ class Logger private(val delegate: ExtendedLogger) {
   def isEnabled(level: Level, marker: Marker): Boolean = delegate.isEnabled(level, marker)
 
 
-  // TODO fix FQCN for flow logging - Break out flow logging logic from AbstractLogger into somethimg accessible from Scala API ?
-
   /**
     * Logs entry to a method. Used when the method in question has no parameters or when the parameters should not be
     * logged.
     *
     * @return The built `EntryMessage`
     */
-  def traceEntry(): EntryMessage = delegate.traceEntry()
+  def traceEntry(): EntryMessage =
+  macro LoggerMacro.traceEntry
 
   /**
     * Logs entry to a method along with its parameters.
@@ -476,7 +476,8 @@ class Logger private(val delegate: ExtendedLogger) {
   /**
     * Logs exit from a method with no result.
     */
-  def traceExit(): Unit = delegate.traceExit()
+  def traceExit(): Unit =
+  macro LoggerMacro.traceExit
 
   /**
     * Logs exiting from a method with result.
@@ -484,14 +485,16 @@ class Logger private(val delegate: ExtendedLogger) {
     * @param result The result being returned from the method call
     * @return `result`
     */
-  def traceExit[R](result: R): R = delegate.traceExit(result)
+  def traceExit[R](result: R): R =
+  macro LoggerMacro.traceExitResult[R]
 
   /**
     * Logs exiting from a method with no result.
     *
     * @param entryMessage the `EntryMessage` returned from one of the `traceEntry` methods
     */
-  def traceExit(entryMessage: EntryMessage): Unit = delegate.traceExit(entryMessage)
+  def traceExit(entryMessage: EntryMessage): Unit =
+  macro LoggerMacro.traceExitEntryMessage
 
   /**
     * Logs exiting from a method with result.
@@ -508,7 +511,8 @@ class Logger private(val delegate: ExtendedLogger) {
     * @param result       The result being returned from the method call
     * @return `result`
     */
-  def traceExit[R](entryMessage: EntryMessage, result: R): R = delegate.traceExit(entryMessage, result)
+  def traceExit[R](entryMessage: EntryMessage, result: R): R =
+  macro LoggerMacro.traceExitEntryMessageResult[R]
 
   /**
     * Logs exiting from a method with result. Allows custom formatting of the result.
@@ -619,19 +623,10 @@ class Logger private(val delegate: ExtendedLogger) {
     delegate.logMessage(FQCN, level, marker, messageFactory.newMessage(message), cause)
   }
 
+  // TODO inline this to get FQCN correct
   /** Should normally not be used directly from application code, but needs to be public for access by macros. */
   def traceEntryParams(params: Any*): EntryMessage = {
-    delegate.traceEntry(null, params) // TODO should not do ifEnabled check
-  }
-
-  /** Should normally not be used directly from application code, but needs to be public for access by macros. */
-  def traceEntryMessage(message: Message): EntryMessage = {
-    delegate.traceEntry(message) // TODO should not do ifEnabled check
-  }
-
-  /** Should normally not be used directly from application code, but needs to be public for access by macros. */
-  def traceExitMessageResult[R](message: Message, result: R): Unit = {
-    delegate.traceExit(message, result) // TODO should not do ifEnabled check
+    delegate.traceEntry(null: String, params) // TODO should not do ifEnabled check
   }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0ab01565/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 440857f..77a0a0c 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
@@ -338,6 +338,11 @@ private object LoggerMacro {
     )
 
 
+  def traceEntry(c: LoggerContext)(): c.Expr[EntryMessage] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceEntry()
+    )
+
   def traceEntryParams(c: LoggerContext)(params: c.Expr[Any]*): c.Expr[EntryMessage] = {
     import c.universe._
     val isEnabled = Apply(
@@ -361,17 +366,37 @@ private object LoggerMacro {
   def traceEntryMessage(c: LoggerContext)(message: c.Expr[Message]): c.Expr[EntryMessage] =
     c.universe.reify(
       if (c.prefix.splice.delegate.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)) {
-        c.prefix.splice.traceEntryMessage(message.splice)
+        c.prefix.splice.delegate.traceEntry(message.splice)  // TODO should not do ifEnabled check
       } else {
         null
       }
     )
 
+  def traceExit(c: LoggerContext)(): c.Expr[Unit] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit()
+    )
+
+  def traceExitResult[R: c.WeakTypeTag](c: LoggerContext)(result: c.Expr[R]): c.Expr[R] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit(result.splice)
+    )
+
+  def traceExitEntryMessage(c: LoggerContext)(entryMessage: c.Expr[EntryMessage]): c.Expr[Unit] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit(entryMessage.splice)
+    )
+
+  def traceExitEntryMessageResult[R: c.WeakTypeTag](c: LoggerContext)(entryMessage: c.Expr[EntryMessage], result: c.Expr[R]): c.Expr[R] =
+    c.universe.reify(
+      c.prefix.splice.delegate.traceExit(entryMessage.splice, result.splice)
+    )
+
   def traceExitMessageResult[R: c.WeakTypeTag](c: LoggerContext)(message: c.Expr[Message], result: c.Expr[R]): c.Expr[R] =
     c.universe.reify(
       {
         if (message.splice != null && c.prefix.splice.delegate.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, message.splice, null)) {
-          c.prefix.splice.traceExitMessageResult(message.splice, result.splice)
+          c.prefix.splice.delegate.traceExit(message.splice, result.splice)  // TODO should not do ifEnabled check
         }
         result.splice
       }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0ab01565/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 6595128..d9237a5 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
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.scala
 
-import org.apache.logging.log4j.message.{Message, ParameterizedMessage, ParameterizedMessageFactory}
+import org.apache.logging.log4j.message.{DefaultFlowMessageFactory, EntryMessage, Message, ParameterizedMessage, ParameterizedMessageFactory}
 import org.apache.logging.log4j.spi.{AbstractLogger, ExtendedLogger}
 import org.apache.logging.log4j.{Level, Marker, MarkerManager}
 import org.junit.runner.RunWith
@@ -36,6 +36,7 @@ trait Manager {
 class LoggerTest extends FunSuite with Matchers with MockitoSugar {
 
   val msg = new ParameterizedMessage("msg {}", 17)
+  val entryMsg = new DefaultFlowMessageFactory().newEntryMessage(msg)
   val cseqMsg: CharSequence = new StringBuilder().append("cseq msg")
   val objectMsg = Custom(17)
   val cause = new RuntimeException("cause")
@@ -430,6 +431,22 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar {
   }
 
 
+  test("traceEntry enabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceEntry()
+    verify(f.mockLogger).traceEntry()
+  }
+
+  ignore("traceEntry disabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceEntry()
+    verify(f.mockLogger, never).traceEntry()
+  }
+
   test("traceEntry enabled with params") {
     val f = fixture
     when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true)
@@ -446,13 +463,6 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar {
     verify(f.mockLogger, never).traceEntry(anyString(), any[Array[AnyRef]])
   }
 
-  test("traceEntry without params") {
-    val f = fixture
-    val logger = Logger(f.mockLogger)
-    logger.traceEntry()
-    verify(f.mockLogger).traceEntry()
-  }
-
   test("traceEntry enabled with message") {
     val f = fixture
     when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true)
@@ -469,6 +479,70 @@ class LoggerTest extends FunSuite with Matchers with MockitoSugar {
     verify(f.mockLogger, never).traceEntry(any[Message])
   }
 
+  test("traceExit enabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit()
+    verify(f.mockLogger).traceExit()
+  }
+
+  ignore("traceExit disabled") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit()
+    verify(f.mockLogger, never).traceExit()
+  }
+
+  test("traceExit enabled with result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(result)
+    verify(f.mockLogger).traceExit(result)
+  }
+
+  ignore("traceExit disabled with result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(result)
+    verify(f.mockLogger, never).traceExit(anyString())
+  }
+
+  test("traceExit enabled with entrymessage") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg)
+    verify(f.mockLogger).traceExit(entryMsg)
+  }
+
+  ignore("traceExit disabled with entrymessage") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg)
+    verify(f.mockLogger, never).traceExit(any[EntryMessage])
+  }
+
+  test("traceExit enabled with entrymessage and result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg, result)
+    verify(f.mockLogger).traceExit(entryMsg, result)
+  }
+
+  ignore("traceExit disabled with entrymessage and result") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false)
+    val logger = Logger(f.mockLogger)
+    logger.traceExit(entryMsg, result)
+    verify(f.mockLogger, never).traceExit(any[EntryMessage], anyString())
+  }
+
   test("traceExit enabled with message") {
     val f = fixture
     when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true)