wake-up-neo.com

Akka SLF4J Logback-Konfiguration und Verwendung

Ich habe die folgenden Schritte ausgeführt, um die Protokollierung für meine Akka-Anwendung zu versuchen und zu konfigurieren:

  • eine application.conf-Datei erstellt und in src/main/resources gespeichert. Es sieht aus wie: 

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

  • eine logback.xml-Datei erstellt und in src/main/resources gespeichert. Es sieht aus wie:

    <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>
    
  • folgendes wurde meiner .scala sbt-Builddatei hinzugefügt:


    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"
     

  • hat versucht, diesen Code zu protokollieren:

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

Ich bekomme nur die Standardausgabeprotokollierung, keine Protokolldateierstellung mit den Protokollen. 

Habe ich einen Schritt verpasst? Oder etwas falsch konfiguriert?

25
Apple Pie

Mit dieser Anordnung kann ich ein akka.event.Logging verwenden, ohne dass eine SLF4J-Instanz angegeben werden muss.

(getestet am 13. Dezember 2013)

Ich bekomme Konsolenprotokollierung und Protokollierung in einer Datei ..__ Um zu beweisen, dass es sich nicht um eine integrierte Protokollfunktion handelt, habe ich% X {akkaTimestamp} wie hier beschrieben eingefügt:

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>

Diese Anordnung funktioniert, wenn ich ein ActorLogging-Mixin verwende und auch direkt ein Logging erstellt:

import akka.event.Logging

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

log.info("good luck!")
24
reggoodwin

Ich bin auch auf dieses Problem gestoßen, aber in meinem Fall ging es nicht um Klassenpfad.

Ich habe akka.event.Logging durch com.typesafe.scalalogging.slf4j.Logging ersetzt und es funktioniert wie ein Zauber!

meine logback.xml (unter 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>

mein 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>

und im Code:

import com.typesafe.scalalogging.slf4j.Logging

class LoggingService extends Actor with Logging {
  // use logger.info() etc.
}

(hat application.conf nicht verwendet)

4
some some

versuchen Sie es mit dieser application.conf:

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

Ich habe auch bemerkt, dass Sie wahrscheinlich einen falschen Klassennamen in Ihrer Logback-Konfigurationsdatei für die Datei appender ..__ haben. Sie haben <appender name="FILE" class="ch.qos.logback.core. fileappender">, aber es sollte <appender name="FILE" class="ch.qos.logback.core.FileAppender"> sein.

Ein anderes Problem kann der Pfad zur Datei sein. Versuchen Sie, den absoluten Dateipfad anstelle von relativ zu verwenden. <file>/absolute/path/testFile.log</file>

Sie können auch versuchen, die Logback-Version in 1.2.3 zu ändern. Hier sind akka-Dokumente zum Konfigurieren von sl4j: link

1
Kirill Yankov

Das einzige, was ich in Ihrem Setup ändern würde, ist das Hinzufügen des weiglewilczek-Adapters .

Ich habe das folgende Setup gut funktioniert:

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")
  }
}
1
iwein