在 Akka 中使用 logback

Using logback with Akka

我在 Akka (2.3.9) 应用程序中使用 Logback 时遇到一些问题。为了记录到标准输出并在日志文件中,我指定了 logback.xml 和所有附加程序:

    <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds" debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <encoder>
            <pattern>%X{akkaTimestamp} %-5level %logger{36} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./akka.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./akka.log.%d{yyyy-MM-dd-HH}</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%X{akkaTimestamp} %-5level %logger{36} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="proc" level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </logger>

    <logger name="akka.actor" level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </logger>

    <root level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

之后我使用登录我的 Actor:

val log = Logging(context.system, classOf[MyActor])

override def receive: Receive = {
  case MyEvent(event) =>
     log.info("Message received for processing.")
}

问题是,在 SBT 中一切正常:我可以在创建的日志文件中看到所有日志事件。

当我用 sbt-assembly 制作 JAR 文件并启动这个 jar 文件时 (java -jar event-assembly-0.1.1-SNAPSHOT.jar)。该应用程序将日志条目写入 STDOUT 但不写入文件!

我不知道该如何解决。我尝试使用 "lsof",java 进程没有打开的日志文件。

我不知道出了什么问题,但您可以执行以下操作:

  • 检查你的 logback.xml 是否在 jar 文件中
  • 尝试使用 java -Dlogback.configurationFile=/path/to/logback.xml -jar event-assembly-0.1.1-SNAPSHOT.jar[ 启动您的应用程序=15=]

所以,我是怎么发现的,sbt-assembly 从结果 jar 中删除了一些 logback-binaries(这是我的 Build.scala 中的设置)。在我更改 MergingStrategy 以保留结果构建中的第一个 logback 事件后,一切正常。