Akka slf4j не работает

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

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 построить зависимости: -

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

5.Акка версия = "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")  
     }  
    }  

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

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,

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

Другие вопросы по тегам