2017-09-21 4 views
0

ich die folgenden Schritte versucht haben, die Protokollierung für mein akka System zu konfigurieren:Akka slf4j Problem

1.Created beide application.conf und logback.xml Datei und sie im Verzeichnis src/main/resources setzen.
2.application.conf Datei wie folgt aussieht: -

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

3.logback.xml Datei wie folgt aussieht: -

<?xml version="1.0" encoding="UTF-8"?> 

<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>/Users/deepak/work/logs/akka.log</file> 
    <append>true</append> 
    <encoder> 
     <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern> 
    </encoder> 
</appender> 

<logger name="akka" level="DEBUG" /> 

<root level="DEBUG"> 
    <appender-ref ref="CONSOLE"/> 
    <appender-ref ref="FILE"/> 
</root> 


4.sbt Abhängigkeiten zu bauen : -

libraryDependencies += "com.typesafe.akka" % "akka-slf4j_2.11" % "2.4.14" 
    libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Test 

5.Akka Version = "2.4.14"
6.Nachdem die JAR-Datei erstellt wurde, habe ich die Datei application.conf überprüft, und logback.xml-Dateien sind darin enthalten. Also, ich glaube nicht, dass es irgendein Klassenpfadproblem ist.
7.My Schauspieler mischt sich mit dem ActorLogging Merkmal. Aber wenn ich die JAR-Datei ausführen kann ich die Protokolle

import akka.actor.{Actor, ActorLogging} 
    class Reader extends Actor with ActorLogging{ 
    override def receive = { 
     case _ =>log.info("Reader") 
    } 
    } 
nicht sehen

Bitte helfen Sie hier. Ich bin nicht in der Lage herauszufinden, die Ausgabe

Antwort

1

Nach einem kurzen Blick, ich habe zwei Hauptprobleme in Ihrem Projekt gesehen:

  1. Ihre logback.xml ist falsch formatieren. Es sollte mit <configuration> beginnen und enden mit </configuration>

  2. Ihre build.sbt hat ein Problem. Beim Importieren von logback-classic sollten Sie das Flag Test aus dieser Zeile entfernen. Andernfalls können Sie diese Bibliothek nur in den Klassen test verwenden.

  3. Zusätzlich empfehle ich Ihnen, die neuesten Versionen von akka-slf4j_2.11 und logback-classic zu verwenden. In diesem Fall schadet das nicht, aber halten Sie sich an die Best Practices, verwenden Sie die neuesten Versionen.

Hier sind die korrigierte Version des Projekts:

build.sbt

scalaVersion := "2.11.8" 

libraryDependencies += "com.typesafe.akka" % "akka-slf4j_2.11" % "2.5.4" 

//Removed the Test flag 
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.7" 

logback.xml

<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>akka.log</file> 
     <append>true</append> 
     <encoder> 
      <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <logger name="akka" level="DEBUG"/> 

    <root level="DEBUG"> 
     <appender-ref ref="CONSOLE"/> 
     <appender-ref ref="FILE"/> 
    </root> 
</configuration> 

application.conf

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

Reader.scala

import akka.actor.{Actor, ActorLogging} 

class Reader extends Actor with ActorLogging { 

    override def receive = { 
    case _ => log.info("Message received") 
    } 
} 

Main.scala

import akka.actor.{ActorRef, ActorSystem, Props} 

object Main { 
    def main(args: Array[String]): Unit = { 
    implicit val system: ActorSystem = ActorSystem("reader-system") 

    val ref: ActorRef = system.actorOf(Props(new Reader)) 

    //send message to actor 
    ref ! "message" 

    } 

} 

Mit diesen Konfigurationen, sollten Sie in der Lage sein Main.scala laufen und sehen Sie die Message received Protokoll sowohl in std out und Log file.

Hoffe, das hilft!

+0

Mit der obigen sbt Änderung ist es beim Erstellen der JAR-Datei fehlgeschlagen. [Fehler] (*: Assembly) deduplizieren: verschiedene Dateiinhalte im folgenden gefunden: [Fehler] /Users/deepak/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic1. 1.7.jar: org/slf4j/impl/StaticLoggerBinder.class [Fehler] /Users/deepak/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar:org/slf4j /impl/StaticLoggerBinder.class [Fehler] deduplizieren: verschiedene Dateiinhalte im folgenden gefunden: – Deepakkumar

+0

Ich habe eine solche Ausnahme nicht erhalten. Wenn Sie zusätzliche Bibliotheken haben, die ihre 'logback.xml'-Dateien in Ihrem' build.sbt' enthalten, können sie einen solchen Konflikt verursachen. In diesem Fall sollten Sie eine Zusammenführungsstrategie definieren. Werfen Sie einen Blick auf diese [Fall] (https://stackoverflow.com/questions/30446984/spark-sbt-assembly-deduplicate-different-file-content-found-in-the-followi) Aber ich würde dringend empfehlen Verwenden von [sbt-native-packager] (https://github.com/sbt/sbt-native-packager) zum Erstellen. Sie haben keine Probleme damit. – fcat

+0

@ user3156383 dieser Fehler schlägt vor, dass Sie 2 slf4j Backends in Ihrem Abhängigkeitsbaum haben: Logback und Slf4j-Log4j12. Sie können nur einen haben. Angenommen, Sie möchten ein Logback durchführen, können Sie https://github.com/jrudolph/sbt-dependency-graph verwenden, um herauszufinden, woher die Abhängigkeit von slf4-log4j12 stammt. –

Verwandte Themen