配置回退以写入不同的日志文件

Sou*_*nta 7 logging scala logback akka

我有一个有多个演员的演员系统.Actor由一组固定的域分组.目前我只登录一个大日志文件,该文件交错来自属于不同域的不同参与者的日志.

如何配置回退,以便每个actor都写入自己的.log文件.另外,与写入单个文件相比,写入不同的日志文件会对性能产生影响吗?

Vis*_*ohn 6

你需要的是一个带有基于Actor/Actor系统的鉴别器的SiftingAppender.
在logback.xml中提供以下配置

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator class="com.abc.ActorDomainBasedDiscriminator"/>
<sift>
    <appender name="FILE-${actorDomain}" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <file>app-${actorDomain}.log</file>
...
Run Code Online (Sandbox Code Playgroud)

此配置将导致创建日志文件,如'app-Domain1.log','app-Domain2.log'等...

定义一个ActorDomainBasedDiscriminator类

import ch.qos.logback.classic.spi.LoggingEvent
import ch.qos.logback.core.sift.Discriminator
import ch.qos.logback.core.spi.ContextAwareBase

class ActorDomainBasedDiscriminator extends ContextAwareBase with Discriminator[LoggingEvent] {
  private val Key = "actorDomain";

  @volatile
  private var started = false;

  def getDiscriminatingValue(event: LoggingEvent) = {
    val loggerName = event.getLoggerName
    if(loggerName.startsWith("Domain"))
      loggerName
    else event.getLevel.toString
  }

 def getKey: String = Key

 …

 } 
Run Code Online (Sandbox Code Playgroud)

现在在这样的Actor类中创建记录器......

   class Actor1 extends Actor {

      val logger = LoggerFactory.getLogger("Domain1")
      ....


    class Actor2 extends Actor {

      val logger = LoggerFactory.getLogger("Domain2")
      ....

  class Actor3 extends Actor {
      val logger = LoggerFactory.getLogger("Domain1")
      ...
Run Code Online (Sandbox Code Playgroud)

您可以参考此链接以获取鉴别器示例

http://www.nurkiewicz.com/2013/04/siftingappender-logging-different.html