2017-09-21 10 views
0

J'ai essayé les étapes ci-dessous pour configurer la journalisation pour mon système akka:Akka slf4j ne fonctionne pas

1.Created à la fois fichier application.conf et logback.xml et les mettre dans le répertoire src/main/resources.
fichier 2.application.conf ressemble à: -

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

fichier 3.logback.xml ressemble à: -

<?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 construire des dépendances : -

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.Après la construction du fichier jar, j'ai vérifié que les fichiers application.conf et logback.xml sont présents à l'intérieur. Donc, je ne pense pas que ce soit un problème de chemin de classe.
7. Mon acteur se mélange au trait ActorLogging. Mais quand je cours le fichier jar je ne suis pas capable de voir les journaux

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

S'il vous plaît, aidez ici. Je ne suis pas en mesure figure sur la question

Répondre

1

Après un rapide coup d'œil, je l'ai vu 2 problèmes principaux de votre projet:

  1. Votre logback.xml est mal formaté. Il devrait commencer par <configuration> et se terminer par </configuration>

  2. Votre build.sbt a un problème. Lors de l'importation logback-classic, vous devez supprimer le drapeau Test de cette ligne. Sinon, vous ne pouvez utiliser cette bibliothèque que dans les classes test. En outre, je vous recommande d'utiliser les dernières versions de akka-slf4j_2.11 et logback-classic. Dans ce cas, cela ne fait pas de mal mais s'en tenir aux meilleures pratiques, utilisez les versions les plus récentes.

Voici la version corrigée de votre projet:

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" 

    } 

} 

Avec cette configuration, vous devriez être en mesure d'exécuter Main.scala et voir le journal Message received dans les deux std out et Log file.

Espérons que cela aide!

+0

Avec le changement de sbt ci-dessus, il échoue lors de la construction du fichier jar. [erreur] (*: assembly) dédupliquer: contenu de fichier différent trouvé dans le suivant: [erreur] /Users/deepak/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic1. 1.7.jar: org/slf4j/impl/StaticLoggerBinder.class [erreur] /Users/deepak/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar:org/slf4j /impl/StaticLoggerBinder.class [erreur] Dédupliquer: contenu de fichier différent trouvé dans le suivant: – Deepakkumar

+0

Je n'ai pas eu une telle exception. Si vous avez des bibliothèques supplémentaires qui ont leurs propres fichiers 'logback.xml' dans votre' build.sbt', elles peuvent causer un tel conflit. Dans ce cas, vous devez définir une «stratégie de fusion». Jetez un oeil à ce [cas] (https://stackoverflow.com/questions/30446984/spark-sbt-assembly-deduplicate-different-file-contents-found-in-the-followi) Mais je recommande fortement en utilisant [sbt-native-packager] (https://github.com/sbt/sbt-native-packager) pour la construction. Vous ne faites pas face à ce genre de problèmes avec cela. – fcat

+0

@ user3156383 cette erreur suggère que vous avez 2 backend slf4j dans votre arbre de dépendance: logback et slf4j-log4j12. Vous ne pouvez en avoir qu'un seul. En supposant que vous voulez vous déconnecter, vous pouvez utiliser https://github.com/jrudolph/sbt-dependency-graph pour savoir d'où vient la dépendance de slf4-log4j12. –