Search code examples
javaspringlogbackslf4j

Logback - same logger for two different levels


I have configuring my logback-spring.xml file the following way:

    <logger name="com.mypack" level="info" additivity="false">
        <appender-ref ref="CLOUD" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="STDOUT" />
    </logger>
     
    <logger name="TrackingLog" level="info" additivity="false">
        <appender-ref ref="CLOUD" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="STDOUT" />
    </logger>
     
     
    <logger name="PostBackLog" level="info" additivity="false">
        <appender-ref ref="CLOUD" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="STDOUT" />
    </logger>
     
    <root level="error" includeLocation="true">
       <appender-ref ref="CLOUD" />
       <appender-ref ref="RollingFile" />
       <appender-ref ref="STDOUT" />
    </root>

I want also that level "trace" for com.mypack will behave the same way as "info". So far I didn't have any success with it. I need something like

    <logger name="com.mypack" level="info" additivity="false">
        <appender-ref ref="CLOUD" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="STDOUT" />
    </logger>
     
    <logger name="com.mypack" level="trace" additivity="false">
        <appender-ref ref="CLOUD" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="STDOUT" />
    </logger>

    <logger name="TrackingLog" level="info" additivity="false">
        <appender-ref ref="CLOUD" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="STDOUT" />
    </logger>
     
     
    <logger name="PostBackLog" level="info" additivity="false">
        <appender-ref ref="CLOUD" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="STDOUT" />
    </logger>
     
    <root level="error" includeLocation="true">
       <appender-ref ref="CLOUD" />
       <appender-ref ref="RollingFile" />
       <appender-ref ref="STDOUT" />
    </root>

appreciate for any help.


Solution

  • Use if conditions to set different logging level.

    The first, You need to Janino library for conditional logging. Reference janino and add this in your pom.xml

    <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
      <version>3.1.6</version>
     </dependency>
    

    The second, Add environment variable to set to different logging level.

    For example

    your_key=your_value
    

    Finally, Add if conditions

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30">
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <target>System.out</target>
            <encoder>
                <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{100} - %msg%n</pattern>
            </encoder>
        </appender>
        
        <!-- if exists your key in environment variable -->
        <if condition='isNull("your_key")'>
            <!-- if your key exists -->
            <then>
                <logger name="com.mypack" level='debug'>
                    <appender-ref ref="STDOUT" />
                </logger>
            </then>
            <!-- if your key doesn't exist -->
            <else>
                <logger name="com.mypack" level='info'>
                    <appender-ref ref="STDOUT" />
                </logger>
            </else>
        </if>
    </configuration>