Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overriding logback configurations

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>
like image 898
Mr.Q Avatar asked May 14 '14 10:05

Mr.Q


People also ask

What is Logback configuration?

The Logback architecture is comprised of three classes: Logger, Appender, and Layout. A Logger is a context for log messages. This is the class that applications interact with to create log messages. Appenders place log messages in their final destinations.

Is Log4j2 better than Logback?

Log4j, Logback, and Log4j2 are good logging frameworks that are broadly used. So which one should you use? I recommend using Log4j2 because it's the fastest and most advanced of the three frameworks. Logback is still a good option, if performance is not your highest priority.

Does slf4j use Logback?

Native implementation of slf4j is logback, thus using both as logger framework implies zero memory and computational overhead.


2 Answers

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.

like image 59
Hank Avatar answered Sep 19 '22 21:09

Hank


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> 
like image 39
tiago Avatar answered Sep 19 '22 21:09

tiago