Create a separate trait for filter with marker

to ensure binary compatibility

Signed-off-by: Gaël Bréard <gael.breard@orange.com>
This commit is contained in:
Gaël Bréard 2019-03-05 16:03:39 +01:00
parent fee21cf320
commit aa74afb8b1
4 changed files with 38 additions and 18 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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
/**

View file

@ -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) =