Акка slf4j не работает

Я попытался выполнить следующие шаги для настройки ведения журнала для моей системы akka:

1.Создал файлы application.conf и logback.xml и поместил их в каталог src/main/resources.
2.Файл application.conf выглядит так:

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

3.logback.xml файл выглядит так: -

    <?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 build dependencies:-

    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.После сборки jar-файла я проверил наличие в нем файлов application.conf и logback.xml. Так что я не думаю, что это какая-то проблема пути к классам.
7. Мой актор смешивается с трейтом ActorLogging. Но когда я запускаю файл jar, я не могу видеть журналы

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

Пожалуйста, помогите здесь. не могу разобраться в вопросе


person dks551    schedule 21.09.2017    source источник


Ответы (1)


После беглого просмотра я увидел 2 основные проблемы в вашем проекте:

  1. Ваш logback.xml имеет неправильный формат. Он должен начинаться с <configuration> и заканчиваться на </configuration>

  2. У вашего build.sbt проблема. При импорте logback-classic вы должны удалить флаг Test из этой строки. В противном случае вы могли бы использовать эту библиотеку только в test классах.

  3. Кроме того, я рекомендую вам использовать последние версии akka-slf4j_2.11 и logback-classic. В данном случае это не навредит, но придерживайтесь лучших практик, используйте самые свежие версии.

Вот исправленная версия вашего проекта:

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"

   }

 }

С этими конфигурациями вы сможете запустить Main.scala и увидеть журнал Message received как в std out, так и в Log file.

Надеюсь это поможет!

person fcat    schedule 21.09.2017
comment
С указанным выше изменением sbt происходит сбой при создании файла jar. [ошибка] (*: сборка) дедупликация: найдено другое содержимое файла в следующем: [ошибка] /Users/deepak/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic1.1.7.jar :org/slf4j/impl/StaticLoggerBinder.class [ошибка] /Users/deepak/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar:org/slf4j/impl/StaticLoggerBinder .class [ошибка] дедупликация: найдено другое содержимое файла в следующем: - person dks551; 21.09.2017
comment
У меня не было такого исключения. Если у вас есть дополнительные библиотеки, у которых есть свои logback.xml файлы в вашем build.sbt, они могут вызвать такой конфликт. В этом случае вы должны определить файл merge strategy. Взгляните на этот кейс. Но я бы настоятельно рекомендовал использовать для сборки sbt-native-packager. С ним вы не столкнетесь с такими проблемами. - person fcat; 22.09.2017
comment
@ user3156383 эта ошибка предполагает, что у вас есть 2 бэкэнда slf4j в вашем дереве зависимостей: logback и slf4j-log4j12. Вы можете иметь только один. Предполагая, что вы хотите войти в систему, вы можете использовать github.com/jrudolph/sbt-dependency-graph чтобы узнать, откуда берется зависимость от slf4-log4j12. - person Arnout Engelen; 22.09.2017