Search code examples
javascalalogginglogbackslf4j

Logback does not write to 3rd party logging service


I'm setting up more complex logging then a simple console output. Logback writes logs really well via ConsoleAppender. But when I add extra RollbarAppender it does not work for it.

Here is an example of logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration >
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%highlight([%level]) - [%date] - [%logger]  %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="ROLLBAR" class="com.rollbar.logback.RollbarAppender">
        <accessToken>VERY_SECRET_TOKEN</accessToken>
        <encoder>
            <pattern>%highlight([%level]) - [%date] - [%logger]  %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="akka" level="ERROR" additivity="false">
        <appender-ref ref="ROLLBAR" />
    </logger>
    <logger name="slick" level="ERROR"/>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

Meanwhile this configuration works fine and sends logs to the 3rd party logging service, but doesn't write to the console :(

<?xml version="1.0" encoding="UTF-8"?>
<configuration >
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%highlight([%level]) - [%date] - [%logger]  %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="ROLLBAR" class="com.rollbar.logback.RollbarAppender">
        <accessToken>VERY_SECRET_TOKEN</accessToken>
        <encoder>
            <pattern>%highlight([%level]) - [%date] - [%logger]  %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="akka" level="INFO" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="slick" level="ERROR"/>

    <root level="ERROR">
        <appender-ref ref="ROLLBAR" />
    </root>

</configuration>

So I'm confused. How to make logback work in this way:

INFO level events write to the console

ERROR level events write to the console + ROLLBAR


Solution

  • The solution was pretty simple. <filter> tag solved the issue: Its logging level overrides logging level of the <root> tag

    <appender name="RollBar" class="com.rollbar.logback.RollbarAppender">
      <accessToken> VERY_SECRET_TOKEN </accessToken>
      <environment>PROD</environment>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>ERROR</level>
        </filter>
    </appender>
        ...
    <root level="INFO">
      <appender-ref ref="CONSOLE" />
      <appender-ref ref="RollBar" />
    </root>