Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create 2 different ROOT loggers with logback?

I'm happily using SLF4J with logback and use 2 appenders for the ROOT logger.

<root level="DEBUG">     <appender-ref ref="STDOUT" />     <appender-ref ref="FILE" /> </root> 

How could we have different log-levels for both appenders? I still need all ROOT-logger messages.

  • DEBUG-level for STDOUT
  • INFO-level for FILE

All log's need to be part of the output (so the ROOT logger is needed).

like image 667
Dimitri Dewaele Avatar asked Sep 16 '13 12:09

Dimitri Dewaele


People also ask

What is root level in Logback?

"Root" level does not restrict levels of other loggers, it merely sets the default. So <root level="INFO"> and <logger name="some.name" level="DEBUG"> are perfectly suitable together, and you don't need to relax the "root" level. So both examples should log on debug level for logger named com. myproject.

Does Logback use SLF4J?

Logback natively implements the SLF4J API.

What is a Logback Appender?

The Logback architecture is comprised of three classes: Logger, Appender, and Layout. A Logger is a context for log messages. This is the class that applications interact with to create log messages. Appenders place log messages in their final destinations. A Logger can have more than one Appender.


2 Answers

You will not ever have more than one root-logger, so your question is a bit misleading. What you are looking for is how to fine-tune which events each of the appenders does log.

And for that, you add a ThresholdFilter to each of the appenders:

http://logback.qos.ch/manual/filters.html#thresholdFilter

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">   <level>INFO</level> </filter> 

Configure level INFO for the FILE-appender and DEBUG for STDOUT.

Edit: I have to dispute the other answer's charge that this one is wrong: Yes, you can have more than one root-element in the configuration. That does not create more than one root-logger though, which was what the question's title asks for. Also, the logback manual states under http://logback.qos.ch/manual/configuration.html#syntax (highlighting mine):

Nevertheless, the very basic structure of the configuration file can be described as, < configuration > element, followed by zero or more < appender > elements, followed by zero or more < logger > elements, followed by at most one < root > element.

It might work, but at the very least it's against convention.

like image 120
sheltem Avatar answered Oct 21 '22 14:10

sheltem


You can have multiple root elements, each with an associated logging level and an appender-ref (I'm working with logback.version>1.0.13) In this case you also have to put a FILTER inside yours appenders, like that:

<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">     <resetJUL>true</resetJUL> </contextListener>  <!-- To enable JMX Management --> <jmxConfigurator/>  <appender name="console-info" class="ch.qos.logback.core.ConsoleAppender">    <filter class="ch.qos.logback.classic.filter.LevelFilter">      <level>INFO</level>      <onMatch>ACCEPT</onMatch>      <onMismatch>DENY</onMismatch>   </filter>   <encoder>         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>   </encoder> </appender>    <appender name="console-debug" class="ch.qos.logback.core.ConsoleAppender">   <filter class="ch.qos.logback.classic.filter.LevelFilter">      <level>DEBUG</level>      <onMatch>ACCEPT</onMatch>      <onMismatch>DENY</onMismatch>   </filter>   <encoder>       <pattern>[%d{ddMMMyyyy HH:mm:ss.SS}]%-5level %logger{45} - %msg %n</pattern>   </encoder> </appender>   <root level="info">     <appender-ref ref="console-info"/> </root> <root level="debug">     <appender-ref ref="console-debug"/> </root> 

like image 26
m.piunti Avatar answered Oct 21 '22 15:10

m.piunti