logback-dev
Threads by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 9940 discussions
svn commit: r2044 - in logback-incubator/trunk/logback-as400/src/main/java/ch: . qos qos/logback qos/logback/as400 qos/logback/as400/io qos/logback/as400/print
by noreply.ravn@qos.ch 23 Jan '09
by noreply.ravn@qos.ch 23 Jan '09
23 Jan '09
Author: ravn
Date: Mon Dec 1 14:03:23 2008
New Revision: 2044
Added:
logback-incubator/trunk/logback-as400/src/main/java/ch/
logback-incubator/trunk/logback-as400/src/main/java/ch/qos/
logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/
logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/
logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/io/
logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/io/FixedWidthPrintStream.java
logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/print/
logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/print/QPrintAppender.java
Log:
initial skeletons for QPrintAppender
Added: logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/io/FixedWidthPrintStream.java
==============================================================================
--- (empty file)
+++ logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/io/FixedWidthPrintStream.java Mon Dec 1 14:03:23 2008
@@ -0,0 +1,85 @@
+package ch.qos.logback.as400.io;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+/**
+ * FixedWidthPrintStream is a stream wrapper which ensures that the output does
+ * not get wider than the specified number of columns.
+ *
+ */
+public class FixedWidthPrintStream {
+
+ protected static final int BEFORE_COLUMN_ZERO = -1;
+
+ private String indent = " +";
+ private int wrapColumn = 79;
+ private PrintStream originalStream;
+
+ private PrintStream thisStream;
+ /**
+ * @param originalStream
+ * @param wrapColumn - first column is column 0.
+ * @param indent
+ */
+
+ public PrintStream getStream() {
+ if (thisStream == null) {
+ thisStream = new PrintStream(new OutputStream() {
+
+ // Next char will go in 0
+ int currentColumn = BEFORE_COLUMN_ZERO;
+
+ public void write(int b) {
+ originalStream.write(b);
+ currentColumn = currentColumn + 1;
+
+ if (b == '\n') {
+ currentColumn = BEFORE_COLUMN_ZERO;
+ } else if (currentColumn >= wrapColumn) {
+ originalStream.write('\n');
+ currentColumn = BEFORE_COLUMN_ZERO;
+ for (int i = 0; i < indent.length(); i++) {
+ originalStream.write(indent.charAt(i));
+ currentColumn = currentColumn + 1;
+ }
+ }
+ }
+
+ public void close() {
+ originalStream.close();
+ }
+
+ public void flush() {
+ originalStream.flush();
+ }
+ });
+ }
+ return thisStream;
+ }
+
+ public int getWrapColumn() {
+ return wrapColumn;
+ }
+
+ public void setWrapColumn(int wrapColumn) {
+ this.wrapColumn = wrapColumn;
+ }
+
+ public PrintStream getOriginalStream() {
+ return originalStream;
+ }
+
+ public void setOriginalStream(PrintStream wrappedStream) {
+ this.originalStream = wrappedStream;
+ }
+
+ public String getIndent() {
+ return indent;
+ }
+
+ public void setIndent(String indent) {
+ this.indent = indent;
+ }
+
+}
Added: logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/print/QPrintAppender.java
==============================================================================
--- (empty file)
+++ logback-incubator/trunk/logback-as400/src/main/java/ch/qos/logback/as400/print/QPrintAppender.java Mon Dec 1 14:03:23 2008
@@ -0,0 +1,20 @@
+package ch.qos.logback.as400.print;
+
+import ch.qos.logback.core.AppenderBase;
+
+/**
+ *
+ *
+ */
+public class QPrintAppender extends AppenderBase {
+
+
+
+ @Override
+ protected void append(Object arg0) {
+
+ }
+
+
+
+}
2
1
[JIRA] Created: (LBCLASSIC-103) Accidental incompatible joran syntax for evaluator filters
by Michael Franz (JIRA) 23 Jan '09
by Michael Franz (JIRA) 23 Jan '09
23 Jan '09
Accidental incompatible joran syntax for evaluator filters
----------------------------------------------------------
Key: LBCLASSIC-103
URL: http://jira.qos.ch/browse/LBCLASSIC-103
Project: logback-classic
Issue Type: Bug
Components: joran
Affects Versions: 0.9.14
Reporter: Michael Franz
Assignee: Logback dev list
The release note for 0.9.14 states: "In addition, EvaluatorAction has been modified to accept evaluators of any type and not just instances of JaninoEvaluator."
Firstly: I could not found this documented within the manual.
Secondly:
The examples for evaluator filters within appenders from the manual do no longer work, e.g. logback-examples/src/main/java/chapter6/basicEventEvaluator.xml:
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator name="myEval">
<expression>message.contains("billing")</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</layout>
</appender>
The error message is: |-ERROR in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - No class name attribute in [evaluator]
After adding class="ch.qos.logback.classic.boolex.JaninoEventEvaluator" to the evaluator tag it works. But this should not be required.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
2
1
Author: ceki
Date: Fri Jan 23 14:56:31 2009
New Revision: 2131
Added:
logback/trunk/logback-access/src/test/input/joran/
logback/trunk/logback-access/src/test/input/joran/defaultLayout.xml
logback/trunk/logback-access/src/test/input/joran/smoke.xml
logback/trunk/logback-access/src/test/java/ch/qos/logback/access/TeztConstants.java
logback/trunk/logback-access/src/test/java/ch/qos/logback/access/joran/
logback/trunk/logback-access/src/test/java/ch/qos/logback/access/joran/JoranConfiguratorTest.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java
logback/trunk/logback-classic/src/test/input/joran/sift/defaultLayoutRule.xml
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java
Removed:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/testUtil/StringListAppender.java
Modified:
logback/trunk/logback-access/src/main/java/ch/qos/logback/access/joran/JoranConfigurator.java
logback/trunk/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java
logback/trunk/logback-classic/src/test/input/joran/callerData.xml
logback/trunk/logback-classic/src/test/input/joran/conversionRule/htmlLayout0.xml
logback/trunk/logback-classic/src/test/input/joran/conversionRule/patternLayout0.xml
logback/trunk/logback-classic/src/test/input/joran/evaluatorFilter.xml
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java
Log:
- Moved StringListAppender from logback-classic/src/test to logback-core/src/test since
logback-access uses it as well.
- Added unit tests in relation with default component class mapping rules in Joran.
See also jira issue LBCLASSIC-103
Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/joran/JoranConfigurator.java
==============================================================================
--- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/joran/JoranConfigurator.java (original)
+++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/joran/JoranConfigurator.java Fri Jan 23 14:56:31 2009
@@ -11,12 +11,15 @@
package ch.qos.logback.access.joran;
+import ch.qos.logback.access.PatternLayout;
import ch.qos.logback.access.joran.action.ConfigurationAction;
import ch.qos.logback.access.joran.action.EvaluatorAction;
import ch.qos.logback.access.sift.SiftAction;
+import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.joran.JoranConfiguratorBase;
import ch.qos.logback.core.joran.action.AppenderRefAction;
import ch.qos.logback.core.joran.action.NOPAction;
+import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
import ch.qos.logback.core.joran.spi.Pattern;
import ch.qos.logback.core.joran.spi.RuleStore;
@@ -41,5 +44,10 @@
rs.addRule(new Pattern("configuration/evaluator"), new EvaluatorAction());
}
+ @Override
+ protected void addDefaultNestedComponentRegistryRules(
+ DefaultNestedComponentRegistry registry) {
+ registry.add(AppenderBase.class, "layout", PatternLayout.class);
+ }
}
Added: logback/trunk/logback-access/src/test/input/joran/defaultLayout.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-access/src/test/input/joran/defaultLayout.xml Fri Jan 23 14:56:31 2009
@@ -0,0 +1,13 @@
+<configuration>
+
+ <appender name="STR_LIST"
+ class="ch.qos.logback.core.testUtil.StringListAppender">
+ <!-- the fact that the layout class is not declared tests default component class
+ mapping rules -->
+ <layout>
+ <Pattern>%requestMethod</Pattern>
+ </layout>
+ </appender>
+
+ <appender-ref ref="STR_LIST" />
+</configuration>
\ No newline at end of file
Added: logback/trunk/logback-access/src/test/input/joran/smoke.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-access/src/test/input/joran/smoke.xml Fri Jan 23 14:56:31 2009
@@ -0,0 +1,5 @@
+<configuration>
+
+ <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
+ <appender-ref ref="LIST" />
+</configuration>
\ No newline at end of file
Added: logback/trunk/logback-access/src/test/java/ch/qos/logback/access/TeztConstants.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-access/src/test/java/ch/qos/logback/access/TeztConstants.java Fri Jan 23 14:56:31 2009
@@ -0,0 +1,6 @@
+package ch.qos.logback.access;
+
+public class TeztConstants {
+
+ public static final String TEST_DIR_PREFIX = "src/test/";
+}
Modified: logback/trunk/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java
==============================================================================
--- logback/trunk/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java (original)
+++ logback/trunk/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java Fri Jan 23 14:56:31 2009
@@ -12,9 +12,7 @@
import org.junit.Ignore;
import org.junit.Test;
-import ch.qos.logback.access.dummy.DummyRequest;
-import ch.qos.logback.access.dummy.DummyResponse;
-import ch.qos.logback.access.dummy.DummyServerAdapter;
+import ch.qos.logback.access.dummy.DummyAccessEventBuilder;
import ch.qos.logback.access.joran.JoranConfigurator;
import ch.qos.logback.access.spi.AccessContext;
import ch.qos.logback.access.spi.AccessEvent;
@@ -59,7 +57,7 @@
Appender<AccessEvent> appender = context.getAppender("DB");
for (int i = 0; i < 10; i++) {
- AccessEvent event = createAccessEvent();
+ AccessEvent event = DummyAccessEventBuilder.buildNewAccessEvent();
appender.doAppend(event);
}
@@ -128,13 +126,4 @@
doTest("src/test/input/integration/db/postgresql-with-driver.xml");
}
- private AccessEvent createAccessEvent() {
- DummyRequest request = new DummyRequest();
- DummyResponse response = new DummyResponse();
- DummyServerAdapter adapter = new DummyServerAdapter(request, response);
-
- AccessEvent ae = new AccessEvent(request, response, adapter);
- return ae;
- }
-
}
Added: logback/trunk/logback-access/src/test/java/ch/qos/logback/access/joran/JoranConfiguratorTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-access/src/test/java/ch/qos/logback/access/joran/JoranConfiguratorTest.java Fri Jan 23 14:56:31 2009
@@ -0,0 +1,73 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.access.joran;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.access.TeztConstants;
+import ch.qos.logback.access.dummy.DummyAccessEventBuilder;
+import ch.qos.logback.access.spi.AccessContext;
+import ch.qos.logback.access.spi.AccessEvent;
+import ch.qos.logback.core.joran.spi.JoranException;
+import ch.qos.logback.core.read.ListAppender;
+import ch.qos.logback.core.testUtil.StringListAppender;
+
+public class JoranConfiguratorTest {
+
+ AccessContext context = new AccessContext();
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ void configure(String file) throws JoranException {
+ JoranConfigurator jc = new JoranConfigurator();
+ jc.setContext(context);
+ jc.doConfigure(file);
+ }
+
+ @Test
+ public void smoke() throws Exception {
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/smoke.xml");
+
+ ListAppender<AccessEvent> listAppender = (ListAppender<AccessEvent>) context
+ .getAppender("LIST");
+ AccessEvent event = DummyAccessEventBuilder.buildNewAccessEvent();
+ listAppender.doAppend(event);
+
+ assertEquals(1, listAppender.list.size());
+
+ assertEquals(1, listAppender.list.size());
+ AccessEvent ae = (AccessEvent) listAppender.list.get(0);
+ assertNotNull(ae);
+ }
+
+ @Test
+ public void defaultLayout() throws Exception {
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/defaultLayout.xml");
+ StringListAppender<AccessEvent> listAppender = (StringListAppender<AccessEvent>) context
+ .getAppender("STR_LIST");
+ AccessEvent event = DummyAccessEventBuilder.buildNewAccessEvent();
+ listAppender.doAppend(event);
+ assertEquals(1, listAppender.strList.size());
+ // the result contains a line separator at the end
+ assertTrue(listAppender.strList.get(0).startsWith("testMethod"));
+ }
+}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java Fri Jan 23 14:56:31 2009
@@ -10,8 +10,6 @@
package ch.qos.logback.classic.joran;
-import ch.qos.logback.classic.PatternLayout;
-import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
import ch.qos.logback.classic.joran.action.ConfigurationAction;
import ch.qos.logback.classic.joran.action.ConsolePluginAction;
import ch.qos.logback.classic.joran.action.ContextNameAction;
@@ -23,8 +21,7 @@
import ch.qos.logback.classic.joran.action.RootLoggerAction;
import ch.qos.logback.classic.sift.SiftAction;
import ch.qos.logback.classic.spi.PlatformInfo;
-import ch.qos.logback.core.AppenderBase;
-import ch.qos.logback.core.filter.EvaluatorFilter;
+import ch.qos.logback.classic.util.DefaultNestedComponentRules;
import ch.qos.logback.core.joran.JoranConfiguratorBase;
import ch.qos.logback.core.joran.action.AppenderRefAction;
import ch.qos.logback.core.joran.action.IncludeAction;
@@ -89,10 +86,7 @@
@Override
protected void addDefaultNestedComponentRegistryRules(
DefaultNestedComponentRegistry registry) {
- registry.add(AppenderBase.class, "layout", PatternLayout.class);
- registry
- .add(EvaluatorFilter.class, "evaluator", JaninoEventEvaluator.class);
-
+ DefaultNestedComponentRules.addDefaultNestedComponentRegistryRules(registry);
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java Fri Jan 23 14:56:31 2009
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.sift;
import java.util.Collection;
@@ -5,9 +14,11 @@
import java.util.Map;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.util.DefaultNestedComponentRules;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.joran.action.ActionConst;
import ch.qos.logback.core.joran.action.AppenderAction;
+import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
import ch.qos.logback.core.joran.spi.Pattern;
import ch.qos.logback.core.joran.spi.RuleStore;
import ch.qos.logback.core.sift.SiftingJoranConfiguratorBase;
@@ -32,6 +43,13 @@
rs.addRule(new Pattern("configuration/appender"), new AppenderAction());
}
+
+ @Override
+ protected void addDefaultNestedComponentRegistryRules(
+ DefaultNestedComponentRegistry registry) {
+ DefaultNestedComponentRules.addDefaultNestedComponentRegistryRules(registry);
+ }
+
@Override
protected void buildInterpreter() {
super.buildInterpreter();
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java Fri Jan 23 14:56:31 2009
@@ -0,0 +1,37 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.util;
+
+import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
+import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.filter.EvaluatorFilter;
+import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
+
+/**
+ * Contains mappings for the default type of nested components in
+ * logback-classic.
+ *
+ * @author Ceki Gulcu
+ *
+ */
+public class DefaultNestedComponentRules {
+
+ static public void addDefaultNestedComponentRegistryRules(
+ DefaultNestedComponentRegistry registry) {
+ // if you modify the rules here, then do not forget to modify
+ // SiftingJoranConfigurator as well.
+ registry.add(AppenderBase.class, "layout", PatternLayout.class);
+ registry
+ .add(EvaluatorFilter.class, "evaluator", JaninoEventEvaluator.class);
+
+ }
+
+}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java Fri Jan 23 14:56:31 2009
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.util;
import ch.qos.logback.classic.LoggerContext;
Modified: logback/trunk/logback-classic/src/test/input/joran/callerData.xml
==============================================================================
--- logback/trunk/logback-classic/src/test/input/joran/callerData.xml (original)
+++ logback/trunk/logback-classic/src/test/input/joran/callerData.xml Fri Jan 23 14:56:31 2009
@@ -9,21 +9,23 @@
<name>m</name>
<regex>^hello.*</regex>
<CaseSensitive>false</CaseSensitive>
- </matcher>
+ </matcher>
</evaluator>
- <appender name="STR_LIST" class="ch.qos.logback.classic.testUtil.StringListAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
+ <appender name="STR_LIST"
+ class="ch.qos.logback.core.testUtil.StringListAppender">
+ <!-- the fact that the layout class is not declared tests default component class
+ mapping rules -->
+ <layout>
<Pattern>%caller{4, helloEval}%d %level - %m%n</Pattern>
</layout>
</appender>
-
+
<root>
<level value="DEBUG" />
<appender-ref ref="STR_LIST" />
</root>
-
-
-
+
+
+
</configuration>
-
\ No newline at end of file
Modified: logback/trunk/logback-classic/src/test/input/joran/conversionRule/htmlLayout0.xml
==============================================================================
--- logback/trunk/logback-classic/src/test/input/joran/conversionRule/htmlLayout0.xml (original)
+++ logback/trunk/logback-classic/src/test/input/joran/conversionRule/htmlLayout0.xml Fri Jan 23 14:56:31 2009
@@ -3,7 +3,7 @@
<conversionRule conversionWord="sample"
converterClass="ch.qos.logback.classic.testUtil.SampleConverter" />
- <appender name="LIST" class="ch.qos.logback.classic.testUtil.StringListAppender">
+ <appender name="LIST" class="ch.qos.logback.core.testUtil.StringListAppender">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<Pattern>%sample%msg</Pattern>
</layout>
Modified: logback/trunk/logback-classic/src/test/input/joran/conversionRule/patternLayout0.xml
==============================================================================
--- logback/trunk/logback-classic/src/test/input/joran/conversionRule/patternLayout0.xml (original)
+++ logback/trunk/logback-classic/src/test/input/joran/conversionRule/patternLayout0.xml Fri Jan 23 14:56:31 2009
@@ -3,7 +3,7 @@
<conversionRule conversionWord="sample"
converterClass="ch.qos.logback.classic.testUtil.SampleConverter" />
- <appender name="LIST" class="ch.qos.logback.classic.testUtil.StringListAppender">
+ <appender name="LIST" class="ch.qos.logback.core.testUtil.StringListAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%sample - %msg</Pattern>
</layout>
Modified: logback/trunk/logback-classic/src/test/input/joran/evaluatorFilter.xml
==============================================================================
--- logback/trunk/logback-classic/src/test/input/joran/evaluatorFilter.xml (original)
+++ logback/trunk/logback-classic/src/test/input/joran/evaluatorFilter.xml Fri Jan 23 14:56:31 2009
@@ -6,7 +6,7 @@
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<Name>myFilter</Name>
<OnMatch>DENY</OnMatch>
- <Evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
+ <Evaluator>
<Name>mdcEvaluator</Name>
<Expression>"to be ignored".equals(message)</Expression>
</Evaluator>
Added: logback/trunk/logback-classic/src/test/input/joran/sift/defaultLayoutRule.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/input/joran/sift/defaultLayoutRule.xml Fri Jan 23 14:56:31 2009
@@ -0,0 +1,23 @@
+<configuration debug="true">
+
+ <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+
+ <discriminator>
+ <Key>userid</Key>
+ <defaultValue>default</defaultValue>
+ </discriminator>
+ <sift>
+ <appender name="LIST-${userid}"
+ class="ch.qos.logback.core.testUtil.StringListAppender">
+ <layout>
+ <Pattern>%level %msg</Pattern>
+ </layout>
+ </appender>
+ </sift>
+ </appender>
+
+ <root level="DEBUG">
+ <appender-ref ref="SIFT" />
+ </root>
+
+</configuration>
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java Fri Jan 23 14:56:31 2009
@@ -25,12 +25,12 @@
import ch.qos.logback.classic.pattern.ConverterTest;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.testUtil.SampleConverter;
-import ch.qos.logback.classic.testUtil.StringListAppender;
import ch.qos.logback.classic.util.TeztConstants;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.pattern.PatternLayoutBase;
import ch.qos.logback.core.pattern.parser.AbstractPatternLayoutBaseTest;
+import ch.qos.logback.core.testUtil.StringListAppender;
public class PatternLayoutTest extends AbstractPatternLayoutBaseTest {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java Fri Jan 23 14:56:31 2009
@@ -25,11 +25,12 @@
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.classic.spi.ThrowableProxy;
-import ch.qos.logback.classic.testUtil.StringListAppender;
import ch.qos.logback.classic.util.TeztConstants;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.read.ListAppender;
+import ch.qos.logback.core.testUtil.StringListAppender;
+import ch.qos.logback.core.util.StatusPrinter;
public class HTMLLayoutTest {
@@ -217,11 +218,14 @@
public void testConversionRuleSupportInHtmlLayout() throws JoranException {
configure(TeztConstants.TEST_DIR_PREFIX
+ "input/joran/conversionRule/htmlLayout0.xml");
+
root.getAppender("LIST");
String msg = "Simon says";
root.debug(msg);
- StringListAppender sla = (StringListAppender) root.getAppender("LIST");
+ StringListAppender<LoggingEvent> sla = (StringListAppender<LoggingEvent>) root
+ .getAppender("LIST");
assertNotNull(sla);
+ StatusPrinter.print(lc);
assertEquals(1, sla.strList.size());
assertFalse(sla.strList.get(0).contains("PARSER_ERROR"));
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java Fri Jan 23 14:56:31 2009
@@ -20,7 +20,6 @@
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.classic.testUtil.StringListAppender;
import ch.qos.logback.classic.turbo.DebugUsersTurboFilter;
import ch.qos.logback.classic.turbo.NOPTurboFilter;
import ch.qos.logback.classic.turbo.TurboFilter;
@@ -28,7 +27,7 @@
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.read.ListAppender;
-import ch.qos.logback.core.util.StatusPrinter;
+import ch.qos.logback.core.testUtil.StringListAppender;
public class JoranConfiguratorTest {
@@ -73,7 +72,7 @@
System.setProperty(propertyName, "INFO");
configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/rootLevelByProperty.xml");
- StatusPrinter.print(loggerContext);
+ //StatusPrinter.print(loggerContext);
ListAppender listAppender = (ListAppender) root.getAppender("LIST");
assertEquals(0, listAppender.list.size());
String msg = "hello world";
@@ -88,7 +87,7 @@
System.setProperty(propertyName, "DEBUG");
configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/loggerLevelByProperty.xml");
- StatusPrinter.print(loggerContext);
+ //StatusPrinter.print(loggerContext);
ListAppender listAppender = (ListAppender) root.getAppender("LIST");
assertEquals(0, listAppender.list.size());
String msg = "hello world";
@@ -100,7 +99,7 @@
@Test
public void testStatusListener() throws JoranException {
configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/statusListener.xml");
- StatusPrinter.print(loggerContext);
+ //StatusPrinter.print(loggerContext);
}
@Test
@@ -118,12 +117,12 @@
logger.debug("toto");
logger.debug(msg);
- StringListAppender slAppender = (StringListAppender) loggerContext
+ StringListAppender<LoggingEvent> slAppender = (StringListAppender<LoggingEvent>) loggerContext
.getLogger("root").getAppender("STR_LIST");
assertNotNull(slAppender);
assertEquals(2, slAppender.strList.size());
assertTrue(slAppender.strList.get(0).contains(" DEBUG - toto"));
-
+
String str1 = slAppender.strList.get(1);
assertTrue(str1.contains("Caller+0"));
assertTrue(str1.contains(" DEBUG - hello world"));
@@ -160,7 +159,7 @@
public void testLevelFilter() throws JoranException {
configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/levelFilter.xml");
- StatusPrinter.print(loggerContext);
+ //StatusPrinter.print(loggerContext);
logger.warn("hello");
logger.error("to be ignored");
@@ -180,7 +179,7 @@
public void testEvaluatorFilter() throws JoranException {
configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/evaluatorFilter.xml");
- StatusPrinter.print(loggerContext);
+ //StatusPrinter.print(loggerContext);
logger.warn("hello");
logger.error("to be ignored");
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java Fri Jan 23 14:56:31 2009
@@ -27,12 +27,13 @@
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.sift.AppenderTracker;
+import ch.qos.logback.core.testUtil.StringListAppender;
import ch.qos.logback.core.util.StatusPrinter;
public class SiftingAppenderTest {
static String PREFIX = TeztConstants.TEST_DIR_PREFIX + "input/joran/sift/";
-
+
LoggerContext loggerContext = new LoggerContext();
Logger logger = loggerContext.getLogger(this.getClass().getName());
Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME);
@@ -57,8 +58,9 @@
logger.debug("smoke");
long timestamp = 0;
SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
- ListAppender<LoggingEvent> listAppender = (ListAppender<LoggingEvent>) ha.getAppenderTracker().get("smoke", timestamp);
-
+ ListAppender<LoggingEvent> listAppender = (ListAppender<LoggingEvent>) ha
+ .getAppenderTracker().get("smoke", timestamp);
+
StatusPrinter.print(loggerContext);
assertNotNull(listAppender);
List<LoggingEvent> eventList = listAppender.list;
@@ -67,6 +69,22 @@
}
@Test
+ public void defaultLayoutRule() throws JoranException {
+ configure(PREFIX + "defaultLayoutRule.xml");
+ logger.debug("hello");
+ long timestamp = 0;
+ SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
+ StringListAppender<LoggingEvent> listAppender = (StringListAppender<LoggingEvent>) ha
+ .getAppenderTracker().get("default", timestamp);
+
+ StatusPrinter.print(loggerContext);
+ assertNotNull(listAppender);
+ List<String> strList = listAppender.strList;
+ assertEquals(1, strList.size());
+ assertEquals("DEBUG hello", strList.get(0));
+ }
+
+ @Test
public void testWholeCycle() throws JoranException {
String mdcKey = "cycle";
configure(PREFIX + "completeCycle.xml");
@@ -74,21 +92,22 @@
logger.debug("smoke");
long timestamp = System.currentTimeMillis();
SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
- ListAppender<LoggingEvent> listAppender = (ListAppender<LoggingEvent>) ha.getAppenderTracker().get("a", timestamp);
+ ListAppender<LoggingEvent> listAppender = (ListAppender<LoggingEvent>) ha
+ .getAppenderTracker().get("a", timestamp);
StatusPrinter.print(loggerContext);
-
+
assertNotNull(listAppender);
List<LoggingEvent> eventList = listAppender.list;
assertEquals(1, listAppender.list.size());
assertEquals("smoke", eventList.get(0).getMessage());
MDC.remove(mdcKey);
- LoggingEvent le = new LoggingEvent("x", logger, Level.INFO, "hello", null, null);
- le.setTimeStamp(timestamp+AppenderTracker.THRESHOLD*2);
+ LoggingEvent le = new LoggingEvent("x", logger, Level.INFO, "hello", null,
+ null);
+ le.setTimeStamp(timestamp + AppenderTracker.THRESHOLD * 2);
ha.doAppend(le);
assertFalse(listAppender.isStarted());
assertEquals(1, ha.getAppenderTracker().keyList().size());
assertEquals("cycleDefault", ha.getAppenderTracker().keyList().get(0));
-
}
}
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java Fri Jan 23 14:56:31 2009
@@ -29,7 +29,6 @@
import ch.qos.logback.core.status.StatusManager;
import ch.qos.logback.core.util.Constants;
import ch.qos.logback.core.util.FileUtil;
-import ch.qos.logback.core.util.StatusPrinter;
public class FileAppenderTest extends AbstractAppenderTest<Object> {
@@ -121,8 +120,7 @@
assertTrue("Got message [" + msg1 + "]", msg1
.startsWith("Setting \"Append\" property"));
- StatusPrinter.print(context);
-
+
appender.doAppend(new Object());
appender.stop();
assertTrue(file.exists());
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java Fri Jan 23 14:56:31 2009
@@ -16,7 +16,6 @@
import ch.qos.logback.core.util.AggregationType;
import ch.qos.logback.core.util.Duration;
import ch.qos.logback.core.util.FileSize;
-import ch.qos.logback.core.util.StatusPrinter;
public class PropertySetterTest {
@@ -137,7 +136,7 @@
setter.setContext(context);
setter.addBasicProperty("adjective", "nice");
setter.addBasicProperty("adjective", "big");
- StatusPrinter.print(context);
+
assertEquals(2, house.adjectiveList.size());
assertEquals("nice", house.adjectiveList.get(0));
assertEquals("big", house.adjectiveList.get(1));
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java Fri Jan 23 14:56:31 2009
@@ -29,7 +29,6 @@
import ch.qos.logback.core.layout.EchoLayout;
import ch.qos.logback.core.util.Compare;
import ch.qos.logback.core.util.Constants;
-import ch.qos.logback.core.util.StatusPrinter;
/**
* A rather exhaustive set of tests. Tests include leaving the file option
@@ -141,9 +140,6 @@
tbrp1.setCurrentTime(currentTime);
}
- StatusPrinter.print(context);
- //System.out.println(expectedFilenameList);
-
int i = 0;
for (String fn : expectedFilenameList) {
assertTrue(Compare.compare(fn, Constants.TEST_DIR_PREFIX
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java Fri Jan 23 14:56:31 2009
@@ -1,7 +1,7 @@
/**
- * LOGBack: the reliable, fast and flexible logging library for Java.
+ * Logback: the generic, reliable, fast and flexible logging framework.
*
- * Copyright (C) 1999-2006, QOS.ch
+ * Copyright (C) 2000-2009, QOS.ch
*
* This library is free software, you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
@@ -18,7 +18,6 @@
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
-import ch.qos.logback.core.util.StatusPrinter;
/**
* @author Ceki
@@ -44,7 +43,7 @@
// assertEquals("foo%", pp.convertInt(3));
pp = new FileNamePattern("%i foo", context);
- StatusPrinter.print(context.getStatusManager());
+
assertEquals("3 foo", pp.convertInt(3));
pp = new FileNamePattern("foo%i.xixo", context);
@@ -84,7 +83,7 @@
cal.set(2003, 4, 20, 17, 55);
FileNamePattern pp = new FileNamePattern("foo%d{yyyy.MM.dd}", context);
- StatusPrinter.print(context.getStatusManager());
+
assertEquals("foo2003.05.20", pp.convertDate(cal.getTime()));
pp = new FileNamePattern("foo%d{yyyy.MM.dd HH:mm}", context);
Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java Fri Jan 23 14:56:31 2009
@@ -0,0 +1,46 @@
+package ch.qos.logback.core.testUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.Layout;
+
+public class StringListAppender<E> extends AppenderBase<E> {
+
+ Layout<E> layout;
+ public List<String> strList = new ArrayList<String>();
+
+ public StringListAppender() {
+
+ }
+
+ public void start() {
+ strList.clear();
+
+ if (layout == null || !layout.isStarted()) {
+ return;
+ }
+ super.start();
+ }
+
+ public void stop() {
+ super.stop();
+ }
+
+ @Override
+ protected void append(E eventObject) {
+ String res = layout.doLayout(eventObject);
+ strList.add(res);
+ }
+
+ @Override
+ public Layout<E> getLayout() {
+ return layout;
+ }
+
+ @Override
+ public void setLayout(Layout<E> layout) {
+ this.layout = layout;
+ }
+}
1
0
21 Jan '09
Author: ceki
Date: Wed Jan 21 23:06:57 2009
New Revision: 2130
Added:
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistry.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/HostClassAndPropertyDouble.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistryTest.java
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/GenericConfigurator.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java
Log:
Fixing LBCLASSIC-103
Joran is now able to assume a default type for nested components according
to rules declared in a JoranConfigurator instance. The rules are located in
an instance of the DefaultNestedComponentRegistry class.
Thus, in many cases it will no longer be necessary to declare the class of a
component in configuration files.
Since the logback-classic and logback-access modes have their own JoranConfigurator
classes, it is now possible to register rules specific to each logback module.
For example, there is now a rule which maps the layout of an appender to a
c.q.l.classic.PatternLayout instance for all appenders in logback-classic and to
and instance of c.q.l.access.PatternLayout for all appenders in logback-access.
This is still ongoing and incomplete work.
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java Wed Jan 21 23:06:57 2009
@@ -1,7 +1,7 @@
/**
- * LOGBack: the generic, reliable, fast and flexible logging framework.
+ * Logback: the generic, reliable, fast and flexible logging framework.
*
- * Copyright (C) 1999-2006, QOS.ch
+ * Copyright (C) 2000-2009, QOS.ch
*
* This library is free software, you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
@@ -10,27 +10,31 @@
package ch.qos.logback.classic.joran;
+import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
import ch.qos.logback.classic.joran.action.ConfigurationAction;
import ch.qos.logback.classic.joran.action.ConsolePluginAction;
import ch.qos.logback.classic.joran.action.ContextNameAction;
import ch.qos.logback.classic.joran.action.EvaluatorAction;
import ch.qos.logback.classic.joran.action.InsertFromJNDIAction;
import ch.qos.logback.classic.joran.action.JMXConfiguratorAction;
-import ch.qos.logback.classic.joran.action.LayoutAction;
import ch.qos.logback.classic.joran.action.LevelAction;
import ch.qos.logback.classic.joran.action.LoggerAction;
import ch.qos.logback.classic.joran.action.RootLoggerAction;
import ch.qos.logback.classic.sift.SiftAction;
import ch.qos.logback.classic.spi.PlatformInfo;
+import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.filter.EvaluatorFilter;
import ch.qos.logback.core.joran.JoranConfiguratorBase;
import ch.qos.logback.core.joran.action.AppenderRefAction;
import ch.qos.logback.core.joran.action.IncludeAction;
import ch.qos.logback.core.joran.action.NOPAction;
+import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
import ch.qos.logback.core.joran.spi.Pattern;
import ch.qos.logback.core.joran.spi.RuleStore;
/**
- * A JoranConfigurator add few rules specific to the Classic module.
+ * This JoranConfiguratorclass adds rules specific to logback-classic.
*
* @author Ceki Gülcü
*/
@@ -46,14 +50,15 @@
rs.addRule(new Pattern("configuration"), new ConfigurationAction());
- rs.addRule(new Pattern("configuration/contextName"), new ContextNameAction());
- rs.addRule(new Pattern("configuration/insertFromJNDI"), new InsertFromJNDIAction());
+ rs.addRule(new Pattern("configuration/contextName"),
+ new ContextNameAction());
+ rs.addRule(new Pattern("configuration/insertFromJNDI"),
+ new InsertFromJNDIAction());
rs.addRule(new Pattern("configuration/evaluator"), new EvaluatorAction());
rs.addRule(new Pattern("configuration/appender/sift"), new SiftAction());
rs.addRule(new Pattern("configuration/appender/sift/*"), new NOPAction());
-
-
+
rs.addRule(new Pattern("configuration/logger"), new LoggerAction());
rs.addRule(new Pattern("configuration/logger/level"), new LevelAction());
@@ -63,19 +68,31 @@
new AppenderRefAction());
rs.addRule(new Pattern("configuration/root/appender-ref"),
new AppenderRefAction());
- rs
- .addRule(new Pattern("configuration/appender/layout"),
- new LayoutAction());
-
+
+ //rs
+ // .addRule(new Pattern("configuration/appender/layout"),
+ // new LayoutAction());
+
// add jmxConfigurator only if we have JMX available.
// If running under JDK 1.4 (retrotranslateed logback) then we
// might not have JMX.
- if(PlatformInfo.hasJMXObjectName()) {
- rs.addRule(new Pattern("configuration/jmxConfigurator"), new JMXConfiguratorAction());
+ if (PlatformInfo.hasJMXObjectName()) {
+ rs.addRule(new Pattern("configuration/jmxConfigurator"),
+ new JMXConfiguratorAction());
}
rs.addRule(new Pattern("configuration/include"), new IncludeAction());
-
- rs.addRule(new Pattern("configuration/consolePlugin"), new ConsolePluginAction());
+
+ rs.addRule(new Pattern("configuration/consolePlugin"),
+ new ConsolePluginAction());
+ }
+
+ @Override
+ protected void addDefaultNestedComponentRegistryRules(
+ DefaultNestedComponentRegistry registry) {
+ registry.add(AppenderBase.class, "layout", PatternLayout.class);
+ registry
+ .add(EvaluatorFilter.class, "evaluator", JaninoEventEvaluator.class);
+
}
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java Wed Jan 21 23:06:57 2009
@@ -1,7 +1,7 @@
/**
* Logback: the generic, reliable, fast and flexible logging framework.
*
- * Copyright (C) 1999-2007, QOS.ch
+ * Copyright (C) 2000-2009, QOS.ch
*
* This library is free software, you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/GenericConfigurator.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/GenericConfigurator.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/GenericConfigurator.java Wed Jan 21 23:06:57 2009
@@ -20,6 +20,7 @@
import ch.qos.logback.core.joran.event.SaxEvent;
import ch.qos.logback.core.joran.event.SaxEventRecorder;
+import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
import ch.qos.logback.core.joran.spi.EventPlayer;
import ch.qos.logback.core.joran.spi.InterpretationContext;
import ch.qos.logback.core.joran.spi.Interpreter;
@@ -79,6 +80,10 @@
abstract protected void addImplicitRules(Interpreter interpreter);
+ protected void addDefaultNestedComponentRegistryRules(DefaultNestedComponentRegistry registry) {
+
+ }
+
protected Pattern initialPattern() {
return new Pattern();
}
@@ -90,6 +95,7 @@
InterpretationContext ec = interpreter.getInterpretationContext();
ec.setContext(context);
addImplicitRules(interpreter);
+ addDefaultNestedComponentRegistryRules(ec.getDefaultNestedComponentRegistry());
}
final public void doConfigure(final InputSource inputSource)
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java Wed Jan 21 23:06:57 2009
@@ -91,23 +91,32 @@
// perform variable name substitution
className = ec.subst(className);
- // guess class name via implicit rules
- if (OptionHelper.isEmpty(className)) {
- PropertySetter parentBean = actionData.parentBean;
- className = parentBean.getClassNameViaImplicitRules(actionData
- .getComplexPropertyName(), actionData.getAggregationType());
- }
+ Class componentClass = null;
+ try {
- if (OptionHelper.isEmpty(className)) {
- actionData.inError = true;
- String errMsg = "No class name attribute in [" + localName + "]";
- addError(errMsg);
- return;
- }
+ if (!OptionHelper.isEmpty(className)) {
+ componentClass = Loader.loadClass(className, context);
+ } else {
+ // guess class name via implicit rules
+ PropertySetter parentBean = actionData.parentBean;
+ componentClass = parentBean.getClassNameViaImplicitRules(actionData
+ .getComplexPropertyName(), actionData.getAggregationType(), ec
+ .getDefaultNestedComponentRegistry());
+ }
- try {
- actionData.setNestedComplexProperty(Loader.loadClass(className, context)
- .newInstance());
+ if (componentClass == null) {
+ actionData.inError = true;
+ String errMsg = "Could not find an appropriate class for property ["
+ + localName + "]";
+ addError(errMsg);
+ return;
+ }
+
+ if(OptionHelper.isEmpty(className)) {
+ addInfo("Assuming default type ["+componentClass.getName()+"] for ["+localName+"] property");
+ }
+
+ actionData.setNestedComplexProperty(componentClass.newInstance());
// pass along the repository
if (actionData.getNestedComplexProperty() instanceof ContextAware) {
@@ -118,12 +127,14 @@
addInfo("Pushing component [" + localName
+ "] on top of the object stack.");
ec.pushObject(actionData.getNestedComplexProperty());
+
} catch (Exception oops) {
actionData.inError = true;
String msg = "Could not create component [" + localName + "] of type ["
+ className + "]";
addError(msg, oops);
}
+
}
public void end(InterpretationContext ec, String tagName) {
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistry.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistry.java Wed Jan 21 23:06:57 2009
@@ -0,0 +1,49 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.core.joran.spi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A registry which maps a property in a host class to a default class.
+ *
+ * @author Cek Gülcü
+ *
+ */
+public class DefaultNestedComponentRegistry {
+
+ Map<HostClassAndPropertyDouble, Class> defaultComponentMap = new HashMap<HostClassAndPropertyDouble, Class>();
+
+ public void add(Class hostClass, String propertyName, Class componentClass) {
+ HostClassAndPropertyDouble hpDouble = new HostClassAndPropertyDouble(
+ hostClass, propertyName.toLowerCase());
+ defaultComponentMap.put(hpDouble, componentClass);
+ }
+
+ public Class findDefaultComponentType(Class hostClass, String propertyName) {
+ propertyName = propertyName.toLowerCase();
+ while (hostClass != null) {
+ Class componentClass = oneShotFind(hostClass, propertyName);
+ if (componentClass != null) {
+ return componentClass;
+ }
+ hostClass = hostClass.getSuperclass();
+ }
+ return null;
+ }
+
+ private Class oneShotFind(Class hostClass, String propertyName) {
+ HostClassAndPropertyDouble hpDouble = new HostClassAndPropertyDouble(
+ hostClass, propertyName);
+ return defaultComponentMap.get(hpDouble);
+ }
+
+}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/HostClassAndPropertyDouble.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/HostClassAndPropertyDouble.java Wed Jan 21 23:06:57 2009
@@ -0,0 +1,72 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.core.joran.spi;
+
+/**
+ * A 2-tuple (a double) consisting of a Class and a String. The Class references
+ * the hosting class of a component and the String represents the property name
+ * under which a nested component is referenced the host.
+ *
+ * This class is used by {@link DefaultNestedComponentRegistry}.
+ *
+ * @author Ceki Gulcu
+ *
+ */
+public class HostClassAndPropertyDouble {
+
+ final Class hostClass;
+ final String propertyName;
+
+ public HostClassAndPropertyDouble(Class hostClass, String propertyName) {
+ this.hostClass = hostClass;
+ this.propertyName = propertyName;
+ }
+
+ public Class getHostClass() {
+ return hostClass;
+ }
+
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((hostClass == null) ? 0 : hostClass.hashCode());
+ result = prime * result
+ + ((propertyName == null) ? 0 : propertyName.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final HostClassAndPropertyDouble other = (HostClassAndPropertyDouble) obj;
+ if (hostClass == null) {
+ if (other.hostClass != null)
+ return false;
+ } else if (!hostClass.equals(other.hostClass))
+ return false;
+ if (propertyName == null) {
+ if (other.propertyName != null)
+ return false;
+ } else if (!propertyName.equals(other.propertyName))
+ return false;
+ return true;
+ }
+
+}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java Wed Jan 21 23:06:57 2009
@@ -43,7 +43,8 @@
Interpreter joranInterpreter;
final List<InPlayListener> listenerList = new ArrayList<InPlayListener>();
-
+ DefaultNestedComponentRegistry defaultNestedComponentRegistry = new DefaultNestedComponentRegistry();
+
public InterpretationContext(Context context, Interpreter joranInterpreter) {
this.context = context;
this.joranInterpreter = joranInterpreter;
@@ -52,6 +53,11 @@
propertiesMap = new HashMap<String, String>(5);
}
+
+ public DefaultNestedComponentRegistry getDefaultNestedComponentRegistry() {
+ return defaultNestedComponentRegistry;
+ }
+
void setPropertiesMap(Map<String, String> propertiesMap) {
this.propertiesMap = propertiesMap;
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/spi/PropertySetter.java Wed Jan 21 23:06:57 2009
@@ -559,19 +559,17 @@
}
}
- String getDefaultClassNameByAnnonation(String name, Method relevantMethod) {
+ Class getDefaultClassNameByAnnonation(String name, Method relevantMethod) {
DefaultClass defaultClassAnnon = getAnnotation(name, DefaultClass.class,
relevantMethod);
if (defaultClassAnnon != null) {
Class defaultClass = defaultClassAnnon.value();
- if (defaultClass != null) {
- return defaultClass.getName();
- }
+ return defaultClass;
}
return null;
}
- String getByConcreteType(String name, Method relevantMethod) {
+ Class getByConcreteType(String name, Method relevantMethod) {
Class<?> paramType = getParameterClassForMethod(relevantMethod);
if (paramType == null) {
@@ -580,22 +578,26 @@
boolean isUnequivocallyInstantiable = isUnequivocallyInstantiable(paramType);
if(isUnequivocallyInstantiable) {
- return paramType.getName();
+ return paramType;
} else {
return null;
}
}
- public String getClassNameViaImplicitRules(String name,
- AggregationType aggregationType) {
+ public Class getClassNameViaImplicitRules(String name,
+ AggregationType aggregationType, DefaultNestedComponentRegistry registry) {
+ Class registryResult = registry.findDefaultComponentType(obj.getClass(), name);
+ if(registryResult!= null) {
+ return registryResult;
+ }
// find the relevant method for the given property name and aggregationType
Method relevantMethod = getRelevantMethod(name, aggregationType);
if (relevantMethod == null) {
-
+ return null;
}
- String byAnnotation = getDefaultClassNameByAnnonation(name, relevantMethod);
+ Class byAnnotation = getDefaultClassNameByAnnonation(name, relevantMethod);
if (byAnnotation != null) {
return byAnnotation;
}
Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistryTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistryTest.java Wed Jan 21 23:06:57 2009
@@ -0,0 +1,37 @@
+package ch.qos.logback.core.joran.spi;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DefaultNestedComponentRegistryTest {
+
+ DefaultNestedComponentRegistry registry = new DefaultNestedComponentRegistry();
+
+ @Before
+ public void setUp() throws Exception {
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void smoke() {
+ String propertyName = "window";
+ registry.add(House.class, propertyName, Window.class);
+ Class result = registry.findDefaultComponentType(House.class, propertyName);
+ assertEquals(Window.class, result);
+ }
+
+ @Test
+ public void absent() {
+ registry.add(House.class, "a", Window.class);
+ Class result = registry.findDefaultComponentType(House.class, "other");
+ assertNull(result);
+ }
+}
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java Wed Jan 21 23:06:57 2009
@@ -14,6 +14,7 @@
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
-(a)SuiteClasses({PatternTest.class, SimpleStoreTest.class, PropertySetterTest.class})
+@SuiteClasses( { PatternTest.class, SimpleStoreTest.class,
+ PropertySetterTest.class, DefaultNestedComponentRegistryTest.class })
public class PackageTest {
}
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PropertySetterTest.java Wed Jan 21 23:06:57 2009
@@ -20,6 +20,8 @@
public class PropertySetterTest {
+ DefaultNestedComponentRegistry defaultComponentRegistry = new DefaultNestedComponentRegistry();
+
@Test
public void testCanAggregateComponent() {
House house = new House();
@@ -112,23 +114,21 @@
public void testgetClassNameViaImplicitRules() {
House house = new House();
PropertySetter setter = new PropertySetter(house);
- String className = setter.getClassNameViaImplicitRules("door",
- AggregationType.AS_COMPLEX_PROPERTY);
- assertEquals(Door.class.getName(), className);
+ Class compClass = setter.getClassNameViaImplicitRules("door",
+ AggregationType.AS_COMPLEX_PROPERTY, defaultComponentRegistry);
+ assertEquals(Door.class, compClass);
}
-
-
@Test
public void testgetComplexPropertyColleClassNameViaImplicitRules() {
House house = new House();
PropertySetter setter = new PropertySetter(house);
- String className = setter.getClassNameViaImplicitRules("window",
- AggregationType.AS_COMPLEX_PROPERTY_COLLECTION);
- assertEquals(Window.class.getName(), className);
+ Class compClass = setter.getClassNameViaImplicitRules("window",
+ AggregationType.AS_COMPLEX_PROPERTY_COLLECTION,
+ defaultComponentRegistry);
+ assertEquals(Window.class, compClass);
}
-
@Test
public void testPropertyCollection() {
House house = new House();
@@ -208,13 +208,14 @@
Method relevantMethod = setter.getRelevantMethod("SwimmingPool",
AggregationType.AS_COMPLEX_PROPERTY);
assertNotNull(relevantMethod);
- String spClassName = setter.getDefaultClassNameByAnnonation("SwimmingPool",
+ Class spClass = setter.getDefaultClassNameByAnnonation("SwimmingPool",
relevantMethod);
- assertEquals(SwimmingPoolImpl.class.getName(), spClassName);
+ assertEquals(SwimmingPoolImpl.class, spClass);
- String classNameViaImplicitRules = setter.getClassNameViaImplicitRules(
- "SwimmingPool", AggregationType.AS_COMPLEX_PROPERTY);
- assertEquals(SwimmingPoolImpl.class.getName(), classNameViaImplicitRules);
+ Class classViaImplicitRules = setter.getClassNameViaImplicitRules(
+ "SwimmingPool", AggregationType.AS_COMPLEX_PROPERTY,
+ defaultComponentRegistry);
+ assertEquals(SwimmingPoolImpl.class, classViaImplicitRules);
}
}
1
0
Author: ceki
Date: Wed Jan 21 22:57:21 2009
New Revision: 2129
Modified:
logback/trunk/logback-examples/src/main/java/chapter2/sample-config-1.xml
logback/trunk/logback-examples/src/main/java/chapter2/sample-config-2.xml
logback/trunk/logback-examples/src/main/java/chapter2/sample-config-3.xml
logback/trunk/logback-examples/src/main/java/chapter3/additivityFlag.xml
logback/trunk/logback-examples/src/main/java/chapter3/duplicate.xml
logback/trunk/logback-examples/src/main/java/chapter3/restricted.xml
logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-HtmlToConsole.xml
logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-MDC.xml
logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTP.xml
logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTPWithHtml.xml
logback/trunk/logback-examples/src/main/java/chapter4/countingConsole.xml
logback/trunk/logback-examples/src/main/java/chapter4/db/append-toMySQL-with-datasource.xml
logback/trunk/logback-examples/src/main/java/chapter4/db/append-with-drivermanager.xml
logback/trunk/logback-examples/src/main/java/chapter4/mail/mail2.xml
logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java
logback/trunk/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
logback/trunk/logback-examples/src/main/java/chapter7/simpleMDC.xml
logback/trunk/logback-site/src/site/pages/manual/filters.html
logback/trunk/logback-site/src/site/pages/manual/jmxConfig.html
logback/trunk/logback-site/src/site/pages/manual/joran.html
logback/trunk/logback-site/src/site/pages/manual/layouts.html
logback/trunk/logback-site/src/site/pages/manual/mdc.html
logback/trunk/logback-site/src/site/pages/news.html
Log:
Adjusting all examples so that the level of a logger or root logger is declared
as an attribute and not as a nested element. However, the code still honors the old covention.
Modified: logback/trunk/logback-examples/src/main/java/chapter2/sample-config-1.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter2/sample-config-1.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter2/sample-config-1.xml Wed Jan 21 22:57:21 2009
@@ -9,8 +9,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter2/sample-config-2.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter2/sample-config-2.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter2/sample-config-2.xml Wed Jan 21 22:57:21 2009
@@ -17,8 +17,7 @@
<File>sample-log.txt</File>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
Modified: logback/trunk/logback-examples/src/main/java/chapter2/sample-config-3.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter2/sample-config-3.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter2/sample-config-3.xml Wed Jan 21 22:57:21 2009
@@ -17,12 +17,9 @@
<File>sample-log.txt</File>
</appender>
- <logger name="chapter2">
- <level value="info" />
- </logger>
+ <logger name="chapter2" level="info" />
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
Modified: logback/trunk/logback-examples/src/main/java/chapter3/additivityFlag.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/additivityFlag.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/additivityFlag.xml Wed Jan 21 22:57:21 2009
@@ -19,8 +19,7 @@
<appender-ref ref="FILE" />
</logger>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
\ No newline at end of file
Modified: logback/trunk/logback-examples/src/main/java/chapter3/duplicate.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/duplicate.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/duplicate.xml Wed Jan 21 22:57:21 2009
@@ -13,8 +13,7 @@
<appender-ref ref="STDOUT" />
</logger>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
\ No newline at end of file
Modified: logback/trunk/logback-examples/src/main/java/chapter3/restricted.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/restricted.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/restricted.xml Wed Jan 21 22:57:21 2009
@@ -17,8 +17,7 @@
<appender-ref ref="FILE" />
</logger>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
\ No newline at end of file
Modified: logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-HtmlToConsole.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-HtmlToConsole.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-HtmlToConsole.xml Wed Jan 21 22:57:21 2009
@@ -10,8 +10,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-MDC.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-MDC.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-MDC.xml Wed Jan 21 22:57:21 2009
@@ -7,8 +7,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTP.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTP.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTP.xml Wed Jan 21 22:57:21 2009
@@ -13,8 +13,7 @@
<To>recipient_email(a)host.ch</To>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="SMTP" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTPWithHtml.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTPWithHtml.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/conf/logback-SMTPWithHtml.xml Wed Jan 21 22:57:21 2009
@@ -14,8 +14,7 @@
<To>recipient_email(a)host.ch</To>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="SMTP" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter4/countingConsole.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/countingConsole.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/countingConsole.xml Wed Jan 21 22:57:21 2009
@@ -10,8 +10,7 @@
<limit>5</limit>
</appender>
- <root>
- <level value="debug"/>
+ <root level="debug">
<appender-ref ref="CUSTOM" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter4/db/append-toMySQL-with-datasource.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/db/append-toMySQL-with-datasource.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/db/append-toMySQL-with-datasource.xml Wed Jan 21 22:57:21 2009
@@ -14,8 +14,7 @@
</connectionSource>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="DB" />
</root>
Modified: logback/trunk/logback-examples/src/main/java/chapter4/db/append-with-drivermanager.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/db/append-with-drivermanager.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/db/append-with-drivermanager.xml Wed Jan 21 22:57:21 2009
@@ -12,8 +12,7 @@
</connectionSource>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="DB" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter4/mail/mail2.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/mail/mail2.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/mail/mail2.xml Wed Jan 21 22:57:21 2009
@@ -9,8 +9,7 @@
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
</appender>
- <root>
- <level value="debug"/>
+ <root level="debug">
<appender-ref ref="EMAIL" />
</root>
</configuration>
Modified: logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java Wed Jan 21 22:57:21 2009
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package chapter6;
import org.slf4j.Logger;
Modified: logback/trunk/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml Wed Jan 21 22:57:21 2009
@@ -8,7 +8,7 @@
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
- <layout class="ch.qos.logback.classic.PatternLayout">
+ <layout>
<pattern>%-4relative [%thread] %-5level %logger - %msg%n</pattern>
</layout>
</appender>
Modified: logback/trunk/logback-examples/src/main/java/chapter7/simpleMDC.xml
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter7/simpleMDC.xml (original)
+++ logback/trunk/logback-examples/src/main/java/chapter7/simpleMDC.xml Wed Jan 21 22:57:21 2009
@@ -9,8 +9,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
Modified: logback/trunk/logback-site/src/site/pages/manual/filters.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/manual/filters.html (original)
+++ logback/trunk/logback-site/src/site/pages/manual/filters.html Wed Jan 21 22:57:21 2009
@@ -188,7 +188,7 @@
configuration that uses <code>LevelFilter</code>.
</p>
-<em>Example 6.3: Sample LevelFilter configuration (logback-examples/src/main/java/chapter6/LevelFilterConfig.xml)</em>
+<em>Example 6.3: Sample LevelFilter configuration (logback-examples/src/main/java/chapter6/levelFilterConfig.xml)</em>
<div class="source"><pre><configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
@@ -203,8 +203,7 @@
</pattern>
</layout>
</appender>
- <root>
- <level value="DEBUG" />
+ <root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration></pre></div>
@@ -218,7 +217,7 @@
use of the <code>ThresholdFilter</code> is shown below.
</p>
-<em>Example 6.4: Sample ThresholdFilter configuration (logback-examples/src/main/java/chapter6/ThresholdFilterConfig.xml)</em>
+<em>Example 6.4: Sample ThresholdFilter configuration (logback-examples/src/main/java/chapter6/thresholdFilterConfig.xml)</em>
<div class="source"><pre><configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
@@ -231,8 +230,7 @@
</pattern>
</layout>
</appender>
- <root>
- <level value="DEBUG" />
+ <root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration></pre></div>
@@ -361,15 +359,14 @@
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter></b>
- <layout class="ch.qos.logback.classic.PatternLayout">
+ <layout>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</layout>
</appender>
- <root>
- <level value="INFO" />
+ <root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration></pre></div>
@@ -594,8 +591,7 @@
</layout>
</appender>
- <root>
- <level value="info"/>
+ <root level="info">
<appender-ref ref="console" />
</root>
</configuration></pre></div>
Modified: logback/trunk/logback-site/src/site/pages/manual/jmxConfig.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/manual/jmxConfig.html (original)
+++ logback/trunk/logback-site/src/site/pages/manual/jmxConfig.html Wed Jan 21 22:57:21 2009
@@ -53,8 +53,7 @@
</layout>
</appender>
- <root>
- <level value="debug"/>
+ <root level="debug"/>
<appender-ref ref="console" />
</root>
</configuration></p>
Modified: logback/trunk/logback-site/src/site/pages/manual/joran.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/manual/joran.html (original)
+++ logback/trunk/logback-site/src/site/pages/manual/joran.html Wed Jan 21 22:57:21 2009
@@ -846,8 +846,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<b><appender-ref ref="FILE" />
<appender-ref ref="STDOUT" /></b>
</root>
@@ -892,8 +891,7 @@
<appender-ref ref="STDOUT" />
</logger>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration></pre></div>
@@ -946,8 +944,7 @@
<appender-ref ref="FILE" />
</logger>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration></pre></div>
@@ -987,8 +984,7 @@
<appender-ref ref="FILE" />
</logger>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration></pre></div>
@@ -1043,8 +1039,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration></pre></div>
@@ -1072,8 +1067,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration></pre></div>
@@ -1180,8 +1174,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration></pre></div>
Modified: logback/trunk/logback-site/src/site/pages/manual/layouts.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/manual/layouts.html (original)
+++ logback/trunk/logback-site/src/site/pages/manual/layouts.html Wed Jan 21 22:57:21 2009
@@ -166,8 +166,7 @@
<b><layout class="chapter5.MySampleLayout" /></b>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration></pre></div>
@@ -271,8 +270,7 @@
</layout>
</appender>
- <root>
- <level value="debug" />
+ <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration></p>
@@ -1531,11 +1529,10 @@
<File>/test.html</File>
</appender>
- <root>
- <level value="debug" />
- <appender-ref ref="FILE" />
- </root>
-</configuration>
+ <root level="debug">
+ <appender-ref ref="FILE" />
+ </root>
+</configuration>
</div>
<p>Launching the <code>TrivialMain</code> application listed below
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 Wed Jan 21 22:57:21 2009
@@ -425,8 +425,7 @@
</layout>
</appender>
- <root>
- <level value ="debug"/>
+ <root level="debug">
<appender-ref ref="CONSOLE"/>
</root>
</configuration></pre></div>
Modified: logback/trunk/logback-site/src/site/pages/news.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/news.html (original)
+++ logback/trunk/logback-site/src/site/pages/news.html Wed Jan 21 22:57:21 2009
@@ -37,7 +37,7 @@
reported by Alexis Morillo.
</p>
- <p>Added servleta for viewing internal status messages as an HTML
+ <p>Added a servlet for viewing internal status messages as an HTML
table. Two separate implementations are available; one for <a
href="manual/joran.html#viewingStatusMessages">logback-classic</a>
and the other for <a
@@ -51,7 +51,10 @@
href="http://jira.qos.ch/browse/LBCORE-77">LBCORE-77</a>.
</p>
-
+ <p>Fixed problem <a
+ href="http://jira.qos.ch/browse/LBCLASSIC-104">LBCLASSIC-104</a>
+ related to loss of MDC information in deferred logging events.
+ </p>
<h3>29th of December 2008 - Release of version 0.9.14</h3>
1
0
[JIRA] Created: (LBCLASSIC-105) File not rolling over with SizeBasedTriggeringPolicy
by Ceki Gulcu (JIRA) 18 Jan '09
by Ceki Gulcu (JIRA) 18 Jan '09
18 Jan '09
File not rolling over with SizeBasedTriggeringPolicy
----------------------------------------------------
Key: LBCLASSIC-105
URL: http://jira.qos.ch/browse/LBCLASSIC-105
Project: logback-classic
Issue Type: Bug
Affects Versions: 0.9.14
Reporter: Ceki Gulcu
Assignee: Logback dev list
Original report http://qos.ch/pipermail/logback-user/2009-January/000878.html
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
3
18 Jan '09
Wrong Encoding in SMTPAppender
------------------------------
Key: LBCLASSIC-106
URL: http://jira.qos.ch/browse/LBCLASSIC-106
Project: logback-classic
Issue Type: Bug
Affects Versions: 0.9.14
Reporter: Ceki Gulcu
Assignee: Logback dev list
Original report http://qos.ch/pipermail/logback-user/2009-January/000879.html
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
3
[JIRA] Created: (LBCLASSIC-104) strange MDC and SMTPAppender behavior
by Ceki Gulcu (JIRA) 16 Jan '09
by Ceki Gulcu (JIRA) 16 Jan '09
16 Jan '09
strange MDC and SMTPAppender behavior
-------------------------------------
Key: LBCLASSIC-104
URL: http://jira.qos.ch/browse/LBCLASSIC-104
Project: logback-classic
Issue Type: Bug
Affects Versions: 0.9.14
Reporter: Ceki Gulcu
Assignee: Ceki Gulcu
Original report: http://www.qos.ch/pipermail/logback-user/2009-January/000877.html
I'm seeing unexpected behavior when I combine MDC and SMTPAppender.
The MDC values appear to be lost for previous log messages when
MDC.clear is called before Logger.error triggers the actual email.
This does not appear to be a problem with console appender. Below
is a test program that will reproduce the problem. A logback.xml
that uses an SMTPAppender and a pattern that includes %mdc is required.
Is there something I'm missing?
Versions:
slf4j-api-1.5.6.jar
logback-core-0.9.14.jar
logback-classic-0.9.14.jar
janino-2.5.14.jar
mail-1.4.1.jar
java version "1.6.0_04"
test program:
import org.slf4j.Logger;
import org.slf4j.MDC;
import org.slf4j.LoggerFactory;
public class TestMain
{
public static void main(String[] args)
{
Logger logger = LoggerFactory.getLogger("TestMain");
// test1...
logger.debug("test1: should not have MDC");
MDC.put("key1", "val1");
MDC.put("key2", "val2");
logger.warn("test1: should have MDC(key1=val1,key2=val2) but
does not");
MDC.clear();
logger.debug("test1: should not have MDC");
logger.error("test1: error message triggers email");
// test2...
logger.debug("test2: should not have MDC");
MDC.put("key1", "val1");
logger.warn("test2: should have MDC(key1=val1)");
MDC.put("key2", "val2");
logger.warn("test2: should have MDC(key1=val1,key2=val2)");
MDC.put("key3", "val3");
logger.warn("test2: should have
MDC(key1=val1,key2=val2,key3=val3) but does not");
MDC.clear();
logger.debug("test2: should not have MDC");
logger.error("test2: error message triggers email");
// test3...
logger.debug("test3: should not have MDC");
MDC.put("key1", "val1");
logger.warn("test3: should have MDC(key1=val1)");
MDC.put("key2", "val2");
logger.warn("test3: should have MDC(key1=val1,key2=val2)");
MDC.put("key3", "val3");
logger.warn("test3: should have
MDC(key1=val1,key2=val2,key3=val3)");
MDC.put("key4", "val4");
logger.warn("test3: should have
MDC(key1=val1,key2=val2,key3=val3,key4=val4) but does not");
MDC.clear();
logger.debug("test3: should not have MDC");
logger.error("test3: error message triggers email");
// test4...
logger.debug("test4: should not have MDC");
MDC.put("key1", "val1");
logger.warn("test4: should have MDC(key1=val1)");
MDC.put("key2", "val2");
logger.error("test4: error message triggers email and has
MDC(key1=val1,key2=val2)");
MDC.clear();
logger.debug("test5: should not have MDC");
MDC.put("key1", "val1");
logger.warn("test5: should have MDC(key1=val1) but does not");
MDC.clear();
logger.debug("test5: should not have MDC");
MDC.put("key1", "val1");
logger.warn("test5: should have MDC(key1=val1)");
logger.error("test5: error message triggers email and should not
have MDC");
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
1
svn commit: r2128 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic/net main/java/ch/qos/logback/classic/spi test/java/ch/qos/logback/classic/net
by noreply.ceki@qos.ch 15 Jan '09
by noreply.ceki@qos.ch 15 Jan '09
15 Jan '09
Author: ceki
Date: Thu Jan 15 20:02:33 2009
New Revision: 2128
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java
Log:
Fixes LBCLASSIC-104.
The prepareForDeferredProcessing() method in LoggingEvent now creates a copy mdcPropertiesMap.
It follows that if the MDC is subsequently modified, the logging events are not impacted.
SMTPAppender in lb-classic now invokes event.prepareForDeferredProcessing() method in subAppend().
Added relevant test case.
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java Thu Jan 15 20:02:33 2009
@@ -70,7 +70,7 @@
* a cyclic buffer.
*/
protected void subAppend(LoggingEvent event) {
- event.getThreadName();
+ event.prepareForDeferredProcessing();
cb.add(event);
// addInfo("Added event to the cyclic buffer: " + event.getMessage());
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java Thu Jan 15 20:02:33 2009
@@ -14,6 +14,7 @@
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
+import java.util.HashMap;
import java.util.Map;
import org.slf4j.MDC;
@@ -177,14 +178,18 @@
/**
* This method should be called prior to serializing an event. It should also
- * be called when using asynchronous logging.
+ * be called when using asynchronous or deferred logging.
*
* <p> Note that due to performance concerns, this method does NOT extract
- * caller data. It is the responsability of the calller to extract caller
+ * caller data. It is the responsibility of the caller to extract caller
* information.
*/
public void prepareForDeferredProcessing() {
this.getThreadName();
+ // fixes http://jira.qos.ch/browse/LBCLASSIC-104
+ if (mdcPropertyMap != null) {
+ mdcPropertyMap = new HashMap<String, String>(mdcPropertyMap);
+ }
}
public LoggerRemoteView getLoggerRemoteView() {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java Thu Jan 15 20:02:33 2009
@@ -14,6 +14,7 @@
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.slf4j.MDC;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
@@ -27,6 +28,7 @@
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.testUtil.RandomUtil;
+import ch.qos.logback.core.util.StatusPrinter;
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.GreenMailUtil;
@@ -46,6 +48,7 @@
@Before
public void setUp() throws Exception {
+ MDC.clear();
ServerSetup serverSetup = new ServerSetup(port, "localhost",
ServerSetup.PROTOCOL_SMTP);
greenMail = new GreenMail(serverSetup);
@@ -74,7 +77,7 @@
PatternLayout layout = new PatternLayout();
layout.setContext(lc);
layout.setFileHeader(HEADER);
- layout.setPattern("%-4relative [%thread] %-5level %class - %msg%n");
+ layout.setPattern("%-4relative %mdc [%thread] %-5level %class - %msg%n");
layout.setFileFooter(FOOTER);
layout.start();
return layout;
@@ -111,6 +114,7 @@
logger.debug("hello");
logger.error("en error", new Exception("an exception"));
+ StatusPrinter.print(lc);
MimeMultipart mp = verify(TEST_SUBJECT);
String body = GreenMailUtil.getBody(mp.getBodyPart(0));
assertTrue(body.startsWith(HEADER.trim()));
@@ -118,6 +122,25 @@
}
@Test
+ public void LBCLASSIC_104() throws Exception {
+ buildSMTPAppender();
+ smtpAppender.setLayout(buildPatternLayout(lc));
+ smtpAppender.start();
+ logger.addAppender(smtpAppender);
+ MDC.put("key", "val");
+ logger.debug("hello");
+ MDC.clear();
+ logger.error("en error", new Exception("an exception"));
+
+ MimeMultipart mp = verify(TEST_SUBJECT);
+ String body = GreenMailUtil.getBody(mp.getBodyPart(0));
+ assertTrue(body.startsWith(HEADER.trim()));
+ assertTrue(body.contains("key=val"));
+ assertTrue(body.endsWith(FOOTER.trim()));
+ }
+
+
+ @Test
public void html() throws Exception {
buildSMTPAppender();
smtpAppender.setLayout(buildHTMLLayout(lc));
1
0
[JIRA] Created: (LBCORE-83) Filter list of appenders is no longer accessible
by Michael Franz (JIRA) 15 Jan '09
by Michael Franz (JIRA) 15 Jan '09
15 Jan '09
Filter list of appenders is no longer accessible
------------------------------------------------
Key: LBCORE-83
URL: http://jira.qos.ch/browse/LBCORE-83
Project: logback-core
Issue Type: Bug
Components: Appender
Affects Versions: 0.9.14
Reporter: Michael Franz
Assignee: Logback dev list
Priority: Blocker
In version 0.9.14 the getNext() method has been removed, but the FilterAttachable interface still only contains the method getFirstFilter(). This leads to the situation that for an appender only the first filter can be traversed by application code.
I need to be able to access to full list to provide some visualization of the current working logging configuration.
I raised this as a "blocker" since this prevents me migrating from 0.9.13 to 0.9.14.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
2
4