1 logback project ceki gülcü & sébastien pennec. 2 ~ no revolution, only evolution. log4j is...

30
1 Logback project Ceki Gülcü & Sébastien Pennec

Upload: zechariah-venable

Post on 01-Apr-2015

218 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

1

Logback project

Ceki Gülcü & Sébastien Pennec

Page 2: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

2

~

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.

Page 3: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

3

Modular architecture

logback-coreJoran, Status,

Context, pattern parsing logback-classic

developer logging logback-access

container (access) logging

id Components

logback-core

logback-classic logback-access

Page 4: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

4

Access Logging

Definition: Access logThe log generated when a user

accesses a web-page on a web server.

Logback-access integrates seamlessly with Jetty and Tomcat

Page 5: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

5

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.

Page 6: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

6

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)

Page 7: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

7

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>

Page 8: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

8

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>

Page 9: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

9

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>

Page 10: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

10

Is Joran for me?

Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.

Page 11: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

11

Internal error reporting

Who shall guard the guards?

Logback modules cannot use logging to report their own state.

Something more generic is needed.

Page 12: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

12

Errors in action

Internal state available via StatusManager

Exceptions and status messages accompanied by references, i.e. URLs, to external documents

Page 13: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

13

JMX

Logback configuration can be reloaded via JMX

Statistical results exposed via JMX

Page 14: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

14

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,…

Page 15: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

15

Filters, Filters. Filters everywhere

Filters attachable to any Appender Evaluator filters Janino filters for evaluation based on java

expressions TurboFilters for optimized global processing

Page 16: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

16

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>

Page 17: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

17

TurboFilters<turboFilter class="c.q.l.classic.turbo.MDCFilter">

<MDCKey>userid</MDCKey>

<Value>sebastien</Value>

<OnMatch>ACCEPT</OnMatch>

</turboFilter>

Page 18: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

18

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);

Page 19: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

19

Markers for specialized handling

Markers are metadata for logging statements, coloring them for specialized processing

Page 20: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

20

SiftingAppender or the appender-making 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

Page 21: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

21

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>

Page 22: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

22

Tested & Ready

Battery of over 450 unit tests

Tests written concomitantly with the code

Page 23: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

23

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..

Page 24: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

24

logger name abbreviation

Conversion specifier

Displayed logger name

%logger mainPackage.sub.sample.Bar

%logger{15} m.s.sample.Bar

Page 25: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

25

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

Page 26: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

26

Odds and ends II

%() in pattern strings can do magic

%-50(%d %level [%thread]) - %m%n DuplicateMessage filter

Page 27: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

27

Odds and ends II

%() in pattern strings can do magic

%-50(%d %level [%thread]) - %m%n DuplicateMessage filter

Page 28: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

28

Plans for the near future

Finer threading model leading to less contention

Better documentation Eclipse plug-in to visualize your logs

Page 29: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

29

Conclusion

Logback is the unofficial successor of log4j, as the latter is no longer being actively developed.

Page 30: 1 Logback project Ceki Gülcü & Sébastien Pennec. 2 ~ No revolution, only evolution. log4j is no longer being actively developed The same basic plumbing

30

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