2
votes

I've defined my logback.xml as:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

    <jmxConfigurator />

    <appender name="ROOT_FILE_APPENDER"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <fieldNames>
                <timestamp>timestamp</timestamp>
                <version>[ignore]</version>
                <levelValue>[ignore]</levelValue>
            </fieldNames>
        </encoder>
        <file>root.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>root.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>$100MB</maxFileSize>
            <totalSizeCap>1GB</totalSizeCap>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
    </appender>

    <appender name="basic-text" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%X{Logging-CorrelationId} %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <file>text.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>text.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>1GB</totalSizeCap>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
    </appender>

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

    <logger name="it.pkg.testpkg.service" additivity="true" level="INFO">
        <appender-ref ref="basic-text"/>
    </logger>

</configuration>

Please notice that the "root" logger level has been set to "ERROR" and the other logger level has been set to "INFO" with additivity=true.

My java class has code that looks like:

private static final Logger LOGGER = LoggerFactory.getLogger(it.pkg.testpkg.service.EchoService.class);

Now, the issue is, when I do a logging as:

LOGGER.info("Test Log");

The log entry goes in both the log files, even though, the root logger level has been set to "ERROR". However, the moment, I get rid of "it.pkg.testpkg.service" logger (by commenting it out or deleting it), the entry stops going into root logger. I'm not really sure what's going on here.

For now, I've found a temporary solution by adding below entry in "ROOT_FILE_APPENDER":

<filter class="ch.qos.logback.classic.filter.LevelFilter">
     <level>ERROR</level>
     <onMatch>ACCEPT</onMatch>
     <onMismatch>DENY</onMismatch>
</filter>

However, I don't want my appender to be tied with a particular log level. Is this a bug with Logback, or, am I doing something wrong here.

I'm using below pom dependencies:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>4.7</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.1.7</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.7</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.21</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
</dependency>

Any help would be appreciated.

Thanks.

1

1 Answers

1
votes

Behavior for ancestor loggers reached through additivity skips log level checks.

If your logger

<logger name="it.pkg.testpkg.service" additivity="true" level="INFO">
    <appender-ref ref="basic-text"/>
</logger>

accepts a log statement

LOGGER.info("Test Log");

then the corresponding output will be sent to its ancestor logger regardless of that logger's log level.

You can always set additivity to false and add the root file appender to your logger

<logger name="it.pkg.testpkg.service" additivity="false" level="INFO">
    <appender-ref ref="basic-text"/>
    <appender-ref ref="ROOT_FILE_APPENDER" />
</logger>