Transcript logback

Logback project
Ceki Gülcü & Sébastien Pennec
1
~
No revolution, only evolution.
 log4j is no longer being actively
developed
 The same basic plumbing only
done better.
 Faster, smaller, higher gas
mileage, and generally more
bang for the buck.

2
Modular architecture
id Components
logback-core
Joran, Status,
Context, pattern parsing
 logback-classic
developer logging
 logback-access
container (access) logging

logback-core
logback-classic
logback-access
3
Access Logging

Definition: Access log
The log generated when a user
accesses a web-page on a web server.

Logback-access integrates seamlessly
with Jetty and Tomcat
4
logback-classic implements SLF4J
Logback offers a native implementation of
the SLF4J API => Logback exposes its
logging API through SLF4J.
 If you are using logback, you are actually
using SLF4J
 SLF4J can delegate to log4j, logback,
java.util.logging or JCL
 SLF4J can bridge log4j, JCL and j.u.l.

5
Joran: a bowl of fresh air
Given rules (patterns & actions) it can
configure any object.
 Joran can learn new rules on the fly.
 With its implicit rules, you don’t even
have to write rules.
 It can do partial replay.
 It is generic (can be used in your own
projects)

6
Configuration example:
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logFile.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>
logFile.%d{yyyy-MM-dd}.log.zip
</FileNamePatter>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
</Pattern>
</layout>
</appender>
7
Logback-access configuration
<appender name="FILE"
class="c.q.l.c.r.RollingFileAppender">
<File>access.log"</File>
<rollingPolicy
class="c.q.l.c.r.TimeBasedRollingPolicy">
<FileNamePattern>
access.%d{yyyy-MM-dd}.log.zip
</FileNamePattern>
</rollingPolicy>
<layout class="c.q.l.access.PatternLayout">
<Pattern">combined</Pattern">
</layout>
</appender>
8
Another example:
<testShell name="test1">
<period>5 minutes</period>
<!-- we need to configure a totally new test
object for each run of the test -->
<test class="com.wombat.myTest">
<DataSource class="c.w.JNDIDS">
<url>jndi://com.wombat/ds"</url>
</DataSource>
</test>
<testShell>
<testShell name="test2">
<period>60 seconds</period>
<test class="com.wombat.myTest2">
<file>c:/wombat/foo.properties</file>
</test>
</testShell>
9
Is Joran for me?

Joran is ideal for building frameworks
which need to support arbitrary userdeveloped plug-ins.
10
Internal error reporting

Who shall guard the guards?

Logback modules cannot use logging to
report their own state.

Something more generic is needed.
11
Errors in action

Internal state available via StatusManager

Exceptions and status messages
accompanied by references, i.e. URLs, to
external documents
12
JMX

Logback configuration can be reloaded via
JMX

Statistical results exposed via JMX
13
Documentation

Major area of effort.

Complete manual, with over 150 pages of
documentation, is available for free

A short introduction to access logging with
logback-access and Jetty

javadoc, FAQ, error codes,…
14
Filters, Filters. Filters everywhere
Filters attachable to any Appender
 Evaluator filters
 Janino filters for evaluation based on java
expressions
 TurboFilters for optimized global processing

15
EvaluatorFilter & Janino
<appender name="CYCLIC"
class="c.q.l.core.read.CyclicBufferAppender">
<filter class="c.q.l.core.filter.EvaluatorFilter">
<evaluator name="loggingTaskEval">
<expression>
logger.contains("LoggingTask") &&
message.contains("Howdydy-diddly-ho") &&
(timeStamp-loggerContext.getBirthTime()) >= 20000
</expression>
</evaluator>
<OnMatch>DENY</OnMatch>
</filter>
<MaxSize>512</MaxSize>
</appender>
16
TurboFilters
<turboFilter
class="c.q.l.classic.turbo.MDCFilter">
<MDCKey>userid</MDCKey>
<Value>sebastien</Value>
<OnMatch>ACCEPT</OnMatch>
</turboFilter>
17
Parameterized logging
Integer entry = new Interger(50);
logger.debug("The entry is "+entry+".");
can be optimized as:
if(logger.isDebugEnabled()) {
logger.debug("The entry is "+entry+".");
}
or better yet:
logger.debug("The entry is {}.", entry);
18
Markers for specialized handling

Markers are metadata for logging
statements, coloring them for specialized
processing
19
SiftingAppender or the appendermaking appender
Sift logging according to runtime attributes
 E.g. separate logs according to user
sessions, so that the log file generated by
every user go into distinct log files, one log
file per user.
 Works with any appender, not just
FileAppender

20
SiftingAppender (continued)
<appender name="SIFT"
class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<Key>userid</Key>
<DefaultValue>unknown</DefaultValue>
</discriminator>
<sift>
<appender name="FILE-${userid}"
class="ch.qos.logback.core.FileAppender">
<File>${userid}.log</File>s
<Append>false</Append>
<layout>
<Pattern>%d %level %mdc %logger - %msg%n</Pattern>
</layout>
</appender>
</sift>
</appender>
21
Tested & Ready

Battery of over 450 unit tests

Tests written concomitantly with the code
22
Package versions in stack traces
java.lang.NullPointerException
at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
etc..
23
logger name abbreviation
Conversion
specifier
Displayed logger name
%logger
mainPackage.sub.sample.Bar
%logger{15}
m.s.sample.Bar
24
Odds and ends




RollingFileAppender automatic file compression the
background
FileAppender and RollingFileAppender allow for the
same log file to be written to by instances located in
different JVMs
10 fold improvement in the speed of transporting
logging events over the wire
SMTPAppender now does TLS and SSL, subject
line in outgoing email now based on PatternLayout
25
Odds and ends II
%() in pattern strings can do magic
%-50(%d %level [%thread]) - %m%n
 DuplicateMessage filter

26
Odds and ends II
%() in pattern strings can do magic
%-50(%d %level [%thread]) - %m%n
 DuplicateMessage filter

27
Plans for the near future



Finer threading model leading to less
contention
Better documentation
Eclipse plug-in to visualize your logs
28
Conclusion

Logback is the unofficial successor of
log4j, as the latter is no longer being
actively developed.
29
Questions?
read the docs at http://logback.qos.ch/
 study the code at http://svn.qos.ch
 write to us at [email protected]
 file a bug report at http://jira.qos.ch/
 chat with us at irc.freenode.net#qos
 talk to us at +41 21 312 32 26

30