Skip to content

Commit

Permalink
add methods with Marker
Browse files Browse the repository at this point in the history
  • Loading branch information
pekd-ltq committed Oct 8, 2020
1 parent a1fc110 commit d85583b
Show file tree
Hide file tree
Showing 3 changed files with 301 additions and 1 deletion.
22 changes: 21 additions & 1 deletion src/main/scala/org/slf4s/Logger.scala
Original file line number Diff line number Diff line change
@@ -1,18 +1,38 @@
package org.slf4s

import org.slf4j.{Logger => Underlying}
import org.slf4j.{Logger => Underlying, Marker}

class Logger(val underlying: Underlying) {
def trace(msg: String): Unit = macro LoggerMacro.trace
def trace(msg: String, t: Throwable): Unit = macro LoggerMacro.traceT
def trace(marker: Marker, msg: String): Unit = macro LoggerMacro.traceM
def trace(marker: Marker, msg: String, t: Throwable): Unit = macro LoggerMacro.traceMT
def trace(markerOpt: Option[Marker], msg: String): Unit = macro LoggerMacro.traceOM
def trace(markerOpt: Option[Marker], msg: String, t: Throwable): Unit = macro LoggerMacro.traceOMT
def debug(msg: String): Unit = macro LoggerMacro.debug
def debug(msg: String, t: Throwable): Unit = macro LoggerMacro.debugT
def debug(marker: Marker, msg: String): Unit = macro LoggerMacro.debugM
def debug(marker: Marker, msg: String, t: Throwable): Unit = macro LoggerMacro.debugMT
def debug(markerOpt: Option[Marker], msg: String): Unit = macro LoggerMacro.debugOM
def debug(markerOpt: Option[Marker], msg: String, t: Throwable): Unit = macro LoggerMacro.debugOMT
def info(msg: String): Unit = macro LoggerMacro.info
def info(msg: String, t: Throwable): Unit = macro LoggerMacro.infoT
def info(marker: Marker, msg: String): Unit = macro LoggerMacro.infoM
def info(marker: Marker, msg: String, t: Throwable): Unit = macro LoggerMacro.infoMT
def info(markerOpt: Option[Marker], msg: String): Unit = macro LoggerMacro.infoOM
def info(markerOpt: Option[Marker], msg: String, t: Throwable): Unit = macro LoggerMacro.infoOMT
def warn(msg: String): Unit = macro LoggerMacro.warn
def warn(msg: String, t: Throwable): Unit = macro LoggerMacro.warnT
def warn(marker: Marker, msg: String): Unit = macro LoggerMacro.warnM
def warn(marker: Marker, msg: String, t: Throwable): Unit = macro LoggerMacro.warnMT
def warn(markerOpt: Option[Marker], msg: String): Unit = macro LoggerMacro.warnOM
def warn(markerOpt: Option[Marker], msg: String, t: Throwable): Unit = macro LoggerMacro.warnOMT
def error(msg: String): Unit = macro LoggerMacro.error
def error(msg: String, t: Throwable): Unit = macro LoggerMacro.errorT
def error(marker: Marker, msg: String): Unit = macro LoggerMacro.errorM
def error(marker: Marker, msg: String, t: Throwable): Unit = macro LoggerMacro.errorMT
def error(markerOpt: Option[Marker], msg: String): Unit = macro LoggerMacro.errorOM
def error(markerOpt: Option[Marker], msg: String, t: Throwable): Unit = macro LoggerMacro.errorOMT
}

object Logger {
Expand Down
151 changes: 151 additions & 0 deletions src/main/scala/org/slf4s/LoggerMacro.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.slf4s

import scala.reflect.macros.blackbox.Context
import org.slf4j.Marker

private object LoggerMacro {
def trace(c: Context { type PrefixType = Logger })(msg: c.Expr[String]): c.universe.Tree = {
Expand All @@ -15,6 +16,36 @@ private object LoggerMacro {
q"if ($underlying.isTraceEnabled) $underlying.trace($msg, $t)"
}

def traceM(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isTraceEnabled(marker)) $underlying.trace($marker, $msg)"
}

def traceMT(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isTraceEnabled(marker)) $underlying.trace($marker, $msg, $t)"
}

def traceOM(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isTraceEnabled(marker)) $underlying.trace(marker, $msg)
case _ => if ($underlying.isTraceEnabled) $underlying.trace($msg)
}"""
}

def traceOMT(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isTraceEnabled(marker)) $underlying.trace(marker, $msg, $t)
case _ => if ($underlying.isTraceEnabled) $underlying.trace($msg, $t)
}"""
}

def debug(c: Context { type PrefixType = Logger })(msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
Expand All @@ -27,6 +58,36 @@ private object LoggerMacro {
q"if ($underlying.isDebugEnabled) $underlying.debug($msg, $t)"
}

def debugM(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isDebugEnabled(marker)) $underlying.debug($marker, $msg)"
}

def debugMT(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isDebugEnabled(marker)) $underlying.debug($marker, $msg, $t)"
}

def debugOM(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isDebugEnabled(marker)) $underlying.debug(marker, $msg)
case _ => if ($underlying.isDebugEnabled) $underlying.debug($msg)
}"""
}

def debugOMT(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isDebugEnabled(marker)) $underlying.debug(marker, $msg, $t)
case _ => if ($underlying.isDebugEnabled) $underlying.debug($msg, $t)
}"""
}

def info(c: Context { type PrefixType = Logger })(msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
Expand All @@ -39,6 +100,36 @@ private object LoggerMacro {
q"if ($underlying.isInfoEnabled) $underlying.info($msg, $t)"
}

def infoM(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isInfoEnabled(marker)) $underlying.info($marker, $msg)"
}

def infoMT(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isInfoEnabled(marker)) $underlying.info($marker, $msg, $t)"
}

def infoOM(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isInfoEnabled(marker)) $underlying.info(marker, $msg)
case _ => if ($underlying.isInfoEnabled) $underlying.info($msg)
}"""
}

def infoOMT(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isInfoEnabled(marker)) $underlying.info(marker, $msg, $t)
case _ => if ($underlying.isInfoEnabled) $underlying.info($msg, $t)
}"""
}

def warn(c: Context { type PrefixType = Logger })(msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
Expand All @@ -51,6 +142,36 @@ private object LoggerMacro {
q"if ($underlying.isWarnEnabled) $underlying.warn($msg, $t)"
}

def warnM(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isWarnEnabled(marker)) $underlying.warn($marker, $msg)"
}

def warnMT(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isWarnEnabled(marker)) $underlying.warn($marker, $msg, $t)"
}

def warnOM(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isWarnEnabled(marker)) $underlying.warn(marker, $msg)
case _ => if ($underlying.isWarnEnabled) $underlying.warn($msg)
}"""
}

def warnOMT(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isWarnEnabled(marker)) $underlying.warn(marker, $msg, $t)
case _ => if ($underlying.isWarnEnabled) $underlying.warn($msg, $t)
}"""
}

def error(c: Context { type PrefixType = Logger })(msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
Expand All @@ -62,4 +183,34 @@ private object LoggerMacro {
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isErrorEnabled) $underlying.error($msg, $t)"
}

def errorM(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isErrorEnabled(marker)) $underlying.error($marker, $msg)"
}

def errorMT(c: Context { type PrefixType = Logger })(marker: c.Expr[Marker], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"if ($underlying.isErrorEnabled(marker)) $underlying.error($marker, $msg, $t)"
}

def errorOM(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isErrorEnabled(marker)) $underlying.error(marker, $msg)
case _ => if ($underlying.isErrorEnabled) $underlying.error($msg)
}"""
}

def errorOMT(c: Context { type PrefixType = Logger })(markerOpt: c.Expr[Option[Marker]], msg: c.Expr[String], t: c.Expr[Throwable]): c.universe.Tree = {
import c.universe._
val underlying = q"${c.prefix}.underlying"
q"""$markerOpt match {
case Some(marker) => if ($underlying.isErrorEnabled(marker)) $underlying.error(marker, $msg, $t)
case _ => if ($underlying.isErrorEnabled) $underlying.error($msg, $t)
}"""
}
}
129 changes: 129 additions & 0 deletions src/test/scala/org/slf4s/LoggingWithMarkerExampleSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package org.slf4s

import java.util

import org.scalatest.WordSpec
import org.slf4j.Marker
import org.slf4j.helpers.{BasicMarker, BasicMarkerFactory}

class LoggingWithMarkerExampleSpec extends WordSpec with Logging {
"Trace logging with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.trace(marker, "I log, therefore I am")
}

"Trace logging an exception with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.trace(marker, "I log, therefore I am", exception)
}

"Trace logging with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.trace(Some(marker), "I log, therefore I am")
log.trace(None: Option[Marker], "I log, therefore I am")
}

"Trace logging an exception with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.trace(Some(marker), "I log, therefore I am", exception)
log.trace(None: Option[Marker], "I log, therefore I am", exception)
}

"Debug logging with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.debug(marker, "I log, therefore I am")
}

"Debug logging an exception with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.debug(marker, "I log, therefore I am", exception)
}

"Debug logging with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.debug(Some(marker), "I log, therefore I am")
log.debug(None: Option[Marker], "I log, therefore I am")
}

"Debug logging an exception with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.debug(Some(marker), "I log, therefore I am", exception)
log.debug(None: Option[Marker], "I log, therefore I am", exception)
}

"Info logging with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.info(marker, "I log, therefore I am")
}

"Info logging an exception with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.info(marker, "I log, therefore I am", exception)
}

"Info logging with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.info(Some(marker), "I log, therefore I am")
log.info(None: Option[Marker], "I log, therefore I am")
}

"Info logging an exception with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.info(Some(marker), "I log, therefore I am", exception)
log.info(None: Option[Marker], "I log, therefore I am", exception)
}

"Warn logging with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.warn(marker, "I log, therefore I am")
}

"Warn logging an exception with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.warn(marker, "I log, therefore I am", exception)
}

"Warn logging with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.warn(Some(marker), "I log, therefore I am")
log.warn(None: Option[Marker], "I log, therefore I am")
}

"Warn logging an exception with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.warn(Some(marker), "I log, therefore I am", exception)
log.warn(None: Option[Marker], "I log, therefore I am", exception)
}

"Error logging with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.error(marker, "I log, therefore I am")
}

"Error logging an exception with a marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.error(marker, "I log, therefore I am", exception)
}

"Error logging with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
log.error(Some(marker), "I log, therefore I am")
log.error(None: Option[Marker], "I log, therefore I am")
}

"Error logging an exception with an optional marker should work" in {
val marker: Marker = new BasicMarkerFactory().getMarker("MyMarker")
val exception = new RuntimeException("foo")
log.error(Some(marker), "I log, therefore I am", exception)
log.error(None: Option[Marker], "I log, therefore I am", exception)
}
}

0 comments on commit d85583b

Please sign in to comment.