Конфигурация и использование журнала Akka SLF4J
Я выполнил следующие шаги, чтобы попытаться настроить ведение журнала для моего приложения akka:
-
создал файл application.conf и поместил его в src/main/resources. Это выглядит так:
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = "INFO"
}
-
создал файл logback.xml и поместил его в src/main/resources. Это выглядит так:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.fileappender">
<File>./logs/akka.log</File>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE" />
</root>
</configuration>
-
добавил в файл сборки .scala sbt следующее:
libraryDependencies += "com.typesafe.akka" % "akka-slf4j" % "2.0.3",
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.9"
lazy val logback = "ch.qos.logback" % "logback-classic" % "1.0.9"
-
попытался выполнить этот код:
import akka.event.Logging
val log = Logging(context.system, this)
log.info("...")
Все, что я получаю, это стандартное ведение журнала, без создания файла журнала с журналами.
Я пропустил шаг? Или неправильно сконфигурировано?
Ответы
Ответ 1
С помощью этой компоновки я могу использовать akka.event.Logging, не нужно указывать экземпляр SLF4J.
(протестировано 13 декабря 2013 г.)
Я запускаю ведение журнала и ведение журнала в файл.
Чтобы доказать, что это не встроенный регистратор, я изменил его на% X {akkaTimestamp}, как описано здесь:
http://doc.akka.io/docs/akka/snapshot/scala/logging.html
build.sbt
library dependencies: (Akka version 2.2.3)
...
"com.typesafe.akka" %% "akka-slf4j" % "2.2.3"
"ch.qos.logback" % "logback-classic" % "1.0.9"
...
SRC/главная/ресурсы/application.conf
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "INFO"
}
SRC/главная/ресурсы/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>log/akka.log</file>
<append>false</append>
<encoder>
<pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern>
</encoder>
</appender>
<logger name="akka" level="INFO" />
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
Эта компоновка работает, когда я использую микширование ActorLogging, а также создаю журнал непосредственно:
import akka.event.Logging
val log = Logging(context.system, classOf[NameOfYourActor])
log.info("good luck!")
Ответ 2
Я тоже столкнулся с этой проблемой, но в моем случае это не относится к classpath.
Я заменил akka.event.Logging с com.typesafe.scalalogging.slf4j.Logging и работает как шарм!
my logback.xml(в разделе main/resource):
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/filename.log</file>
<encoder>
<pattern>%date %level %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<maxIndex>10</maxIndex>
<FileNamePattern>logs/filename.log.%i.gz</FileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>20MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="info">
<appender-ref ref="FILE" />
</root>
</configuration>
my pom.xml:
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>scalalogging-slf4j_2.10</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
и в коде:
import com.typesafe.scalalogging.slf4j.Logging
class LoggingService extends Actor with Logging {
// use logger.info() etc.
}
(не использовал application.conf)
Ответ 3
Единственное, что я изменил в вашей настройке, - это добавить адаптер weiglewilczek slf4j.
У меня есть следующая настройка, которая работает нормально:
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = DEBUG
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>log/app.%d{dd-MM-yyyy}.log</fileNamePattern>
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d [%thread] [%class] %5p - %m%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
trait test extends com.weiglewilczek.slf4s.Logging {
def logIt() {
logger.info("this logs fine")
}
}