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 основные проблемы в вашем проекте:
Ваш
logback.xml
неправильно отформатирован. Должно начинаться с<configuration>
и заканчивается</configuration>
Ваш
build.sbt
есть проблема. При импортеlogback-classic
Вы должны удалитьTest
флаг из этой линии. В противном случае вы можете использовать эту библиотеку только вtest
классы.Кроме того, я рекомендую вам использовать последние версии
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
,
Надеюсь это поможет!