Akka SLF4J logback 的配置和使用

27
我已经采取以下步骤尝试配置我的Akka应用程序的日志记录:
  • 创建了一个application.conf文件,并将其放置在src/main/resources中。它看起来像:


    akka { 
      event-handlers = ["akka.event.slf4j.Slf4jEventHandler"] 
      loglevel = "INFO"
    }

  • created a logback.xml file and placed it in src/main/resources. It looks like:

    <configuration>
    
      <appender name="FILE" class="ch.qos.logback.core.fileappender">
        <File>./logs/akka.log</File>
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%-5level] %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="info">
        <appender-ref ref="FILE" />
      </root>
    
    </configuration>
    
  • 我在我的.scala sbt构建文件中添加了以下内容:


    libraryDependencies += "com.typesafe.akka" % "akka-slf4j" % "2.0.3", libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.9" lazy val logback = "ch.qos.logback" % "logback-classic" % "1.0.9"

  • 我尝试使用以下代码进行日志记录:

    
        import akka.event.Logging
    val log = Logging(context.system, this) log.info("...")

  • 但是,我只得到标准输出日志,没有日志文件被创建来保存这些日志。我错过了什么步骤?或者配置错误了吗?


    1
    类路径问题... 我没有在其中放置 src/main/resources。糟糕! - Apple Pie
    感谢您如此简洁地迭代了这些步骤。我认为您唯一遗漏的是回到完整文档的链接:http://doc.akka.io/docs/akka/2.1.2/scala/logging.html - James A Wilson
    2
    苹果派,你是说你的代码里面没有src/main/resources吗?因为我的问题和你一样,我正在使用你的代码,请帮我解决。 - swaheed
    4个回答

    27

    使用这种安排,我可以使用 akka.event.Logging,无需指定 SLF4J 实例。

    (在 2013 年 12 月 13 日测试)

    我可以获得控制台日志和文件日志。 为了证明这不是内置记录器,我更改了 %X{akkaTimestamp} 来包含如此解释的内容:

    http://doc.akka.io/docs/akka/snapshot/scala/logging.html
    

    build.sbt

    library dependencies: (Akka version 2.2.3)
    
    ...
    "com.typesafe.akka" %% "akka-slf4j" % "2.2.3"
    "ch.qos.logback" % "logback-classic" % "1.0.9"
    ...
    

    src/main/resources/application.conf

    akka {
      loggers = ["akka.event.slf4j.Slf4jLogger"]
      loglevel = "INFO"
    }
    

    src/main/resources/logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <target>System.out</target>
            <encoder>
                <pattern>%X{akkaTimestamp} %-5level[%thread] %logger{0} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <appender name="FILE" class="ch.qos.logback.core.FileAppender">
            <file>log/akka.log</file>
            <append>false</append>
            <encoder>
                <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <logger name="akka" level="INFO" />
    
        <root level="DEBUG">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    
    </configuration>
    

    当我使用ActorLogging mixin并直接创建Logging时,这种安排是有效的:

    import akka.event.Logging
    
    val log = Logging(context.system, classOf[NameOfYourActor])
    
    log.info("good luck!")
    

    这行代码 <logger name="akka" level="INFO" /> 控制着日志输出。可以将 name="my-package-name" 替换为所需记录信息的类所属的“my-package-name”。 - anasanjaria

    4

    我也遇到过这个问题,但在我的情况下,它并不是与类路径有关。

    我将 akka.event.Logging 替换为 com.typesafe.scalalogging.slf4j.Logging,现在它完美运行!

    我的 logback.xml(位于 main/resource 下):

    <configuration>
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/filename.log</file>
        <encoder>
          <pattern>%date %level %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <maxIndex>10</maxIndex>
          <FileNamePattern>logs/filename.log.%i.gz</FileNamePattern>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>20MB</maxFileSize>
        </triggeringPolicy>
      </appender>
      <root level="info">
        <appender-ref ref="FILE" />
      </root>
    </configuration>
    

    my pom.xml:

    <dependency>
      <groupId>com.typesafe</groupId>
      <artifactId>scalalogging-slf4j_2.10</artifactId>
      <version>1.0.1</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.0.13</version>
    </dependency>
    

    代码中的内容如下:
    import com.typesafe.scalalogging.slf4j.Logging
    
    class LoggingService extends Actor with Logging {
      // use logger.info() etc.
    }
    

    (没有使用application.conf)


    3

    尝试使用以下application.conf文件:

    akka {
      loggers = ["akka.event.slf4j.Slf4jLogger"]
      loglevel = "DEBUG"
      logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
    }
    

    我注意到你的logback配置文件里面可能有错误的类名。你目前使用的是<appender name="FILE" class="ch.qos.logback.core.fileappender">,但正确的应该是<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    另一个问题可能是文件路径。请尝试使用绝对路径而不是相对路径:<file>/absolute/path/testFile.log</file> 你还可以尝试将logback版本更改为1.2.3。这里是关于sl4j配置的Akka文档:链接

    1

    我会在你的设置中做出唯一的更改,就是添加weiglewilczek slf4j适配器

    我已经成功地使用了以下设置:

    akka {
      event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
      loglevel = DEBUG
    }
    

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>log/app.log</file>
    
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>log/app.%d{dd-MM-yyyy}.log</fileNamePattern>
                <maxHistory>60</maxHistory>
            </rollingPolicy>
    
            <encoder>
                <pattern>%d [%thread] [%class] %5p - %m%n</pattern>
            </encoder>
        </appender>
    
        <root level="INFO">
            <appender-ref ref="FILE"/>
        </root>
    </configuration>
    

    trait test extends com.weiglewilczek.slf4s.Logging {
      def logIt() {
        logger.info("this logs fine")
      }
    }
    

    2
    从 akka-2.2.x 开始,“event-handlers” 被替换为 “loggers”,请参见 http://doc.akka.io/docs/akka/2.2.5/project/migration-guide-2.1.x-2.2.x.html。 - Stefan L

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接