
Author: ceki Date: Sat Apr 12 01:18:33 2008 New Revision: 1671 Modified: logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java logback/trunk/logback-site/src/site/pages/manual/mdc.html Log: - correcting documentation and SimpleMDC code, in light of problems reported [1] on the logback mailing list by Daniel King [1] http://www.qos.ch/pipermail/logback-user/2008-April/000427.html Modified: logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java ============================================================================== --- logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java (original) +++ logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java Sat Apr 12 01:18:33 2008 @@ -10,36 +10,37 @@ package chapter7; +import java.net.URL; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; +import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.PatternLayout; +import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.util.Loader; +import ch.qos.logback.core.util.StatusPrinter; public class SimpleMDC { static public void main(String[] args) throws Exception { - // You can put values in the MDC at any time. We first put the - // first name + // You can put values in the MDC at any time. Before anything else + // we put the first name MDC.put("first", "Dorothy"); - // Configure logback - PatternLayout layout = new PatternLayout(); - layout.setPattern("%X{first} %X{last} - %m%n"); - layout.start(); - ConsoleAppender<LoggingEvent> appender = new ConsoleAppender<LoggingEvent>(); - appender.setLayout(layout); - appender.start(); - // cast root logger to c.q.logback.classic.Logger so that we can attach an - // appender to it - ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory - .getLogger("root"); - root.addAppender(appender); - - // get another logger + // configure via the configuration file "chapter7/simpleMDC.xml" + // which ships with the examples + configureViaXML_File(); + + // For educational purposes, the same configuration can + // be accomplished programmatically. + // + // programmaticConfiguration(); + Logger logger = LoggerFactory.getLogger(SimpleMDC.class); - // We now put the last name MDC.put("last", "Parker"); @@ -53,4 +54,38 @@ logger.info("I am not a crook."); logger.info("Attributed to the former US president. 17 Nov 1973."); } + + static void programmaticConfiguration() { + // Configure logback + LoggerContext loggerContext = (LoggerContext) LoggerFactory + .getILoggerFactory(); + loggerContext.shutdownAndReset(); + PatternLayout layout = new PatternLayout(); + layout.setContext(loggerContext); + layout.setPattern("%X{first} %X{last} - %m%n"); + layout.start(); + ConsoleAppender<LoggingEvent> appender = new ConsoleAppender<LoggingEvent>(); + appender.setContext(loggerContext); + appender.setLayout(layout); + appender.start(); + // cast root logger to c.q.logback.classic.Logger so that we can attach + // an appender to it + ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory + .getLogger("root"); + root.addAppender(appender); + } + + static void configureViaXML_File() { + LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); + try { + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(lc); + lc.shutdownAndReset(); + URL url = Loader.getResourceByTCL("chapter7/simpleMDC.xml"); + configurator.doConfigure(url); + } catch (JoranException je) { + StatusPrinter.print(lc); + } + } + } Modified: logback/trunk/logback-site/src/site/pages/manual/mdc.html ============================================================================== --- logback/trunk/logback-site/src/site/pages/manual/mdc.html (original) +++ logback/trunk/logback-site/src/site/pages/manual/mdc.html Sat Apr 12 01:18:33 2008 @@ -112,29 +112,16 @@ public class SimpleMDC { static public void main(String[] args) throws Exception { - // You can put values in the MDC at any time. We first put the - // first name - <b>MDC.put("first", "Dorothy");</b> - - // Configure logback - PatternLayout layout = new PatternLayout(); - layout.setPattern("%X{first} %X{last} - %m%n"); - layout.start(); - ConsoleAppender<LoggingEvent> appender = new ConsoleAppender<LoggingEvent>(); - appender.setLayout(layout); - appender.start(); - - // cast root logger to c.q.logback.classic.Logger so that we can attach an - // appender to it - ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory - .getLogger("root"); - root.addAppender(appender); - // get another logger - Logger logger = (Logger)LoggerFactory.getLogger(SimpleMDC.class); + // You can put values in the MDC at any time. Before anything else + // we put the first name + MDC.put("first", "Dorothy"); + [ SNIP ] + + Logger logger = LoggerFactory.getLogger(SimpleMDC.class); // We now put the last name - <b>MDC.put("last", "Parker");</b> + MDC.put("last", "Parker"); // The most beautiful two words in the English language according // to Dorothy Parker: @@ -146,22 +133,42 @@ logger.info("I am not a crook."); logger.info("Attributed to the former US president. 17 Nov 1973."); } + + [ SNIP ] + }</pre></div> - <p> - The main method starts by associating the value <em>Dorothy</em> with - the key <em>first</em> in the <code>MDC</code>. You can place as many - value/key associations in the <code>MDC</code> as you wish. - Multiple insertions with the same key will overwrite older values. - The code then proceeds to configure logback. - Note the usage of the <em>%X</em> specifier within the - <code>PatternLayout</code> conversion pattern. The <em>%X</em> - conversion specifier is employed twice, once for the key <em>first</em> - and once for the key <em>last</em>. After configuring the root logger, - the code associates the value <em>Parker</em> with the key <em>last</em>. - It then invokes the logger twice with different messages. - The code finishes by setting the <code>MDC</code> to different values - and issuing several logging requests. Running SimpleMDC yields: + <p>The main method starts by associating the value + <em>Dorothy</em> with the key <em>first</em> in the + <code>MDC</code>. You can place as many value/key associations in + the <code>MDC</code> as you wish. Multiple insertions with the + same key will overwrite older values. The code then proceeds to + configure logback.</p> + + <p>For the sake of consiceness, we have the omitted the code that + configures logback with the configuration file <a + href="http://tinyurl.com/4gy542">simpleMDC.xml</a>. Here is the + relevant section from that file. + </p> + + <p class="source"><appender name="CONSOLE" + class="ch.qos.logback.core.ConsoleAppender"> <layout + class="ch.qos.logback.classic.PatternLayout"> + <Pattern><b>%X{first} %X{last}</b> - %m%n</Pattern> + </layout> </appender></p> + + + + <p>Note the usage of the <em>%X</em> specifier within the + <code>PatternLayout</code> conversion pattern. The <em>%X</em> + conversion specifier is employed twice, once for the key named + <em>first</em> and once for the key named <em>last</em>. After + obtaining a logger corresponding to <code>SimpleMDC.class</code>, + the code associates the value <em>Parker</em> with the key named + <em>last</em>. It then invokes the logger twice with different + messages. The code finishes by setting the <code>MDC</code> to + different values and issuing several logging requests. Running + SimpleMDC yields: </p> <div class="source"><pre>Dorothy Parker - Check enclosed. @@ -170,11 +177,11 @@ Richard Nixon - Attributed to the former US president. 17 Nov 1973.</pre></div> - <p> - The <code>SimpleMDC</code> application illustrates how logback layouts, - if configured appropriately, automatically output <code>MDC</code> information. - Moreover, the information placed into the <code>MDC</code> can be used by - multiple logger invocations. + <p>The <code>SimpleMDC</code> application illustrates how logback + layouts, if configured appropriately, can automatically output + <code>MDC</code> information. Moreover, the information placed + into the <code>MDC</code> can be used by multiple logger + invocations. </p> <h3>Advanced Use</h3>