Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Akka SLF4J logback configuration and usage

I have done the following steps to try and configure logging for my akka application:

  • created an application.conf file and placed it in src/main/resources. It looks like:

         akka {        event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]        loglevel = "INFO"     } 
  • created a logback.xml file and placed it in src/main/resources. It looks like:

    <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> 
  • added the following to my .scala sbt build file:


    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"
  • attempted this code to log:

         import akka.event.Logging
    val log = Logging(context.system, this) log.info("...")

All I am getting is standard output logging, no log file creation with the logs.

Have I missed a step ? Or misconfigured something?

like image 764
Apple Pie Avatar asked Jan 04 '13 01:01

Apple Pie


2 Answers

With this arrangement I can use an akka.event.Logging, no need to specify SLF4J instance.

(tested 13 Dec 2013)

I get console logging and logging to a file. To prove this is not built-in logger I changed to include %X{akkaTimestamp} as explained here:

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/main/resources/application.conf

akka {   loggers = ["akka.event.slf4j.Slf4jLogger"]   loglevel = "INFO" } 

src/main/resources/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> 

This arrangement works when I use an ActorLogging mixin and also create a Logging directly:

import akka.event.Logging  val log = Logging(context.system, classOf[NameOfYourActor])  log.info("good luck!") 
like image 99
reggoodwin Avatar answered Sep 22 '22 06:09

reggoodwin


I came across this problem too but in my case it wasn't a matter of classpath.

I replaced akka.event.Logging with com.typesafe.scalalogging.slf4j.Logging and it works like a charm!

my logback.xml (under 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> 

and in the code:

import com.typesafe.scalalogging.slf4j.Logging  class LoggingService extends Actor with Logging {   // use logger.info() etc. } 

(didn't use application.conf)

like image 36
some some Avatar answered Sep 22 '22 06:09

some some