1 / 30

Logback project

Logback project. Ceki Gülcü & S é bastien Pennec. ~ . 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. Modular architecture. logback-core

wan
Download Presentation

Logback project

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 only done better. • Faster, smaller, higher gas mileage, and generally more bang for the buck.

  3. Modular architecture • logback-core Joran, Status, Context, pattern parsing • logback-classic developer logging • logback-access container (access) logging

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

  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.

  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)

  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>

  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>

  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>

  10. Is Joran for me? • Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.

  11. Internal error reporting • Who shall guard the guards? • Logback modules cannot use logging to report their own state. • Something more generic is needed.

  12. Errors in action • Internal state available via StatusManager • Exceptions and status messages accompanied by references, i.e. URLs, to external documents

  13. JMX • Logback configuration can be reloaded via JMX • Statistical results exposed via JMX

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

  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

  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>

  17. TurboFilters <turboFilter class="c.q.l.classic.turbo.MDCFilter"> <MDCKey>userid</MDCKey> <Value>sebastien</Value> <OnMatch>ACCEPT</OnMatch> </turboFilter>

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

  19. Markers for specialized handling • Markers are metadata for logging statements, coloring them for specialized processing

  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

  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>

  22. Tested & Ready • Battery of over 450 unit tests • Tests written concomitantly with the code

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

  24. logger name abbreviation

  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

  26. Odds and ends II • %() in pattern strings can do magic %-50(%d %level [%thread]) - %m%n • DuplicateMessage filter

  27. Odds and ends II • %() in pattern strings can do magic %-50(%d %level [%thread]) - %m%n • DuplicateMessage filter

  28. Plans for the near future • Finer threading model leading to less contention • Better documentation • Eclipse plug-in to visualize your logs

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

  30. Questions? • read the docs at http://logback.qos.ch/ • study the code at http://svn.qos.ch • write to us at logback-user@qos.ch • 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

More Related