Overriding logback configurations

36,286

Solution 1

I don't think that you can overwrite logback.xml-definitions from an included file.

But I have an approach that solves your question regarding overriding the root-logger-level, using variable substitution with default values:

logback.xml

<configuration>
  <include file="includedFile.xml" />

  <!-- STDOUT appender stuff -->

  <root level="${root.level:-DEBUG}">
    <appender-ref ref="STDOUT" />
  </root>
<configuration>

includedFile.xml

<included>

  <!-- override the default value; or comment out to leave it at default -->
  <property name="root.level" value="INFO" />

</included>

With that concept, I've even been able to control the output to multiple appenders from the included file:

logback.xml

<configuration>
  <include file="includedFile.xml" />

  <!-- STDOUT appender stuff -->

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>${file.level:-ALL}</level>
    </filter>
    <file>/path/to/logfeil.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>${syslog.level:-OFF}</level>
    </filter>
    <syslogHost>localhost</syslogHost>
    <facility>${syslog.facility:-LOCAL1}</facility>
    <suffixPattern>${syslog.pattern:-[%thread] %logger{36} - %msg}</suffixPattern>
   </appender>

  <logger name="my.package" level="${logging.level:-INFO}" additivity="false">
    <appender-ref ref="FILE" />
    <appender-ref ref="SYSLOG" />
  </logger>

  <root level="${root.level:-DEBUG}">
    <appender-ref ref="STDOUT" />
  </root>
<configuration>

And in the includedFile.xml I can control if, and at what level message shall pass through the appenders FILE and SYSLOG, setting the properties file.level, syslog.level and of course logging.level.

Solution 2

I had a similar problem to which this answer seems the best approach.

In my case, I needed to override the included file to completely turn off one of the appenders.

Using the a variable for the log level value, one can change it to OFF.

<included>
  (...)
  <root level="${root.level.console:-DEBUG}">
    <appender-ref ref="CONSOLE" />
  </root>
  <root level="${root.level.file:-DEBUG}">
    <appender-ref ref="FILE" />
  </root>
</included>

As stated in http://logback.qos.ch/manual/configuration.html#rootElement

<configuration>
  <include resource="base.xml" />
  (...)
  <property name="root.level.console" value="OFF" />
</configuration>
Share:
36,286
Mr.Q
Author by

Mr.Q

Updated on November 13, 2020

Comments

  • Mr.Q
    Mr.Q over 3 years

    Is there any way that we can override the logback configurations? I know that we define the logback configurations in file named logback.xml (usually stored in the path src/main/resources) and I know that by using <include> tag we can set an external file to be added to logback.xml just like below:

    <configuration>
    
    <!--<include url="file:///d:/ServerConfig.xml"/>-->
    <include file="${outPut}/ServerConfig.xml"/>
    
    
    <logger name="Server" LEVEL="DEBUG">
        <appender-ref ref="FILEOUT" />
    </logger>
    
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <!--<appender-ref ref="FILEOUT" />-->
    </root>
    
    </configuration>
    

    But what if I want to override this default configuration? For example set the root logger level to INFO.

    Here is the included file:

    <included>
    
    <!-- <property file="d:/ServerSysVar.properties"/>-->
    <property file="${outPut}/ServerSysVar.properties"/>
    
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    
    
    <appender name="FILEOUT" class="ch.qos.logback.core.FileAppender">
        <file>${Sys_Location}/Serverfile4.log</file>
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %class{36}.%M %L CLIENT_PORT:%X{ClientPort}- %msg%n</pattern>
        </encoder>
    </appender>
    
    
    <logger name="Service" LEVEL="DEBUG">
        <appender-ref ref="FILEOUT" />
    </logger>
    
     <root>
        <appender-ref ref="STDOUT" />
       <!-- <appender-ref ref="FILEOUT" />-->
    </root>
    
    </included>