I've started using a generic logback.xml file for my projects which use logging:
<?xml version="1.0"?>
<configuration debug="${log.debug:=false}">
<property resource="logback-style.properties"/>
<appender name="console"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${${log.style:-standard}}</pattern>
</encoder>
</appender>
<root level="${log.level:-warn}">
<appender-ref ref="console"/>
</root>
<include resource="logback-included.xml" optional="true"/>
<contextListener
class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
<jmxConfigurator/>
</configuration>
Some explanation:
- I make use of the substitution
with default
feature to make use of system properties:
log.debug- Setting this to "true" gets logback to log during configuration, default is "false"
log.style- See below
log.level- This adjusts the global log level, default is "warn" so only errors and warnings log
- Reading variables from a property file as a resource lets me externalize them to the classpath, in particular, the log style (see the next item).
- The name
nesting for substitution feature is neat: it lets you use the value of a variable
as the name of another variable. For
log.styleI read a log format string from a properties file, using another property for the key name. - File inclusion let me keep the boilerplate in this example, and the application-specific bits in a separate logback XML file.
- Lastly I add a context listener to hook
java.util.logginginto logback and turn on JMX support. I do these last for some small performance gain.
Here is one example log-style.properties:
standard=%date{yyyy-MM-dd'T'HH:mm:ss.SSS'Z',UTC} %level [%thread] %logger - %message%n
Update:
A handy trick to automatically lower logging to "debug" when "logback.debug" is true, best placed near the top:
<if condition='property("logback.debug").equals("true")'>
<then>
<variable name="log.level" value="debug"/>
</then>
</if>
No comments:
Post a Comment