How to create 2 different ROOT loggers with logback?
Asked Answered
P

2

55

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).

Pleura answered 16/9, 2013 at 12:7 Comment(0)
U
64

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.

Urethra answered 16/9, 2013 at 12:27 Comment(5)
I have <logger name="ch.qos" level="OFF" /> <logger name="org.slf4j" level="OFF" /> and it is still logging in both the appenders configured, how is it possible?Loan
I doubt anyone could help you with as little information as that. If you have a problem to solve, please open a new question, comments are not the place for this.Urethra
It does appear to work, but not only the documentation but also the code shows support for only one root logger, so I suspect some of the functionality of the root logger is being missed. E.g. if you declare 2 root loggers and one has a different level, what is it the default level? Note how the source code creates and initializes a single root logger in the constructor.Dibble
@Dibble the default level will be the last one set. See the maintainer's answer: #41647536Markland
logback has inheritance'ish based on packages...but not by level, at all...Tibbetts
W
2

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>

Weese answered 29/1, 2014 at 11:38 Comment(4)
Well that goes against the documentation: logback.qos.ch/manual/configuration.html#syntax .. " at most one <root> element"Remote
Your configuration is misleading. Your console-debug logs only and only debug level (e.g., not warn) and analogically console-info logs only info level.Nichollenicholls
With double root definition do appenders accumulate? I think according to manual "info", "warn" & "error" level messages will go into both logs (assuming filter is not set for appenders). Am I right?Gifferd
Multiple root tag doesn't give any error. But, it does not work as expected. The second appender receives info messages as well. Only the previous answer is right.Immigration

© 2022 - 2024 — McMap. All rights reserved.