From aa74afb8b1101fe598f8763e4d1864bf0441539a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Br=C3=A9ard?= Date: Tue, 5 Mar 2019 16:03:39 +0100 Subject: [PATCH] Create a separate trait for filter with marker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit to ensure binary compatibility Signed-off-by: Gaël Bréard --- .../internal/adapter/LoggerAdapterImpl.scala | 13 ++++---- .../main/scala/akka/actor/ActorSystem.scala | 11 +++++-- .../src/main/scala/akka/event/Logging.scala | 30 ++++++++++++++----- .../scala/akka/event/slf4j/Slf4jLogger.scala | 2 +- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/internal/adapter/LoggerAdapterImpl.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/internal/adapter/LoggerAdapterImpl.scala index 1622d11838..db92150d4a 100644 --- a/akka-actor-typed/src/main/scala/akka/actor/typed/internal/adapter/LoggerAdapterImpl.scala +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/internal/adapter/LoggerAdapterImpl.scala @@ -7,7 +7,7 @@ package akka.actor.typed.internal.adapter import akka.actor.typed.{ LogMarker, Logger } import akka.annotation.InternalApi import akka.event.Logging._ -import akka.event.{ LoggingBus, LoggingFilter, LogMarker ⇒ UntypedLM } +import akka.event.{ LoggingBus, LoggingFilter, LoggingFilterWithMarker, LogMarker ⇒ UntypedLM } import akka.util.OptionVal import scala.collection.JavaConverters._ @@ -358,18 +358,17 @@ private[akka] abstract class AbstractLogger extends Logger { * INTERNAL API */ @InternalApi -private[akka] final class LoggerAdapterImpl(bus: LoggingBus, logClass: Class[_], logSource: String, loggingFilter: LoggingFilter) extends AbstractLogger { +private[akka] final class LoggerAdapterImpl(bus: LoggingBus, logClass: Class[_], logSource: String, loggingFilter: LoggingFilterWithMarker) extends AbstractLogger { override def isErrorEnabled = loggingFilter.isErrorEnabled(logClass, logSource) override def isWarningEnabled = loggingFilter.isWarningEnabled(logClass, logSource) override def isInfoEnabled = loggingFilter.isInfoEnabled(logClass, logSource) override def isDebugEnabled = loggingFilter.isDebugEnabled(logClass, logSource) - override def isErrorEnabled(marker: LogMarker): Boolean = loggingFilter.isErrorEnabled(logClass,logSource,marker.asInstanceOf[UntypedLM]) - override def isWarningEnabled(marker: LogMarker): Boolean = loggingFilter.isWarningEnabled(logClass,logSource,marker.asInstanceOf[UntypedLM]) - override def isInfoEnabled(marker: LogMarker): Boolean = loggingFilter.isInfoEnabled(logClass,logSource,marker.asInstanceOf[UntypedLM]) - override def isDebugEnabled(marker: LogMarker): Boolean = loggingFilter.isDebugEnabled(logClass,logSource,marker.asInstanceOf[UntypedLM]) - + override def isErrorEnabled(marker: LogMarker): Boolean = loggingFilter.isErrorEnabled(logClass, logSource, marker.asInstanceOf[UntypedLM]) + override def isWarningEnabled(marker: LogMarker): Boolean = loggingFilter.isWarningEnabled(logClass, logSource, marker.asInstanceOf[UntypedLM]) + override def isInfoEnabled(marker: LogMarker): Boolean = loggingFilter.isInfoEnabled(logClass, logSource, marker.asInstanceOf[UntypedLM]) + override def isDebugEnabled(marker: LogMarker): Boolean = loggingFilter.isDebugEnabled(logClass, logSource, marker.asInstanceOf[UntypedLM]) override def withMdc(mdc: Map[String, Any]): Logger = { val mdcAdapter = new LoggerAdapterImpl(bus, logClass, logSource, loggingFilter) diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index bad3107780..5611ceb857 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -9,7 +9,7 @@ import java.util.concurrent._ import java.util.concurrent.atomic.AtomicReference import com.typesafe.config.{ Config, ConfigFactory } -import akka.event._ +import akka.event.{ LoggingFilterWithMarker, _ } import akka.dispatch._ import akka.japi.Util.immutableSeq import akka.actor.dungeon.ChildrenContainer @@ -652,7 +652,7 @@ abstract class ExtendedActorSystem extends ActorSystem { * Filter of log events that is used by the LoggingAdapter before * publishing log events to the eventStream */ - def logFilter: LoggingFilter + def logFilter: LoggingFilterWithMarker /** * For debugging: traverse actor hierarchy and make string representation. @@ -775,9 +775,14 @@ private[akka] class ActorSystemImpl( val eventStream = new EventStream(this, DebugEventStream) eventStream.startStdoutLogger(settings) - val logFilter: LoggingFilter = { + val logFilter: LoggingFilterWithMarker = { val arguments = Vector(classOf[Settings] → settings, classOf[EventStream] → eventStream) dynamicAccess.createInstanceFor[LoggingFilter](LoggingFilter, arguments).get + if (logFilter.isInstanceOf[LoggingFilterWithMarker]) { + logFilter + } else { + new LoggingFilterWithMarkerWrapper(logFilter) + } } private[this] val markerLogging = new MarkerLoggingAdapter(eventStream, getClass.getName + "(" + name + ")", this.getClass, logFilter) diff --git a/akka-actor/src/main/scala/akka/event/Logging.scala b/akka-actor/src/main/scala/akka/event/Logging.scala index 79eea06485..6e2e3a734c 100644 --- a/akka-actor/src/main/scala/akka/event/Logging.scala +++ b/akka-actor/src/main/scala/akka/event/Logging.scala @@ -1340,10 +1340,6 @@ trait LoggingAdapter { */ trait LoggingFilter { // for backward-compatibility reason implementation of method without marker only must work - def isErrorEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isErrorEnabled(logClass, logSource) - def isWarningEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isWarningEnabled(logClass, logSource) - def isInfoEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isInfoEnabled(logClass, logSource) - def isDebugEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isDebugEnabled(logClass, logSource) def isErrorEnabled(logClass: Class[_], logSource: String): Boolean def isWarningEnabled(logClass: Class[_], logSource: String): Boolean @@ -1351,12 +1347,32 @@ trait LoggingFilter { def isDebugEnabled(logClass: Class[_], logSource: String): Boolean } +trait LoggingFilterWithMarker extends LoggingFilter { + def isErrorEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isErrorEnabled(logClass, logSource) + + def isWarningEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isWarningEnabled(logClass, logSource) + + def isInfoEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isInfoEnabled(logClass, logSource) + + def isDebugEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean = isDebugEnabled(logClass, logSource) +} + +class LoggingFilterWithMarkerWrapper(loggingFilter: LoggingFilter) extends LoggingFilterWithMarker { + override def isErrorEnabled(logClass: Class[_], logSource: String): Boolean = loggingFilter.isErrorEnabled(logClass, logSource) + + override def isWarningEnabled(logClass: Class[_], logSource: String): Boolean = loggingFilter.isWarningEnabled(logClass, logSource) + + override def isInfoEnabled(logClass: Class[_], logSource: String): Boolean = loggingFilter.isInfoEnabled(logClass, logSource) + + override def isDebugEnabled(logClass: Class[_], logSource: String): Boolean = loggingFilter.isDebugEnabled(logClass, logSource) +} + /** * Default [[LoggingFilter]] that uses the logLevel of the `eventStream`, which * initial value is defined in configuration. The logLevel `eventStream` can be * changed while the system is running. */ -class DefaultLoggingFilter(logLevel: () ⇒ Logging.LogLevel) extends LoggingFilter { +class DefaultLoggingFilter(logLevel: () ⇒ Logging.LogLevel) extends LoggingFilterWithMarker { def this(settings: Settings, eventStream: EventStream) = this(() ⇒ eventStream.logLevel) @@ -1463,7 +1479,7 @@ class MarkerLoggingAdapter( override val bus: LoggingBus, override val logSource: String, override val logClass: Class[_], - loggingFilter: LoggingFilter) + loggingFilter: LoggingFilterWithMarker) extends BusLogging(bus, logSource, logClass, loggingFilter) { // TODO when breaking binary compatibility, these marker methods should become baked into LoggingAdapter itself @@ -1704,7 +1720,7 @@ final class DiagnosticMarkerBusLoggingAdapter( override val bus: LoggingBus, override val logSource: String, override val logClass: Class[_], - loggingFilter: LoggingFilter) + loggingFilter: LoggingFilterWithMarker) extends MarkerLoggingAdapter(bus, logSource, logClass, loggingFilter) with DiagnosticLoggingAdapter /** diff --git a/akka-slf4j/src/main/scala/akka/event/slf4j/Slf4jLogger.scala b/akka-slf4j/src/main/scala/akka/event/slf4j/Slf4jLogger.scala index ba9c50477e..2d5b8119a7 100644 --- a/akka-slf4j/src/main/scala/akka/event/slf4j/Slf4jLogger.scala +++ b/akka-slf4j/src/main/scala/akka/event/slf4j/Slf4jLogger.scala @@ -136,7 +136,7 @@ class Slf4jLogger extends Actor with SLF4JLogging with RequiresMessageQueue[Logg * backend configuration (e.g. logback.xml) to filter log events before publishing * the log events to the `eventStream`. */ -class Slf4jLoggingFilter(settings: ActorSystem.Settings, eventStream: EventStream) extends LoggingFilter { +class Slf4jLoggingFilter(settings: ActorSystem.Settings, eventStream: EventStream) extends LoggingFilterWithMarker { def isErrorEnabled(logClass: Class[_], logSource: String) = (eventStream.logLevel >= ErrorLevel) && Logger(logClass, logSource).isErrorEnabled def isWarningEnabled(logClass: Class[_], logSource: String) =