logback-dev
Threads by month
- ----- 2025 -----
- 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
November 2008
- 13 participants
- 135 discussions

svn commit: r1951 - in logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic: . control
by noreply.ceki@qos.ch 06 Nov '08
by noreply.ceki@qos.ch 06 Nov '08
06 Nov '08
Author: ceki
Date: Thu Nov 6 19:15:37 2008
New Revision: 1951
Added:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java
Removed:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/TestScenario.java
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java
Log:
Renaming TestScenario as Scenario because it is not a test.
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java Thu Nov 6 19:15:37 2008
@@ -24,7 +24,7 @@
import ch.qos.logback.classic.control.ScenarioAction;
import ch.qos.logback.classic.control.ScenarioMaker;
import ch.qos.logback.classic.control.SetLevel;
-import ch.qos.logback.classic.control.TestScenario;
+import ch.qos.logback.classic.control.Scenario;
public class ScenarioBasedLoggerContextTest {
@@ -55,7 +55,7 @@
private void doScenarioedTest(int len) {
LoggerContext lc = new LoggerContext();
ControlLoggerContext controlContext = new ControlLoggerContext();
- TestScenario s = ScenarioMaker.makeRealisticCreationScenario(len);
+ Scenario s = ScenarioMaker.makeRealisticCreationScenario(len);
List actionList = s.getActionList();
int size = actionList.size();
for (int i = 0; i < size; i++) {
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java Thu Nov 6 19:15:37 2008
@@ -0,0 +1,35 @@
+/**
+ * LOGBack: the reliable, fast and flexible logging library for Java.
+ *
+ * Copyright (C) 1999-2005, QOS.ch, LOGBack.com
+ *
+ * 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.control;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+public class Scenario {
+
+ private List<ScenarioAction> actionList = new Vector<ScenarioAction>();
+
+ public void add(ScenarioAction action) {
+ actionList.add(action);
+ }
+
+ public List<ScenarioAction> getActionList() {
+ return new ArrayList<ScenarioAction>(actionList);
+ }
+
+ public int size() {
+ return actionList.size();
+ }
+
+ public ScenarioAction get(int i) {
+ return (ScenarioAction) actionList.get(i);
+ }
+}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java Thu Nov 6 19:15:37 2008
@@ -21,8 +21,9 @@
// the frequency of a set levelInt event for every create logger event
private final static int CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY = 5;
private final static int SECOND_SET_LEVEL_FREQUENCY = 3;
-
-
+
+ private static long count = 0;
+
/**
* Makes a scenario with len logger creations. Logger names are generated
* independently such that the overwhelming majority of logger names will be
@@ -32,19 +33,19 @@
* @param len
* @return
*/
- static public TestScenario makeTypeAScenario(int len) {
- TestScenario scenario = new TestScenario();
+ static public Scenario makeTypeAScenario(int len) {
+ Scenario scenario = new Scenario();
;
for (int i = 0; i < len; i++) {
- String loggerName = ScenarioRandomUtil.randomLoggerName(AVERAGE_LOGGER_DEPTH,
- LOGGER_DEPT_DEV);
+ String loggerName = ScenarioRandomUtil.randomLoggerName(
+ AVERAGE_LOGGER_DEPTH, LOGGER_DEPT_DEV);
scenario.add(new CreateLogger(loggerName));
}
return scenario;
}
- static public TestScenario makeRealisticCreationScenario(int len) {
- TestScenario scenario = new TestScenario();
+ static public Scenario makeRealisticCreationScenario(int len) {
+ Scenario scenario = new Scenario();
LinkedList<String> queue = new LinkedList<String>();
int loggerCreationCount = 0;
@@ -52,9 +53,14 @@
queue.add("");
while (loggerCreationCount < len) {
+ if ((count % 100) == 0) {
+ System.out.println("count=" + count);
+ }
+
String loggerName = (String) queue.removeFirst();
- int randomChildrenCount = ScenarioRandomUtil.randomChildrenCount(loggerName);
-
+ int randomChildrenCount = ScenarioRandomUtil
+ .randomChildrenCount(loggerName);
+
if (randomChildrenCount == 0) {
scenario.add(new CreateLogger(loggerName));
addSetLevelSubScenario(scenario, loggerName);
@@ -64,9 +70,11 @@
String childName;
if (loggerName.equals("")) {
childName = ScenarioRandomUtil.randomId();
+ count += childName.length();
} else {
childName = loggerName + ClassicGlobal.LOGGER_SEPARATOR
+ ScenarioRandomUtil.randomId();
+ count += childName.length();
}
queue.add(childName);
addSetLevelSubScenario(scenario, loggerName);
@@ -76,17 +84,16 @@
}
return scenario;
}
-
- static void addSetLevelSubScenario(TestScenario scenario, String loggerName) {
- if(ScenarioRandomUtil.oneInFreq(CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY)) {
+
+ static void addSetLevelSubScenario(Scenario scenario, String loggerName) {
+ if (ScenarioRandomUtil.oneInFreq(CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY)) {
Level l = ScenarioRandomUtil.randomLevel();
scenario.add(new SetLevel(l, loggerName));
- if(ScenarioRandomUtil.oneInFreq(SECOND_SET_LEVEL_FREQUENCY)) {
+ if (ScenarioRandomUtil.oneInFreq(SECOND_SET_LEVEL_FREQUENCY)) {
l = ScenarioRandomUtil.randomLevel();
scenario.add(new SetLevel(l, loggerName));
}
}
}
-
-
+
}
\ No newline at end of file
1
0

svn commit: r1950 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic
by noreply.ceki@qos.ch 06 Nov '08
by noreply.ceki@qos.ch 06 Nov '08
06 Nov '08
Author: ceki
Date: Thu Nov 6 19:13:35 2008
New Revision: 1950
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java
Log:
A scenario with 500000 loggers causes an out of memory error.
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java Thu Nov 6 19:13:35 2008
@@ -15,6 +15,7 @@
import java.util.List;
import java.util.Map;
+import org.junit.Ignore;
import org.junit.Test;
import ch.qos.logback.classic.control.ControlLogger;
@@ -46,8 +47,9 @@
}
@Test
+ @Ignore
public void testLengthLong() {
- doScenarioedTest(500*1000);
+ doScenarioedTest(100*1000);
}
private void doScenarioedTest(int len) {
1
0

svn commit: r1949 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control
by noreply.ceki@qos.ch 06 Nov '08
by noreply.ceki@qos.ch 06 Nov '08
06 Nov '08
Author: ceki
Date: Thu Nov 6 18:31:46 2008
New Revision: 1949
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/PackageTest.java
Log:
- removed reference to previously deleted test
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/PackageTest.java Thu Nov 6 18:31:46 2008
@@ -16,7 +16,6 @@
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new JUnit4TestAdapter(RandomUtilTest.class));
- suite.addTest(new JUnit4TestAdapter(ScenarioMakerTest.class));
return suite;
}
}
\ No newline at end of file
1
0

06 Nov '08
[ http://jira.qos.ch/browse/LBCLASSIC-33?page=com.atlassian.jira.plugin.syste… ]
Ceki Gulcu commented on LBCLASSIC-33:
-------------------------------------
With revision 1945, whenever the LoggerContext is reset, any associated JMXConfigurator instances are unregistered from the MBeanServer.
However, applying the techniques outlined in Frank Kieviet's blog (Thanks Joern), I don't seem to be able to have JMXConfigurator garbage collected when the web-app is stopped. (However, when the web-application is stopped and restarted, there is no accrual of LoggerCcontext objects. I am still investigating the issue and will keep you posted.
> unregistering in the jmx plugin
> -------------------------------
>
> Key: LBCLASSIC-33
> URL: http://jira.qos.ch/browse/LBCLASSIC-33
> Project: logback-classic
> Issue Type: Bug
> Components: Other
> Affects Versions: unspecified
> Environment: Operating System: All
> Platform: All
> Reporter: Hontvári József
> Assignee: Ceki Gulcu
>
> I started using the JMX plugin of login, and I wondered how should I
> shut it down when a web application is restarted. I haven't found a
> function which unregisters the Configurator MBean. This object holds a
> reference (through ContextAwareBase) to a Context. I am afraid that not
> unregistering it causes a memory leak when a web application is restarted.
> There should be a way to shutdown the JMX plugin. Or more generally an API to shut down the Logback system in its entirety: flush buffers, close files etc. It must be decided what to do if a log request arrives when or after logback is shutting down.
--
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
0

[JIRA] Created: (LBCLASSIC-83) Logger.setLevel(null) will throw an NPE if the logger in question previously has a non-null level
by Ceki Gulcu (JIRA) 06 Nov '08
by Ceki Gulcu (JIRA) 06 Nov '08
06 Nov '08
Logger.setLevel(null) will throw an NPE if the logger in question previously has a non-null level
--------------------------------------------------------------------------------------------------
Key: LBCLASSIC-83
URL: http://jira.qos.ch/browse/LBCLASSIC-83
Project: logback-classic
Issue Type: Bug
Components: Other
Affects Versions: 0.9.9, 0.9.10, 0.9.11, 0.9.12
Reporter: Ceki Gulcu
Assignee: Ceki Gulcu
Priority: Blocker
Fix For: 0.9.12
This bug causes LBCLASSIC-79 as symptom. To reproduce
Logger logger = LoggerFactory.getLogger("x");
logger.setLevel(Level.DEBUG)
logger.setLevel(null); // throws NPE
--
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: r1948 - in logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic: . control jmx
by noreply.ceki@qos.ch 06 Nov '08
by noreply.ceki@qos.ch 06 Nov '08
06 Nov '08
Author: ceki
Date: Thu Nov 6 18:16:37 2008
New Revision: 1948
Added:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioAction.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioRandomUtil.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/TestScenario.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java
Removed:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMakerTest.java
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java
Log:
Refactoring test cases in relation to LBCLASSIC-83.
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java Thu Nov 6 18:16:37 2008
@@ -17,7 +17,7 @@
TestSuite suite = new TestSuite();
suite.addTest(new JUnit4TestAdapter(LoggerContextTest.class));
suite.addTest(new JUnit4TestAdapter(LoggerPerfTest.class));
- suite.addTest(new JUnit4TestAdapter(DynamicLoggerContextTest.class));
+ suite.addTest(new JUnit4TestAdapter(ScenarioBasedLoggerContextTest.class));
suite.addTest(new JUnit4TestAdapter(PatternLayoutTest.class));
suite.addTest(new JUnit4TestAdapter(LoggerTest.class));
suite.addTest(new JUnit4TestAdapter(LoggerSerializationTest.class));
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java Thu Nov 6 18:16:37 2008
@@ -12,57 +12,57 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.junit.Test;
-import ch.qos.logback.classic.control.ControlAction;
import ch.qos.logback.classic.control.ControlLogger;
import ch.qos.logback.classic.control.ControlLoggerContext;
import ch.qos.logback.classic.control.CreateLogger;
-import ch.qos.logback.classic.control.Scenario;
+import ch.qos.logback.classic.control.ScenarioAction;
import ch.qos.logback.classic.control.ScenarioMaker;
import ch.qos.logback.classic.control.SetLevel;
+import ch.qos.logback.classic.control.TestScenario;
-public class DynamicLoggerContextTest {
+public class ScenarioBasedLoggerContextTest {
LoggerContext lc;
@Test
- public void test3() {
- dynaTest(3);
+ public void testLen3() {
+ doScenarioedTest(3);
}
@Test
- public void test30() {
- dynaTest(30);
+ public void testLength_30() {
+ doScenarioedTest(30);
}
@Test
- public void test1000() {
- dynaTest(1000);
+ public void testLength_20000() {
+ doScenarioedTest(20*1000);
}
- //public void test50000() {
- //dynaTest(50000);
- //}
+ @Test
+ public void testLengthLong() {
+ doScenarioedTest(500*1000);
+ }
- private void dynaTest(int len) {
+ private void doScenarioedTest(int len) {
LoggerContext lc = new LoggerContext();
ControlLoggerContext controlContext = new ControlLoggerContext();
- Scenario s = ScenarioMaker.makeTypeBScenario(len);
+ TestScenario s = ScenarioMaker.makeRealisticCreationScenario(len);
List actionList = s.getActionList();
int size = actionList.size();
for (int i = 0; i < size; i++) {
- ControlAction action = (ControlAction) actionList.get(i);
+ ScenarioAction action = (ScenarioAction) actionList.get(i);
if (action instanceof CreateLogger) {
CreateLogger cl = (CreateLogger) action;
lc.getLogger(cl.getLoggerName());
controlContext.getLogger(cl.getLoggerName());
- } else {
+ } else if (action instanceof SetLevel) {
SetLevel sl = (SetLevel) action;
Logger l = lc.getLogger(sl.getLoggerName());
ControlLogger controlLogger = controlContext.getLogger(sl.getLoggerName());
@@ -71,29 +71,29 @@
}
}
- compare(controlContext, lc);
+ compareLoggerContexts(controlContext, lc);
}
- void compare(ControlLoggerContext controlLC, LoggerContext lc) {
- Map controlLoggerMap = controlLC.getLoggerMap();
+ void compareLoggerContexts(ControlLoggerContext controlLC, LoggerContext lc) {
+ Map<String, ControlLogger> controlLoggerMap = controlLC.getLoggerMap();
assertEquals(controlLoggerMap.size()+1, lc.size());
- for (Iterator i = controlLoggerMap.keySet().iterator(); i.hasNext();) {
- String loggerName = (String) i.next();
+ for (String loggerName: controlLoggerMap.keySet()) {
+
Logger logger = lc.exists(loggerName);
ControlLogger controlLogger = (ControlLogger) controlLoggerMap.get(loggerName);
if (logger == null) {
- throw new IllegalStateException("HLoggerr" + loggerName + " should exist");
+ throw new IllegalStateException("logger" + loggerName + " should exist");
}
assertEquals(loggerName, logger.getName());
assertEquals(loggerName, controlLogger.getName());
- assertCompare(controlLogger, logger);
+ compareLoggers(controlLogger, logger);
}
}
- void assertCompare(ControlLogger controlLogger, Logger logger) {
+ void compareLoggers(ControlLogger controlLogger, Logger logger) {
assertEquals(controlLogger.getName(), logger.getName());
assertEquals(controlLogger.getEffectiveLevel(), logger.getEffectiveLevel());
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java Thu Nov 6 18:16:37 2008
@@ -16,15 +16,18 @@
import ch.qos.logback.classic.Level;
/**
- * LoggerContext quite optimized for logger retrieval.
+ * This logger context quite optimized for logger retrieval.
*
- * It uses a single loggerMap where the key is the logger name and
- * the value is the logger.
+ * <p>It uses a single loggerMap where the key is the logger name and the value
+ * is the logger.
*
- * This approach acts a lower limit for what is acheivable for low memory usage
- * as well as low creation/retreival times. However, this simplicity also results
- * in slow effective level evaluation, the most frequently exercised part of the API.
+ * <p>This approach acts a lower limit for what is achievable for low memory
+ * usage as well as low creation/retrieval times. However, this simplicity also
+ * results in slow effective level evaluation, the most frequently exercised
+ * part of the API.
*
+ * <p>This class is expected to contain correct results, and serve to verify
+ * the correctness of a more sophisticated implementation.
*
* @author ceki
*/
@@ -33,8 +36,8 @@
private ControlLogger root;
//
// Hashtable loggerMap = new Hashtable();
- Map<String, ControlLogger> loggerMap = new HashMap<String, ControlLogger>();
-
+ Map<String, ControlLogger> loggerMap = new HashMap<String, ControlLogger>();
+
public ControlLoggerContext() {
this.root = new ControlLogger("root", null);
this.root.setLevel(Level.DEBUG);
@@ -42,7 +45,7 @@
/**
* Return this contexts root logger
- *
+ *
* @return
*/
public ControlLogger getRootLogger() {
@@ -75,7 +78,8 @@
while (true) {
i = name.indexOf(ClassicGlobal.LOGGER_SEPARATOR, i);
if (i == -1) {
- //System.out.println("FINAL-Creating logger named [" + name + "] with parent " + parent.getName());
+ // System.out.println("FINAL-Creating logger named [" + name + "] with
+ // parent " + parent.getName());
cl = new ControlLogger(name, parent);
loggerMap.put(name, cl);
return cl;
@@ -83,7 +87,8 @@
String parentName = name.substring(0, i);
ControlLogger p = (ControlLogger) loggerMap.get(parentName);
if (p == null) {
- //System.out.println("INTERMEDIARY-Creating logger [" + parentName + "] with parent " + parent.getName());
+ // System.out.println("INTERMEDIARY-Creating logger [" + parentName
+ // + "] with parent " + parent.getName());
p = new ControlLogger(parentName, parent);
loggerMap.put(parentName, p);
}
@@ -95,7 +100,7 @@
}
}
- public Map getLoggerMap() {
+ public Map<String, ControlLogger> getLoggerMap() {
return loggerMap;
}
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java Thu Nov 6 18:16:37 2008
@@ -10,7 +10,7 @@
package ch.qos.logback.classic.control;
-public class CreateLogger extends ControlAction {
+public class CreateLogger extends ScenarioAction {
final String loggerName;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java Thu Nov 6 18:16:37 2008
@@ -21,7 +21,7 @@
int len = 100000;
int AVERAGE = 5;
for(int i = 0; i < len; i++) {
- sum += RandomUtil.gaussianAsPositiveInt(AVERAGE, 2);
+ sum += ScenarioRandomUtil.gaussianAsPositiveInt(AVERAGE, 2);
}
double resultingAverage = sum/(1.0*len);
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioAction.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioAction.java Thu Nov 6 18:16:37 2008
@@ -1,14 +1,14 @@
/**
- * LOGBack: the generic, reliable, fast and flexible logging framework.
- *
- * Copyright (C) 1999-2006, 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.
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, 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.control;
-public class ControlAction {
+public class ScenarioAction {
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java Thu Nov 6 18:16:37 2008
@@ -1,80 +1,92 @@
-/**
- * LOGBack: the reliable, fast and flexible logging library for Java.
- *
- * Copyright (C) 1999-2005, QOS.ch, LOGBack.com
- *
- * 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.
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, 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.control;
import java.util.LinkedList;
import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.Level;
public class ScenarioMaker {
-
private final static int AVERAGE_LOGGER_DEPTH = 4;
private final static int LOGGER_DEPT_DEV = 2;
-
+ // the frequency of a set levelInt event for every create logger event
+ private final static int CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY = 5;
+ private final static int SECOND_SET_LEVEL_FREQUENCY = 3;
+
+
/**
- * Makes a scenario with len logger creations. Logger names are generated independently such that the overwhelming
- * majority of logger names will unrelated to each other. Each logger creation may be followed with a randomly
- * generated set levelInt action on that logger.
- *
+ * Makes a scenario with len logger creations. Logger names are generated
+ * independently such that the overwhelming majority of logger names will be
+ * unrelated to each other. Each logger creation may be followed with a
+ * randomly generated set levelInt action on that logger.
+ *
* @param len
* @return
*/
- static public Scenario makeTypeAScenario(int len) {
- Scenario scenario = new Scenario();
+ static public TestScenario makeTypeAScenario(int len) {
+ TestScenario scenario = new TestScenario();
;
for (int i = 0; i < len; i++) {
- String loggerName = RandomUtil.randomLoggerName(AVERAGE_LOGGER_DEPTH, LOGGER_DEPT_DEV);
- scenario.addAction(new CreateLogger(loggerName));
+ String loggerName = ScenarioRandomUtil.randomLoggerName(AVERAGE_LOGGER_DEPTH,
+ LOGGER_DEPT_DEV);
+ scenario.add(new CreateLogger(loggerName));
}
return scenario;
}
- static public Scenario makeTypeBScenario(int len) {
- Scenario scenario = new Scenario();
+ static public TestScenario makeRealisticCreationScenario(int len) {
+ TestScenario scenario = new TestScenario();
LinkedList<String> queue = new LinkedList<String>();
int loggerCreationCount = 0;
// add an empty string to get going
queue.add("");
- // add another string to reduce the probability of having an
- // empty queue (this happens when we create several leaf nodes
- // successively
- queue.add("xxxx");
-
while (loggerCreationCount < len) {
- if (queue.isEmpty()) {
- throw new IllegalStateException("Queue cannot be empty.");
- }
-
String loggerName = (String) queue.removeFirst();
- //System.out.println("logger name is [" + loggerName + "]");
- int childrenCount = RandomUtil.randomChildrenCount(loggerName);
- //System.out.println("children count is " + childrenCount);
- // add only leaf loggers
- if (childrenCount == 0) {
- scenario.addAction(new CreateLogger(loggerName));
+ int randomChildrenCount = ScenarioRandomUtil.randomChildrenCount(loggerName);
+
+ if (randomChildrenCount == 0) {
+ scenario.add(new CreateLogger(loggerName));
+ addSetLevelSubScenario(scenario, loggerName);
loggerCreationCount++;
} else {
- for (int i = 0; i < childrenCount; i++) {
+ for (int i = 0; i < randomChildrenCount; i++) {
String childName;
if (loggerName.equals("")) {
- childName = RandomUtil.randomId();
+ childName = ScenarioRandomUtil.randomId();
} else {
- childName = loggerName + ClassicGlobal.LOGGER_SEPARATOR + RandomUtil.randomId();
+ childName = loggerName + ClassicGlobal.LOGGER_SEPARATOR
+ + ScenarioRandomUtil.randomId();
}
queue.add(childName);
+ addSetLevelSubScenario(scenario, loggerName);
+ loggerCreationCount++;
}
}
}
return scenario;
}
+
+ static void addSetLevelSubScenario(TestScenario scenario, String loggerName) {
+ if(ScenarioRandomUtil.oneInFreq(CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY)) {
+ Level l = ScenarioRandomUtil.randomLevel();
+ scenario.add(new SetLevel(l, loggerName));
+ if(ScenarioRandomUtil.oneInFreq(SECOND_SET_LEVEL_FREQUENCY)) {
+ l = ScenarioRandomUtil.randomLevel();
+ scenario.add(new SetLevel(l, loggerName));
+ }
+ }
+ }
+
+
}
\ No newline at end of file
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioRandomUtil.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioRandomUtil.java Thu Nov 6 18:16:37 2008
@@ -13,7 +13,7 @@
import ch.qos.logback.classic.Level;
-public class RandomUtil {
+public class ScenarioRandomUtil {
private final static long SEED = 74130;
private final static Random random = new Random(SEED);
@@ -28,18 +28,23 @@
}
public static Level randomLevel() {
- int rl = random.nextInt(4);
+ int rl = random.nextInt(6);
switch (rl) {
- case 0:
- return Level.DEBUG;
- case 1:
- return Level.INFO;
- case 2:
- return Level.WARN;
- case 3:
- return Level.ERROR;
- default:
- throw new IllegalStateException("rl should have been a value between 0 to 3, but it is " + rl);
+ case 0:
+ return null;
+ case 1:
+ return Level.TRACE;
+ case 2:
+ return Level.DEBUG;
+ case 3:
+ return Level.INFO;
+ case 4:
+ return Level.WARN;
+ case 5:
+ return Level.ERROR;
+ default:
+ throw new IllegalStateException(
+ "rl should have been a value between 0 to 5, but it is " + rl);
}
}
@@ -69,18 +74,20 @@
/**
* Approximate a gaussian distrib with only only positive integer values
- *
+ *
* @param average
* @param stdDeviation
* @return
*/
public static int gaussianAsPositiveInt(int average, int stdDeviation) {
if (average < 1) {
- throw new IllegalArgumentException("The average must not be smaller than 1.");
+ throw new IllegalArgumentException(
+ "The average must not be smaller than 1.");
}
if (stdDeviation < 1) {
- throw new IllegalArgumentException("The stdDeviation must not be smaller than 1.");
+ throw new IllegalArgumentException(
+ "The stdDeviation must not be smaller than 1.");
}
double d = random.nextGaussian() * stdDeviation + average;
@@ -92,23 +99,21 @@
}
/**
- * Returns 3 for root, 3 for children of root, 9 for offspring of generation 2 and 3, and for generations 4
- * and later, return 0 wuth probabbility 0.5 and a guassion (average=AVERAGE_CHILDREN_COUNT) with probability 0.5.
- *
+ * Returns 3 for root, 3 for children of root, 9 for offspring of generation 2
+ * and 3, and for generations 4 and later, return 0 with probability 0.5 and a
+ * gaussian (average=AVERAGE_CHILDREN_COUNT) with probability 0.5.
+ *
* @param name
* @return
*/
public static int randomChildrenCount(String name) {
- if ("".equals(name)) {
- return 3;
- }
int dots = dotCount(name);
- if (dots == 1) {
+ if (dots <= 1) {
return 3;
} else if (dots == 2 || dots == 3) {
return 9;
} else {
- if (hasChildren(0.5)) {
+ if (shouldHaveChildrenWithProbabilitz(0.5)) {
return gaussianAsPositiveInt(AVERAGE_CHILDREN_COUNT, CHILDREN_COUNT_VAR);
} else {
return 0;
@@ -119,13 +124,14 @@
/**
* Returns true with probability p.
- *
+ *
* @param p
* @return
*/
- static boolean hasChildren(double p) {
+ static boolean shouldHaveChildrenWithProbabilitz(double p) {
if (p < 0 || p > 1.0) {
- throw new IllegalArgumentException("p must be a value between 0 and 1.0, it was " + p + " instead.");
+ throw new IllegalArgumentException(
+ "p must be a value between 0 and 1.0, it was " + p + " instead.");
}
double r = random.nextDouble();
if (r < p) {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java Thu Nov 6 18:16:37 2008
@@ -11,7 +11,7 @@
import ch.qos.logback.classic.Level;
-public class SetLevel extends ControlAction {
+public class SetLevel extends ScenarioAction {
final String loggerName;
final Level level;
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/TestScenario.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/TestScenario.java Thu Nov 6 18:16:37 2008
@@ -13,31 +13,23 @@
import java.util.List;
import java.util.Vector;
-import ch.qos.logback.classic.Level;
+public class TestScenario {
-public class Scenario {
- // the frequency of a set levelInt event for every create logger event
- private final static int CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY = 5;
+ private List<ScenarioAction> actionList = new Vector<ScenarioAction>();
- private List<ControlAction> actionList = new Vector<ControlAction>();
-
- public void addAction(CreateLogger action) {
+ public void add(ScenarioAction action) {
actionList.add(action);
- if(RandomUtil.oneInFreq(CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY)) {
- Level l = RandomUtil.randomLevel();
- actionList.add(new SetLevel(l, action.getLoggerName()));
- }
}
- public List<ControlAction> getActionList() {
- return new ArrayList<ControlAction>(actionList);
+ public List<ScenarioAction> getActionList() {
+ return new ArrayList<ScenarioAction>(actionList);
}
public int size() {
return actionList.size();
}
- public ControlAction get(int i) {
- return (ControlAction) actionList.get(i);
+ public ScenarioAction get(int i) {
+ return (ScenarioAction) actionList.get(i);
}
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Thu Nov 6 18:16:37 2008
@@ -2,6 +2,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.lang.management.ManagementFactory;
@@ -13,8 +14,9 @@
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.slf4j.Logger;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.core.testUtil.RandomUtil;
@@ -86,13 +88,31 @@
}
@Test
- public void getLoggerLevel() {
+ public void getLoggerLevel_LBCLASSIC_78() {
String objectNameAsStr = "ch.qos"+diff + ":Name=" + lc.getName()
+ ",Type=" + this.getClass().getName();
ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
JMXConfigurator configurator = new JMXConfigurator(lc, mbs, on);
- configurator.getLoggerLevel(testLogger.getName());
+ assertEquals("", configurator.getLoggerLevel(testLogger.getName()));
+ MBeanUtil.unregister(lc, mbs, on, this);
+ }
+
+
+ @Test
+ public void setLoggerLevel_LBCLASSIC_79() {
+ String objectNameAsStr = "ch.qos"+diff + ":Name=" + lc.getName()
+ + ",Type=" + this.getClass().getName();
+
+ ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
+ JMXConfigurator configurator = new JMXConfigurator(lc, mbs, on);
+ configurator.setLoggerLevel(testLogger.getName(), "DEBUG");
+ assertEquals(Level.DEBUG, testLogger.getLevel());
+
+ configurator.setLoggerLevel(testLogger.getName(), "null");
+ assertNull(testLogger.getLevel());
+
+ MBeanUtil.unregister(lc, mbs, on, this);
}
}
1
0

svn commit: r1947 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic main/java/ch/qos/logback/classic/jmx main/java/ch/qos/logback/classic/joran/action test/java/ch/qos/logback/classic test/java/ch/qos/logback/classic/jmx
by noreply.ceki@qos.ch 06 Nov '08
by noreply.ceki@qos.ch 06 Nov '08
06 Nov '08
Author: ceki
Date: Thu Nov 6 15:09:53 2008
New Revision: 1947
Added:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTest.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java
Removed:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java
Log:
This commit is related to:
LBCLASSIC-83 (Logger.setLevel(null) may throw an NPE)
LBCLASSIC-61 (configurable ObjectName)
LBCLASSIC-24 (better error messages after reload)
LBCLASSIC-33 (JMX configurator unregisters itself)
LBCLASSIC-78 (NPE in JMXConfigurator getLoggerLevel)
LBCLASSIC-79 (NPE in JMXConfigurator setLoggerLevel)
While testing LBCLASSIC 61,24 and 33, I wanted to correct LBCLASSIC-78
and LBCLASSIC-79 which are related to JMXConfigurator. It turns out
that LBCLASSIC-79 has a much deeper cause identified in LBCLASSIC-83.
Work on LBCLASSIC 61,24 and 33 is still ongoing. The present commit
reflects the nature of that ongoing and incomplete work.
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java Thu Nov 6 15:09:53 2008
@@ -127,39 +127,8 @@
return parent == null;
}
- /**
- * Get a child by its suffix.
- *
- * <p> IMPORTANT: Calls to this method must be within a synchronized block on
- * this logger!
- *
- * @param suffix
- * @return
- */
- Logger getChildBySuffix(final String suffix) {
- if (childrenList == null) {
- return null;
- } else {
- int len = this.childrenList.size();
- int childNameOffset;
- if (isRootLogger()) {
- childNameOffset = 0;
- } else {
- childNameOffset = this.name.length() + 1;
- }
-
- for (int i = 0; i < len; i++) {
- final Logger childLogger = (Logger) childrenList.get(i);
- final String childName = childLogger.getName();
-
- if (suffix.equals(childName.substring(childNameOffset))) {
- return childLogger;
- }
- }
- // no child found
- return null;
- }
- }
+ // Logger getChildBySuffix(final String suffix) method was here and got
+ // removed.
Logger getChildByName(final String childName) {
if (childrenList == null) {
@@ -185,7 +154,15 @@
return;
}
level = newLevel;
- effectiveLevelInt = newLevel.levelInt;
+ if (newLevel == null) {
+ if (isRootLogger()) {
+ throw new IllegalArgumentException("The level of the root logger cannot be set to null");
+ } else {
+ effectiveLevelInt = parent.effectiveLevelInt;
+ }
+ } else {
+ effectiveLevelInt = newLevel.levelInt;
+ }
if (childrenList != null) {
int len = childrenList.size();
for (int i = 0; i < len; i++) {
@@ -390,8 +367,9 @@
final Marker marker, final Level level, final String msg,
final Object[] params, final Throwable t) {
- final FilterReply decision = loggerContext.getTurboFilterChainDecision_0_3OrMore(
- marker, this, level, msg, params, t);
+ final FilterReply decision = loggerContext
+ .getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg,
+ params, t);
if (decision == FilterReply.NEUTRAL) {
if (effectiveLevelInt > level.levelInt) {
@@ -403,7 +381,7 @@
buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t);
}
-
+
private final void filterAndLog_1(final String localFQCN,
final Marker marker, final Level level, final String msg,
final Object param, final Throwable t) {
@@ -423,7 +401,6 @@
new Object[] { param }, t);
}
-
private final void filterAndLog_2(final String localFQCN,
final Marker marker, final Level level, final String msg,
final Object param1, final Object param2, final Throwable t) {
@@ -443,8 +420,6 @@
param1, param2 }, t);
}
-
-
private void buildLoggingEventAndAppend(final String localFQCN,
final Marker marker, final Level level, final String msg,
final Object[] params, final Throwable t) {
@@ -493,7 +468,7 @@
filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, msg, null, t);
}
- final public boolean isDebugEnabled() {
+ final public boolean isDebugEnabled() {
return isDebugEnabled(null);
}
@@ -509,7 +484,7 @@
throw new IllegalStateException("Unknown FilterReply value: " + decision);
}
}
-
+
final public void debug(String msg) {
filterAndLog_0_Or3Plus(FQCN, null, Level.DEBUG, msg, null, null);
}
@@ -593,7 +568,7 @@
public boolean isInfoEnabled() {
return isInfoEnabled(null);
}
-
+
public boolean isInfoEnabled(Marker marker) {
FilterReply decision = callTurboFilters(marker, Level.INFO);
if (decision == FilterReply.NEUTRAL) {
@@ -606,7 +581,7 @@
throw new IllegalStateException("Unknown FilterReply value: " + decision);
}
}
-
+
public void info(String msg) {
filterAndLog_0_Or3Plus(FQCN, null, Level.INFO, msg, null, null);
}
@@ -664,8 +639,6 @@
}
}
-
-
public final boolean isErrorEnabled() {
return isErrorEnabled(null);
}
@@ -683,7 +656,6 @@
}
}
-
public boolean isWarnEnabled() {
return isWarnEnabled(null);
}
@@ -783,8 +755,8 @@
* @return the reply given by the TurboFilters
*/
private FilterReply callTurboFilters(Marker marker, Level level) {
- return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, level, null,
- null, null);
+ return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this,
+ level, null, null, null);
}
/**
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java Thu Nov 6 15:09:53 2008
@@ -65,6 +65,7 @@
public LoggerContext() {
super();
+ System.out.println(" LoggerContext()=============================================================");
this.loggerCache = new Hashtable<String, Logger>();
this.loggerContextRemoteView = new LoggerContextRemoteView(this);
this.root = new Logger(ROOT_NAME, null, this);
@@ -128,7 +129,7 @@
// in between as well (if they don't already exist)
String childName;
while (true) {
- int h = name.indexOf('.', i);
+ int h = name.indexOf(ClassicGlobal.LOGGER_SEPARATOR, i);
if (h == -1) {
childName = name;
} else {
@@ -189,6 +190,10 @@
return loggerContextRemoteView;
}
+ @Override
+ protected void finalize() {
+ System.out.println("**************** LoggerContext finalized");
+ }
public void reset() {
root.recursiveReset();
clearAllTurboFilters();
@@ -300,8 +305,8 @@
started = false;
}
- @Override
- public String toString() {
- return this.getClass().getName() + "[" + getName() + "]";
- }
+// @Override
+// public String toString() {
+// return this.getClass().getName() + "[" + getName() + "]";
+// }
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java Thu Nov 6 15:09:53 2008
@@ -31,6 +31,7 @@
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.spi.ContextAwareBase;
import ch.qos.logback.core.status.Status;
+import ch.qos.logback.core.status.StatusListener;
import ch.qos.logback.core.status.StatusListenerAsList;
import ch.qos.logback.core.status.StatusManager;
import ch.qos.logback.core.util.StatusPrinter;
@@ -55,6 +56,12 @@
final MBeanServer mbs;
final ObjectName objectName;
+
+ @Override
+ protected void finalize() {
+ System.out.println("**************** JMXConfigurator finalized");
+ }
+
public JMXConfigurator(LoggerContext loggerContext, MBeanServer mbs,
ObjectName objectName) {
this.context = loggerContext;
@@ -105,20 +112,27 @@
}
}
+ void addStatusListener(StatusListener statusListener) {
+ StatusManager sm = loggerContext.getStatusManager();
+ sm.add(statusListener);
+ }
+
public void reloadByURL(URL url) throws JoranException {
StatusListenerAsList statusListenerAsList = new StatusListenerAsList();
- StatusManager sm = loggerContext.getStatusManager();
- sm.add(statusListenerAsList);
+ addStatusListener(statusListenerAsList);
addInfo("Resetting context: " + loggerContext.getName());
loggerContext.reset();
+ addStatusListener(statusListenerAsList);
+
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
configurator.doConfigure(url);
addInfo("Context: " + loggerContext.getName() + " reloaded.");
} finally {
+ System.out.println("*************** printing");
StatusPrinter.print(statusListenerAsList.getStatusList());
}
}
@@ -156,7 +170,7 @@
LoggerContext lc = (LoggerContext) context;
Logger logger = lc.exists(loggerName);
- if (logger != null) {
+ if (logger != null && logger.getLevel() != null) {
return logger.getLevel().toString();
} else {
return EMPTY;
@@ -205,6 +219,7 @@
* unregistered
*/
public void onReset(LoggerContext context) {
+ System.out.println("Unregistering JMXConfigurator");
if (mbs.isRegistered(objectName)) {
try {
addInfo("Unregistering mbean [" + objectName + "]");
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java Thu Nov 6 15:09:53 2008
@@ -34,7 +34,7 @@
ObjectName objectName = MBeanUtil.string2ObjectName(context, this,
objectNameAsStr);
- if (objectName == null) {
+ if (objectName != null) {
MBeanUtil.register((LoggerContext) context, objectName, this);
}
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTest.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTest.java Thu Nov 6 15:09:53 2008
@@ -9,54 +9,66 @@
*/
package ch.qos.logback.classic;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.List;
+
+import org.junit.Test;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.read.ListAppender;
-import ch.qos.logback.core.util.StatusPrinter;
+import ch.qos.logback.core.status.Status;
+
+public class LoggerTest {
-public class BasicLoggerTest extends TestCase {
+ LoggerContext lc = new LoggerContext();
+ Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
+ Logger loggerTest = lc.getLogger(LoggerTest.class);
- public void testBasic() {
- LoggerContext lc = new LoggerContext();
+ ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>();
+
+ @Test
+ public void smoke() {
ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>();
listAppender.start();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
root.addAppender(listAppender);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
+ Logger logger = lc.getLogger(LoggerTest.class);
assertEquals(0, listAppender.list.size());
logger.debug("hello");
assertEquals(1, listAppender.list.size());
}
+ @Test
public void testNoStart() {
- LoggerContext lc = new LoggerContext();
- ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>();
// listAppender.start();
listAppender.setContext(lc);
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
root.addAppender(listAppender);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
+ Logger logger = lc.getLogger(LoggerTest.class);
logger.debug("hello");
- StatusPrinter.print(lc.getStatusManager());
+
+ List<Status> statusList = lc.getStatusManager().getCopyOfStatusList();
+ Status s0 = statusList.get(0);
+ assertEquals(Status.WARN, s0.getLevel());
+ assertTrue(s0.getMessage().startsWith("Attempted to append to non started"));
}
+ @Test
public void testAdditive() {
- LoggerContext lc = new LoggerContext();
- ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>();
listAppender.start();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
root.addAppender(listAppender);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- logger.addAppender(listAppender);
- logger.setAdditive(false);
- logger.debug("hello");
+ loggerTest.addAppender(listAppender);
+ loggerTest.setAdditive(false);
+ loggerTest.debug("hello");
// 1 instead of two, since logger is not additive
assertEquals(1, listAppender.list.size());
}
+ @Test
public void testRootLogger() {
Logger logger = (Logger) LoggerFactory.getLogger(LoggerContext.ROOT_NAME);
LoggerContext lc = logger.getLoggerContext();
@@ -66,112 +78,115 @@
LoggerContext.ROOT_NAME);
assertTrue("logger instances should be indentical", logger == lc.root);
}
-
+
+ @Test
public void testBasicFiltering() throws Exception {
- LoggerContext lc = new LoggerContext();
- ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>();
listAppender.start();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
root.addAppender(listAppender);
root.setLevel(Level.INFO);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- logger.debug("x");
+ loggerTest.debug("x");
assertEquals(0, listAppender.list.size());
- logger.info("x");
- logger.warn("x");
- logger.error("x");
+ loggerTest.info("x");
+ loggerTest.warn("x");
+ loggerTest.error("x");
assertEquals(3, listAppender.list.size());
}
- public void testEnabledX_All() throws Exception {
- LoggerContext lc = new LoggerContext();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
+ void checkLevelThreshold(Logger logger, Level threshold) {
+
+ if (Level.ERROR_INT >= threshold.levelInt) {
+ assertTrue(logger.isErrorEnabled());
+ assertTrue(logger.isEnabledFor(Level.ERROR));
+ } else {
+ assertFalse(logger.isErrorEnabled());
+ assertFalse(logger.isEnabledFor(Level.ERROR));
+ }
+
+ if (Level.WARN_INT >= threshold.levelInt) {
+ assertTrue(logger.isWarnEnabled());
+ assertTrue(logger.isEnabledFor(Level.WARN));
+ } else {
+ assertFalse(logger.isWarnEnabled());
+ assertFalse(logger.isEnabledFor(Level.WARN));
+ }
+ if (Level.INFO_INT >= threshold.levelInt) {
+ assertTrue(logger.isInfoEnabled());
+ assertTrue(logger.isEnabledFor(Level.INFO));
+ } else {
+ assertFalse(logger.isInfoEnabled());
+ assertFalse(logger.isEnabledFor(Level.INFO));
+ }
+ if (Level.DEBUG_INT >= threshold.levelInt) {
+ assertTrue(logger.isDebugEnabled());
+ assertTrue(logger.isEnabledFor(Level.DEBUG));
+ } else {
+ assertFalse(logger.isDebugEnabled());
+ assertFalse(logger.isEnabledFor(Level.DEBUG));
+ }
+ if (Level.TRACE_INT >= threshold.levelInt) {
+ assertTrue(logger.isTraceEnabled());
+ assertTrue(logger.isEnabledFor(Level.TRACE));
+ } else {
+ assertFalse(logger.isTraceEnabled());
+ assertFalse(logger.isEnabledFor(Level.TRACE));
+ }
+
+ }
+
+ @Test
+ public void testEnabled_All() throws Exception {
root.setLevel(Level.ALL);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- assertTrue(logger.isDebugEnabled());
- assertTrue(logger.isInfoEnabled());
- assertTrue(logger.isWarnEnabled());
- assertTrue(logger.isErrorEnabled());
- assertTrue(logger.isEnabledFor(Level.DEBUG));
- assertTrue(logger.isEnabledFor(Level.INFO));
- assertTrue(logger.isEnabledFor(Level.WARN));
- assertTrue(logger.isEnabledFor(Level.ERROR));
+ checkLevelThreshold(loggerTest, Level.ALL);
}
-
- public void testEnabledX_Debug() throws Exception {
- LoggerContext lc = new LoggerContext();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
+
+ @Test
+ public void testEnabled_Debug() throws Exception {
root.setLevel(Level.DEBUG);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- assertTrue(logger.isDebugEnabled());
- assertTrue(logger.isInfoEnabled());
- assertTrue(logger.isWarnEnabled());
- assertTrue(logger.isErrorEnabled());
- assertTrue(logger.isEnabledFor(Level.DEBUG));
- assertTrue(logger.isEnabledFor(Level.INFO));
- assertTrue(logger.isEnabledFor(Level.WARN));
- assertTrue(logger.isEnabledFor(Level.ERROR));
+ checkLevelThreshold(loggerTest, Level.DEBUG);
}
-
-
-
- public void testEnabledX_Info() throws Exception {
- LoggerContext lc = new LoggerContext();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
+
+ @Test
+ public void testEnabled_Info() throws Exception {
root.setLevel(Level.INFO);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- assertFalse(logger.isDebugEnabled());
- assertTrue(logger.isInfoEnabled());
- assertTrue(logger.isWarnEnabled());
- assertTrue(logger.isErrorEnabled());
- assertFalse(logger.isEnabledFor(Level.DEBUG));
- assertTrue(logger.isEnabledFor(Level.INFO));
- assertTrue(logger.isEnabledFor(Level.WARN));
- assertTrue(logger.isEnabledFor(Level.ERROR));
+ checkLevelThreshold(loggerTest, Level.INFO);
}
-
+
+ @Test
public void testEnabledX_Warn() throws Exception {
- LoggerContext lc = new LoggerContext();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
root.setLevel(Level.WARN);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- assertFalse(logger.isDebugEnabled());
- assertFalse(logger.isInfoEnabled());
- assertTrue(logger.isWarnEnabled());
- assertTrue(logger.isErrorEnabled());
- assertFalse(logger.isEnabledFor(Level.DEBUG));
- assertFalse(logger.isEnabledFor(Level.INFO));
- assertTrue(logger.isEnabledFor(Level.WARN));
- assertTrue(logger.isEnabledFor(Level.ERROR));
+ checkLevelThreshold(loggerTest, Level.WARN);
}
-
+
public void testEnabledX_Errror() throws Exception {
- LoggerContext lc = new LoggerContext();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
root.setLevel(Level.ERROR);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- assertFalse(logger.isDebugEnabled());
- assertFalse(logger.isInfoEnabled());
- assertFalse(logger.isWarnEnabled());
- assertTrue(logger.isErrorEnabled());
- assertFalse(logger.isEnabledFor(Level.DEBUG));
- assertFalse(logger.isEnabledFor(Level.INFO));
- assertFalse(logger.isEnabledFor(Level.WARN));
- assertTrue(logger.isEnabledFor(Level.ERROR));
+ checkLevelThreshold(loggerTest, Level.ERROR);
}
+ @Test
public void testEnabledX_Off() throws Exception {
- LoggerContext lc = new LoggerContext();
- Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
root.setLevel(Level.OFF);
- Logger logger = lc.getLogger(BasicLoggerTest.class);
- assertFalse(logger.isDebugEnabled());
- assertFalse(logger.isInfoEnabled());
- assertFalse(logger.isWarnEnabled());
- assertFalse(logger.isErrorEnabled());
- assertFalse(logger.isEnabledFor(Level.DEBUG));
- assertFalse(logger.isEnabledFor(Level.INFO));
- assertFalse(logger.isEnabledFor(Level.WARN));
- assertFalse(logger.isEnabledFor(Level.ERROR));
+ checkLevelThreshold(loggerTest, Level.OFF);
+ }
+
+ @Test
+ public void setRootLevelToNull() {
+ try {
+ root.setLevel(null);
+ fail("The level of the root logger should not be settable to null");
+ } catch (IllegalArgumentException e) {
+ }
+ }
+
+ @Test
+ public void setLevelToNull_A() {
+ loggerTest.setLevel(null);
+ assertEquals(root.getEffectiveLevel(), loggerTest.getEffectiveLevel());
+ }
+
+ @Test
+ public void setLevelToNull_B() {
+ loggerTest.setLevel(Level.DEBUG);
+ loggerTest.setLevel(null);
+ assertEquals(root.getEffectiveLevel(), loggerTest.getEffectiveLevel());
}
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java Thu Nov 6 15:09:53 2008
@@ -19,7 +19,7 @@
suite.addTest(new JUnit4TestAdapter(LoggerPerfTest.class));
suite.addTest(new JUnit4TestAdapter(DynamicLoggerContextTest.class));
suite.addTest(new JUnit4TestAdapter(PatternLayoutTest.class));
- suite.addTestSuite(BasicLoggerTest.class);
+ suite.addTest(new JUnit4TestAdapter(LoggerTest.class));
suite.addTest(new JUnit4TestAdapter(LoggerSerializationTest.class));
suite.addTestSuite(MessageFormattingTest.class);
suite.addTestSuite(MDCTest.class);
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Thu Nov 6 15:09:53 2008
@@ -0,0 +1,98 @@
+package ch.qos.logback.classic.jmx;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.LoggerContextListener;
+import ch.qos.logback.core.testUtil.RandomUtil;
+
+public class JMXConfiguratorTest {
+
+ static MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ LoggerContext lc = new LoggerContext();
+ Logger testLogger = lc.getLogger(this.getClass());
+
+ List<LoggerContextListener> listenerList;
+ int diff = RandomUtil.getPositiveInt();
+
+ @Before
+ public void setUp() throws Exception {
+ lc.setName("context-" + diff);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ lc.reset();
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + "(" + lc.getName() + ")";
+ }
+
+ @Test
+ public void contextListening() {
+ String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName()
+ + ",Type=" + this.getClass().getName();
+ ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
+
+ MBeanUtil.register(lc, on, this);
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+ lc.reset();
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(0, listenerList.size());
+
+ MBeanUtil.register(lc, on, this);
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+
+ }
+
+ @Test
+ public void testRemovalOfPreviousIntanceFromTheContextListenerList() {
+ String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName()
+ + ",Type=" + this.getClass().getName();
+
+ ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
+ JMXConfigurator jmxConfigurator0 = MBeanUtil.register(lc, on, this);
+
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+ assertTrue(listenerList.contains(jmxConfigurator0));
+
+ JMXConfigurator jmxConfigurator1 = MBeanUtil.register(lc, on, this);
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+ assertFalse("old configurator should be absent", listenerList
+ .contains(jmxConfigurator0));
+ assertTrue("new configurator should be present", listenerList
+ .contains(jmxConfigurator1));
+
+ // StatusPrinter.print(lc);
+ }
+
+ @Test
+ public void getLoggerLevel() {
+ String objectNameAsStr = "ch.qos"+diff + ":Name=" + lc.getName()
+ + ",Type=" + this.getClass().getName();
+
+ ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
+ JMXConfigurator configurator = new JMXConfigurator(lc, mbs, on);
+ configurator.getLoggerLevel(testLogger.getName());
+ }
+
+}
1
0

[JIRA] Commented: (LBCLASSIC-31) Avoid printing stack traces under certain conditions
by Robert Elliot (JIRA) 05 Nov '08
by Robert Elliot (JIRA) 05 Nov '08
05 Nov '08
[ http://jira.qos.ch/browse/LBCLASSIC-31?page=com.atlassian.jira.plugin.syste… ]
Robert Elliot commented on LBCLASSIC-31:
----------------------------------------
Sorry, just worked it out - most of the time you would like just the message, but occasionally you might want to see the stack trace too.
Have you considered:
if (!logger.isDebugEnabled()) {
logger.info("message");
} else {
logger.debug("message", e);
}
It's a bit long winded, but it has the effect of allowing you to print the stack trace for debug and not for info, allowing you to choose how much appears in the log.
> Avoid printing stack traces under certain conditions
> ----------------------------------------------------
>
> Key: LBCLASSIC-31
> URL: http://jira.qos.ch/browse/LBCLASSIC-31
> Project: logback-classic
> Issue Type: Improvement
> Components: Other
> Affects Versions: unspecified
> Environment: Operating System: Windows
> Platform: PC
> Reporter: Ceki Gulcu
> Assignee: Logback dev list
> Priority: Minor
>
> It would be useful if under certain very specific conditions, logback avoided printing stack traces.
> In particular, in server applications IOEXceptions are thrown under normal conditions, such as when the client closes its connection to the server.
> Typical code would look like:
> try {
> event = (AuditEvent) ois.readObject();
> } catch (java.io.EOFException e) {
> logger.info("Caught java.io.EOFException closing connection.", e);
> break;
> } catch (IOException e) {
> logger.info("Caught java.io.IOException: ", e);
> break;
> } catch (ClassNotFoundException e) {
> logger.error("Unexpected ClassNotFoundException.", e);
> writeResponse(e);
> break;
> }
> Most of the time we would like to avoid printing the stack trace for the two exceptions but not the third.
> Possible solution:
> Marker ignoreST = MarkerFactgory.getMarker("IGNORE_STACK_TRACE");
> logger.info(ignoreST, "Caught java.io.EOFException closing connection.", e);
> Note that even if most of the time we would like to avoid printing the stack trace, it should still be possible to allow st printing by overriding some parameter.
--
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
0

[JIRA] Commented: (LBCLASSIC-31) Avoid printing stack traces under certain conditions
by Robert Elliot (JIRA) 05 Nov '08
by Robert Elliot (JIRA) 05 Nov '08
05 Nov '08
[ http://jira.qos.ch/browse/LBCLASSIC-31?page=com.atlassian.jira.plugin.syste… ]
Robert Elliot commented on LBCLASSIC-31:
----------------------------------------
I'm probably missing something, but if you don't want the stacktrace, why pass the exception to the info method?
> Avoid printing stack traces under certain conditions
> ----------------------------------------------------
>
> Key: LBCLASSIC-31
> URL: http://jira.qos.ch/browse/LBCLASSIC-31
> Project: logback-classic
> Issue Type: Improvement
> Components: Other
> Affects Versions: unspecified
> Environment: Operating System: Windows
> Platform: PC
> Reporter: Ceki Gulcu
> Assignee: Logback dev list
> Priority: Minor
>
> It would be useful if under certain very specific conditions, logback avoided printing stack traces.
> In particular, in server applications IOEXceptions are thrown under normal conditions, such as when the client closes its connection to the server.
> Typical code would look like:
> try {
> event = (AuditEvent) ois.readObject();
> } catch (java.io.EOFException e) {
> logger.info("Caught java.io.EOFException closing connection.", e);
> break;
> } catch (IOException e) {
> logger.info("Caught java.io.IOException: ", e);
> break;
> } catch (ClassNotFoundException e) {
> logger.error("Unexpected ClassNotFoundException.", e);
> writeResponse(e);
> break;
> }
> Most of the time we would like to avoid printing the stack trace for the two exceptions but not the third.
> Possible solution:
> Marker ignoreST = MarkerFactgory.getMarker("IGNORE_STACK_TRACE");
> logger.info(ignoreST, "Caught java.io.EOFException closing connection.", e);
> Note that even if most of the time we would like to avoid printing the stack trace, it should still be possible to allow st printing by overriding some parameter.
--
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
0
Author: ceki
Date: Tue Nov 4 20:23:14 2008
New Revision: 1945
Added:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfiguratorMBean.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/MBeanUtil.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextListener.java
- copied, changed from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/PackageTest.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusListenerAsList.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusUtil.java
Removed:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/XTurboFilterAttachable.java
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java
logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java
logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java
logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java
logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java
logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java
logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java
logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java
logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java
logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java
logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java
logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java
logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java
logback/trunk/logback-examples/src/main/java/chapter6/FilterEvents.java
logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java
logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java
Log:
This commit is related to:
LBCLASSIC-61 (configurable ObjectName)
LBCLASSIC-24 (better error messages after reload)
LBCLASSIC-33 (JMX configurator unregisters itself)
- Refactoring of LoggerContext class so it has a cleaner lifecycle
- Major refactorization of c.q.l.c.jmx.Configurator (renamed as JMXConfigurator) in order
to fix the aforementioned bugs
More updates to follow
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java Tue Nov 4 20:23:14 2008
@@ -20,7 +20,7 @@
import org.slf4j.ILoggerFactory;
import org.slf4j.Marker;
-import ch.qos.logback.classic.spi.ContextListener;
+import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.classic.spi.LoggerComparator;
import ch.qos.logback.classic.spi.LoggerContextRemoteView;
import ch.qos.logback.classic.spi.TurboFilterList;
@@ -50,7 +50,7 @@
final Logger root;
private int size;
private int noAppenderWarning = 0;
- final private List<ContextListener> contextListenerList = new ArrayList<ContextListener>();
+ final private List<LoggerContextListener> loggerContextListenerList = new ArrayList<LoggerContextListener>();
// We want loggerCache to be synchronized so Hashtable is a good choice. In
// practice, it performs a little faster than the map returned by
@@ -189,15 +189,24 @@
return loggerContextRemoteView;
}
- public void shutdownAndReset() {
+ public void reset() {
root.recursiveReset();
clearAllTurboFilters();
fireOnReset();
// TODO is it a good idea to reset the status listeners?
resetStatusListeners();
+ resetListeners();
+ }
+
+ /**
+ * @deprecated Please use reset() method instead
+ */
+
+ public void shutdownAndReset() {
+ reset();
}
- void resetStatusListeners() {
+ private void resetStatusListeners() {
StatusManager sm = getStatusManager();
for (StatusListener sl : sm.getCopyOfStatusListenerList()) {
sm.remove(sl);
@@ -207,7 +216,7 @@
public TurboFilterList getTurboFilterList() {
return turboFilterList;
}
-
+
public void addTurboFilter(TurboFilter newFilter) {
turboFilterList.add(newFilter);
}
@@ -246,26 +255,37 @@
format, new Object[] { param1, param2 }, t);
}
- public void addListener(ContextListener listener) {
- contextListenerList.add(listener);
+ // === start listeners ==============================================
+ public void addListener(LoggerContextListener listener) {
+ loggerContextListenerList.add(listener);
+ }
+
+ public void removeListener(LoggerContextListener listener) {
+ loggerContextListenerList.remove(listener);
}
- public void removeListener(ContextListener listener) {
- contextListenerList.remove(listener);
+ private void resetListeners() {
+ loggerContextListenerList.clear();
+ }
+
+ public List<LoggerContextListener> getCopyOfListenerList() {
+ return new ArrayList<LoggerContextListener>(loggerContextListenerList);
}
private void fireOnReset() {
- for (ContextListener listener : contextListenerList) {
+ for (LoggerContextListener listener : loggerContextListenerList) {
listener.onReset(this);
}
}
private void fireOnStart() {
- for (ContextListener listener : contextListenerList) {
+ for (LoggerContextListener listener : loggerContextListenerList) {
listener.onStart(this);
}
}
+ // === end listeners ==============================================
+
public boolean isStarted() {
return started;
}
@@ -276,6 +296,7 @@
}
public void stop() {
+ reset();
started = false;
}
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java (from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/Configurator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java Tue Nov 4 20:23:14 2008
@@ -9,69 +9,118 @@
*/
package ch.qos.logback.classic.jmx;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.classic.util.ContextInitializer;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.spi.ContextAwareBase;
import ch.qos.logback.core.status.Status;
+import ch.qos.logback.core.status.StatusListenerAsList;
+import ch.qos.logback.core.status.StatusManager;
+import ch.qos.logback.core.util.StatusPrinter;
/**
- * A class that provides access to logback components via
- * JMX.
+ * A class that provides access to logback components via JMX.
+ *
+ * <p>Since this class implements {@link JMXConfiguratorMBean} it has to be
+ * named as Configurator}.
*
- *
* @author Ceki Gülcü
* @author Sébastien Pennec
*
- * Contributor:
- * Sebastian Davids
- * See http://bugzilla.qos.ch/show_bug.cgi?id=35
+ * Contributor: Sebastian Davids See http://bugzilla.qos.ch/show_bug.cgi?id=35
*/
-public class Configurator extends ContextAwareBase implements
- ConfiguratorMBean {
+public class JMXConfigurator extends ContextAwareBase implements
+ JMXConfiguratorMBean, LoggerContextListener {
private static String EMPTY = "";
-
- public Configurator(LoggerContext loggerContext) {
+
+ final LoggerContext loggerContext;
+ final MBeanServer mbs;
+ final ObjectName objectName;
+
+ public JMXConfigurator(LoggerContext loggerContext, MBeanServer mbs,
+ ObjectName objectName) {
this.context = loggerContext;
+ this.loggerContext = loggerContext;
+ this.mbs = mbs;
+ this.objectName = objectName;
+ removePreviousInstanceAsListener();
+ loggerContext.addListener(this);
+ }
+
+ private void removePreviousInstanceAsListener() {
+ List<LoggerContextListener> lcll = loggerContext.getCopyOfListenerList();
+
+ for (LoggerContextListener lcl : lcll) {
+ if (lcl instanceof JMXConfigurator) {
+ JMXConfigurator jmxConfigurator = (JMXConfigurator) lcl;
+ if (objectName.equals(jmxConfigurator.objectName)) {
+ addInfo("Removing previous JMXConfigurator from the logger context listener list");
+ loggerContext.removeListener(lcl);
+ }
+ }
+ }
}
- public void reload() {
- LoggerContext lc = (LoggerContext) context;
- addInfo("Shutting down context: " + lc.getName());
- lc.shutdownAndReset();
- try {
- new ContextInitializer(lc).autoConfig();
- addInfo("Context: " + lc.getName() + " reloaded.");
- } catch(JoranException je) {
- addError("Reloading of context: " + lc.getName() + " failed.", je);
+ public void reloadDefaultConfiguration() throws JoranException {
+ ContextInitializer ci = new ContextInitializer(loggerContext);
+ URL url = ci.findURLOfDefaultConfigurationFile(true);
+ reloadByURL(url);
+ }
+
+ public void reloadByFileName(String fileName) throws JoranException,
+ FileNotFoundException {
+ File f = new File(fileName);
+ if (f.exists() && f.isFile()) {
+ URL url;
+ try {
+ url = f.toURI().toURL();
+ reloadByURL(url);
+ } catch (MalformedURLException e) {
+ throw new RuntimeException(
+ "Unexpected MalformedURLException occured. See nexted cause.", e);
+ }
+
+ } else {
+ String errMsg = "Could not find [" + fileName + "]";
+ addInfo(errMsg);
+ throw new FileNotFoundException(errMsg);
}
}
- public void reload(String fileName) throws JoranException {
- LoggerContext lc = (LoggerContext) context;
- addInfo("Shutting down context: " + lc.getName());
- lc.shutdownAndReset();
- JoranConfigurator configurator = new JoranConfigurator();
- configurator.setContext(lc);
- configurator.doConfigure(fileName);
- addInfo("Context: " + lc.getName() + " reloaded.");
- }
+ public void reloadByURL(URL url) throws JoranException {
+ StatusListenerAsList statusListenerAsList = new StatusListenerAsList();
+ StatusManager sm = loggerContext.getStatusManager();
+ sm.add(statusListenerAsList);
- public void reload(URL url) throws JoranException {
- LoggerContext lc = (LoggerContext) context;
- addInfo("Shutting down context: " + lc.getName());
- lc.shutdownAndReset();
- new ContextInitializer(lc).configureByResource(url);
- addInfo("Context: " + lc.getName() + " reloaded.");
+ addInfo("Resetting context: " + loggerContext.getName());
+ loggerContext.reset();
+
+ try {
+ JoranConfigurator configurator = new JoranConfigurator();
+ configurator.setContext(loggerContext);
+ configurator.doConfigure(url);
+ addInfo("Context: " + loggerContext.getName() + " reloaded.");
+ } finally {
+ StatusPrinter.print(statusListenerAsList.getStatusList());
+ }
}
public void setLoggerLevel(String loggerName, String levelStr) {
@@ -83,10 +132,10 @@
}
loggerName = loggerName.trim();
levelStr = levelStr.trim();
-
+
addInfo("Trying to set level " + levelStr + " to logger " + loggerName);
LoggerContext lc = (LoggerContext) context;
-
+
Logger logger = lc.getLogger(loggerName);
if ("null".equalsIgnoreCase(levelStr)) {
logger.setLevel(null);
@@ -102,9 +151,9 @@
if (loggerName == null) {
return EMPTY;
}
-
+
loggerName = loggerName.trim();
-
+
LoggerContext lc = (LoggerContext) context;
Logger logger = lc.exists(loggerName);
if (logger != null) {
@@ -118,9 +167,9 @@
if (loggerName == null) {
return EMPTY;
}
-
+
loggerName = loggerName.trim();
-
+
LoggerContext lc = (LoggerContext) context;
Logger logger = lc.exists(loggerName);
if (logger != null) {
@@ -131,23 +180,54 @@
}
public List<String> getLoggerList() {
- LoggerContext lc = (LoggerContext)context;
+ LoggerContext lc = (LoggerContext) context;
List<String> strList = new ArrayList<String>();
Iterator<Logger> it = lc.getLoggerList().iterator();
- while(it.hasNext()) {
+ while (it.hasNext()) {
Logger log = it.next();
strList.add(log.getName());
}
return strList;
}
-
+
public List<String> getStatuses() {
List<String> list = new ArrayList<String>();
- Iterator<Status> it = context.getStatusManager().getCopyOfStatusList().iterator();
- while(it.hasNext()) {
+ Iterator<Status> it = context.getStatusManager().getCopyOfStatusList()
+ .iterator();
+ while (it.hasNext()) {
list.add(it.next().toString());
}
return list;
}
+ /**
+ * When the associated LoggerContext is reset, this configurator must be
+ * unregistered
+ */
+ public void onReset(LoggerContext context) {
+ if (mbs.isRegistered(objectName)) {
+ try {
+ addInfo("Unregistering mbean [" + objectName + "]");
+ mbs.unregisterMBean(objectName);
+ } catch (InstanceNotFoundException e) {
+ // this is theoretically impossible
+ addError("Unable to find a verifiably registered mbean [" + objectName
+ + "]", e);
+ } catch (MBeanRegistrationException e) {
+ addError("Failed to unregister [" + objectName + "]", e);
+ }
+ } else {
+ addInfo("mbean [" + objectName
+ + "] was not in the mbean registry. This is OK.");
+ }
+
+ }
+
+ public void onStart(LoggerContext context) {
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + "(" + context.getName() + ")";
+ }
}
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfiguratorMBean.java (from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/ConfiguratorMBean.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfiguratorMBean.java Tue Nov 4 20:23:14 2008
@@ -9,18 +9,19 @@
*/
package ch.qos.logback.classic.jmx;
+import java.io.FileNotFoundException;
import java.net.URL;
import java.util.List;
import ch.qos.logback.core.joran.spi.JoranException;
-public interface ConfiguratorMBean {
+public interface JMXConfiguratorMBean {
- public void reload();
+ public void reloadDefaultConfiguration() throws JoranException;
- public void reload(String fileName) throws JoranException;
+ public void reloadByFileName(String fileName) throws JoranException, FileNotFoundException;
- public void reload(URL url) throws JoranException;
+ public void reloadByURL(URL url) throws JoranException;
public void setLoggerLevel(String loggerName, String levelStr);
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/MBeanUtil.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/MBeanUtil.java Tue Nov 4 20:23:14 2008
@@ -0,0 +1,96 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, 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.jmx;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.core.Context;
+import ch.qos.logback.core.status.StatusUtil;
+
+public class MBeanUtil {
+
+ static final String DOMAIN = "ch.qos.logback.classic";
+
+ static public String getObjectNameFor(Context context, Class type) {
+ String objectNameAsStr = DOMAIN + ":Name=" + context.getName() + ",Type="
+ + type.getName();
+ return objectNameAsStr;
+ }
+
+ public static ObjectName string2ObjectName(Context context, Object caller,
+ String objectNameAsStr) {
+ String msg = "Failed to convert [" + objectNameAsStr + "] to ObjectName";
+
+ try {
+ return new ObjectName(objectNameAsStr);
+ } catch (MalformedObjectNameException e) {
+ StatusUtil.addError(context, caller, msg, e);
+ return null;
+ } catch (NullPointerException e) {
+ StatusUtil.addError(context, caller, msg, e);
+ return null;
+ }
+ }
+
+ public static JMXConfigurator register(LoggerContext loggerContext,
+ ObjectName objectName, Object caller) {
+ try {
+ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+
+ JMXConfigurator jmxConfigurator = new JMXConfigurator(loggerContext,
+ mbs, objectName);
+
+ if (mbs.isRegistered(objectName)) {
+ StatusUtil.addWarn(loggerContext, caller,
+ "Unregistering existing MBean named ["
+ + objectName.getCanonicalName() + "]");
+ mbs.unregisterMBean(objectName);
+ }
+ mbs.registerMBean(jmxConfigurator, objectName);
+ return jmxConfigurator;
+ } catch (Exception e) {
+ StatusUtil.addError(loggerContext, caller, "Failed to create mbean", e);
+ return null;
+ }
+ }
+
+
+
+
+
+
+ public static void unregister(LoggerContext loggerContext, MBeanServer mbs,
+ ObjectName objectName, Object caller) {
+ if (mbs.isRegistered(objectName)) {
+ try {
+ StatusUtil.addInfo(loggerContext, caller, "Unregistering mbean ["
+ + objectName + "]");
+ mbs.unregisterMBean(objectName);
+ } catch (InstanceNotFoundException e) {
+ // this is theoretically impossible
+ e.printStackTrace();
+ } catch (MBeanRegistrationException e) {
+ // this also is theoretically impossible
+ e.printStackTrace();
+ }
+ } else {
+ StatusUtil.addInfo(loggerContext, caller, "mbean [" + objectName
+ + "] does not seem to be registered");
+ }
+ }
+
+}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java Tue Nov 4 20:23:14 2008
@@ -1,51 +1,48 @@
package ch.qos.logback.classic.joran.action;
-import java.lang.management.ManagementFactory;
-
-import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.xml.sax.Attributes;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.jmx.Configurator;
-import ch.qos.logback.classic.jmx.ConfiguratorMBean;
+import ch.qos.logback.classic.jmx.JMXConfigurator;
+import ch.qos.logback.classic.jmx.MBeanUtil;
import ch.qos.logback.core.joran.action.Action;
import ch.qos.logback.core.joran.spi.ActionException;
import ch.qos.logback.core.joran.spi.InterpretationContext;
+import ch.qos.logback.core.util.OptionHelper;
public class JMXConfiguratorAction extends Action {
- static final String DOMAIN = "ch.qos.logback.classic";
-
+ static String OBJECT_NAME_ATTRIBUTE_NAME = "objectName";
+
@Override
public void begin(InterpretationContext ec, String name, Attributes attributes)
throws ActionException {
- register();
- }
+ addInfo("begin");
- @Override
- public void end(InterpretationContext ec, String name) throws ActionException {
+ String objectNameAsStr;
+ String objectNameAttributeVal = attributes
+ .getValue(OBJECT_NAME_ATTRIBUTE_NAME);
+ if (OptionHelper.isEmpty(objectNameAttributeVal)) {
+ objectNameAsStr = MBeanUtil.getObjectNameFor((LoggerContext) context,
+ JMXConfigurator.class);
+ } else {
+ objectNameAsStr = objectNameAttributeVal;
+ }
+
+ ObjectName objectName = MBeanUtil.string2ObjectName(context, this,
+ objectNameAsStr);
+
+ if (objectName == null) {
+ MBeanUtil.register((LoggerContext) context, objectName, this);
+ }
}
- public void register() {
- ConfiguratorMBean configuratorMBean = new Configurator((LoggerContext) context);
+ @Override
+ public void end(InterpretationContext ec, String name) throws ActionException {
- MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
- try {
- ObjectName on = new ObjectName(DOMAIN + ":Name=" + context.getName()
- + ",Type=" + configuratorMBean.getClass().getName());
-
- // StandardMBean mbean = new StandardMBean(configuratorMBean,
- // ConfiguratorMBean.class);
- if (mbs.isRegistered(on)) {
- mbs.unregisterMBean(on);
- }
- mbs.registerMBean(configuratorMBean, on);
- } catch (Exception e) {
- addError("Failed to create mbean", e);
- }
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java Tue Nov 4 20:23:14 2008
@@ -160,7 +160,7 @@
static public void configureLC(LoggerContext lc, String configFile)
throws JoranException {
JoranConfigurator configurator = new JoranConfigurator();
- lc.shutdownAndReset();
+ lc.reset();
configurator.setContext(lc);
configurator.doConfigure(configFile);
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java Tue Nov 4 20:23:14 2008
@@ -119,7 +119,7 @@
if (url != null) {
try {
JoranConfigurator configurator = new JoranConfigurator();
- context.shutdownAndReset();
+ context.reset();
configurator.setContext(context);
configurator.doConfigure(url);
} catch (JoranException e) {
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java Tue Nov 4 20:23:14 2008
@@ -43,7 +43,7 @@
if (context != null) {
Logger logger = context.getLogger(LoggerContext.ROOT_NAME);
logger.warn("Shutting down context " + loggerContextName);
- context.shutdownAndReset();
+ context.reset();
} else {
System.out.println("No context named " + loggerContextName + " was found.");
}
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextListener.java (from r1899, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ContextListener.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextListener.java Tue Nov 4 20:23:14 2008
@@ -1,8 +1,17 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, 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.spi;
import ch.qos.logback.classic.LoggerContext;
-public interface ContextListener {
+public interface LoggerContextListener {
public void onReset(LoggerContext context);
public void onStart(LoggerContext context);
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java Tue Nov 4 20:23:14 2008
@@ -33,8 +33,7 @@
this.loggerContext = loggerContext;
}
- public void configureByResource(URL url)
- throws JoranException {
+ public void configureByResource(URL url) throws JoranException {
if (url == null) {
throw new IllegalArgumentException("URL argument cannot be null");
}
@@ -43,7 +42,7 @@
configurator.doConfigure(url);
}
- private URL findConfigFileURLFromSystemProperties() {
+ private URL findConfigFileURLFromSystemProperties(boolean updateStatus) {
String logbackConfigFile = System.getProperty(CONFIG_FILE_PROPERTY, null);
if (logbackConfigFile != null) {
URL result = null;
@@ -66,24 +65,38 @@
}
}
} finally {
- statusOnResourceSearch(logbackConfigFile, result);
+ if (updateStatus) {
+ statusOnResourceSearch(logbackConfigFile, result);
+ }
}
}
return null;
}
- public void autoConfig() throws JoranException {
- StatusListenerConfigHelper.installIfAsked(loggerContext);
+ public URL findURLOfDefaultConfigurationFile(boolean updateStatus) {
+ URL url = findConfigFileURLFromSystemProperties(updateStatus);
+ if (url != null) {
+ return url;
+ }
- URL url = findConfigFileURLFromSystemProperties();
- if (url == null) {
- url = Loader.getResourceBySelfClassLoader(TEST_AUTOCONFIG_FILE);
+ url = Loader.getResourceBySelfClassLoader(TEST_AUTOCONFIG_FILE);
+ if (updateStatus) {
statusOnResourceSearch(TEST_AUTOCONFIG_FILE, url);
}
- if (url == null) {
- url = Loader.getResourceBySelfClassLoader(AUTOCONFIG_FILE);
+ if (url != null) {
+ return url;
+ }
+
+ url = Loader.getResourceBySelfClassLoader(AUTOCONFIG_FILE);
+ if (updateStatus) {
statusOnResourceSearch(AUTOCONFIG_FILE, url);
}
+ return url;
+ }
+
+ public void autoConfig() throws JoranException {
+ StatusListenerConfigHelper.installIfAsked(loggerContext);
+ URL url = findURLOfDefaultConfigurationFile(true);
if (url != null) {
configureByResource(url);
} else {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java Tue Nov 4 20:23:14 2008
@@ -23,9 +23,9 @@
suite.addTest(ch.qos.logback.classic.util.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.control.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.joran.PackageTest.suite());
+ suite.addTest(ch.qos.logback.classic.jmx.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.boolex.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.selector.PackageTest.suite());
-
suite.addTest(ch.qos.logback.classic.html.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.net.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.pattern.PackageTest.suite());
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java Tue Nov 4 20:23:14 2008
@@ -134,7 +134,7 @@
public void testLoggingContextShutdownAndReset() {
addYesFilter();
assertNotNull(context.getTurboFilterList().get(0));
- context.shutdownAndReset();
+ context.reset();
assertEquals(0, context.getTurboFilterList().size());
}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Tue Nov 4 20:23:14 2008
@@ -0,0 +1,86 @@
+package ch.qos.logback.classic.jmx;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.LoggerContextListener;
+import ch.qos.logback.core.testUtil.RandomUtil;
+import ch.qos.logback.core.util.StatusPrinter;
+
+public class JMXConfiguratorTest {
+
+ static MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ LoggerContext lc = new LoggerContext();
+ List<LoggerContextListener> listenerList;
+ int diff = RandomUtil.getPositiveInt();
+
+ @Before
+ public void setUp() throws Exception {
+ lc.setName("context-" + diff);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ lc.reset();
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + "(" + lc.getName() + ")";
+ }
+
+ @Test
+ public void contextListening() {
+ String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName()
+ + ",Type=" + this.getClass().getName();
+ ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
+
+ MBeanUtil.register(lc, on, this);
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+ lc.reset();
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(0, listenerList.size());
+
+ MBeanUtil.register(lc, on, this);
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+
+ }
+
+ @Test
+ public void testRemovalOfPreviousIntanceFromTheContextListenerList() {
+ String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName()
+ + ",Type=" + this.getClass().getName();
+
+ ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
+ JMXConfigurator jmxConfigurator0 = MBeanUtil.register(lc, on, this);
+
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+ assertTrue(listenerList.contains(jmxConfigurator0));
+
+ JMXConfigurator jmxConfigurator1 = MBeanUtil.register(lc, on, this);
+ listenerList = lc.getCopyOfListenerList();
+ assertEquals(1, listenerList.size());
+ assertFalse("old configurator should be absent", listenerList.contains(jmxConfigurator0));
+ assertTrue("new configurator should be present", listenerList.contains(jmxConfigurator1));
+
+ StatusPrinter.print(lc);
+
+ }
+
+}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/PackageTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/PackageTest.java Tue Nov 4 20:23:14 2008
@@ -0,0 +1,25 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, 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.jmx;
+
+
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class PackageTest extends TestCase {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite();
+ suite.addTest(new JUnit4TestAdapter (JMXConfiguratorTest.class));
+ return suite;
+ }
+}
\ No newline at end of file
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java Tue Nov 4 20:23:14 2008
@@ -11,7 +11,7 @@
public static void main(String[] args) {
Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicAppenderTestApp.class);
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- lc.shutdownAndReset();
+ lc.reset();
JMSQueueAppender appender = new JMSQueueAppender();
appender.setContext(lc);
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java Tue Nov 4 20:23:14 2008
@@ -11,7 +11,7 @@
public static void main(String[] args) {
Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicAppenderTestApp.class);
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- lc.shutdownAndReset();
+ lc.reset();
JMSTopicAppender appender = new JMSTopicAppender();
appender.setContext(lc);
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java Tue Nov 4 20:23:14 2008
@@ -141,7 +141,7 @@
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure(TestConstants.JORAN_ONPUT_PREFIX
+ "/syslog_LBCLASSIC_50.xml");
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java Tue Nov 4 20:23:14 2008
@@ -2,7 +2,7 @@
import ch.qos.logback.classic.LoggerContext;
-public class BasicContextListener implements ContextListener {
+public class BasicContextListener implements LoggerContextListener {
boolean updated = false;
LoggerContext context;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java Tue Nov 4 20:23:14 2008
@@ -16,7 +16,7 @@
}
public void testNotifyOnReset() {
- context.shutdownAndReset();
+ context.reset();
assertTrue(listener.updated);
assertEquals(listener.context, context);
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationTest.java Tue Nov 4 20:23:14 2008
@@ -46,7 +46,7 @@
public void tearDown() throws Exception {
System.clearProperty(ContextInitializer.CONFIG_FILE_PROPERTY);
System.clearProperty(ContextInitializer.STATUS_LISTENER_CLASS);
- lc.shutdownAndReset();
+ lc.reset();
}
@Test
@@ -73,7 +73,7 @@
assertTrue(appender instanceof ConsoleAppender);
}
{
- lc.shutdownAndReset();
+ lc.reset();
Appender appender = root.getAppender("STDOUT");
assertNull(appender);
}
Modified: logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java (original)
+++ logback/trunk/logback-classic/src/test/java/org/dummy/Log4jInvocation.java Tue Nov 4 20:23:14 2008
@@ -23,7 +23,7 @@
@Before
public void fixture() {
lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- lc.shutdownAndReset();
+ lc.reset();
listAppender = new DummyLBAppender();
listAppender.setContext(lc);
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusListenerAsList.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusListenerAsList.java Tue Nov 4 20:23:14 2008
@@ -0,0 +1,34 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, 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.status;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Collect all incoming events in a list.
+ *
+ * @author Ceki Gülcü
+ *
+ */
+public class StatusListenerAsList implements StatusListener {
+
+ List<Status> statusList = new ArrayList<Status>();
+
+ public void addStatusEvent(Status status) {
+ statusList.add(status);
+ }
+
+ public List<Status> getStatusList() {
+ return statusList;
+ }
+
+
+}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusUtil.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/status/StatusUtil.java Tue Nov 4 20:23:14 2008
@@ -0,0 +1,38 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, 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.status;
+
+import ch.qos.logback.core.Context;
+
+public class StatusUtil {
+
+ static public void addStatus(Context context, Status status) {
+ if (context == null) {
+ return;
+ }
+ StatusManager sm = context.getStatusManager();
+ if (sm != null) {
+ sm.add(status);
+ }
+ }
+
+ static public void addInfo(Context context, Object caller, String msg) {
+ addStatus(context, new InfoStatus(msg, caller));
+ }
+
+ static public void addWarn(Context context, Object caller, String msg) {
+ addStatus(context, new WarnStatus(msg, caller));
+ }
+
+ static public void addError(Context context, Object caller, String msg,
+ Throwable t) {
+ addStatus(context, new ErrorStatus(msg, caller, t));
+ }
+}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java Tue Nov 4 20:23:14 2008
@@ -14,14 +14,15 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
+import java.util.List;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.Layout;
+import ch.qos.logback.core.helpers.ThrowableToStringArray;
import ch.qos.logback.core.status.ErrorStatus;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusManager;
-import ch.qos.logback.core.helpers.ThrowableToStringArray;
public class StatusPrinter {
@@ -35,8 +36,8 @@
}
/**
- * Print the contents of the context statuses, but only if they
- * contain errors.
+ * Print the contents of the context statuses, but only if they contain
+ * errors.
*
* @param context
*/
@@ -78,18 +79,29 @@
public static void print(StatusManager sm) {
StringBuilder sb = new StringBuilder();
- buildStr(sb, sm);
+ buildStrFromStatusManager(sb, sm);
ps.println(sb.toString());
}
- public static void buildStr(StringBuilder sb, StatusManager sm) {
- Iterator it = sm.getCopyOfStatusList().iterator();
+ public static void print(List<Status> statusList) {
+ StringBuilder sb = new StringBuilder();
+ buildStrFromStatusList(sb, statusList);
+ ps.println(sb.toString());
+ }
+
+
+ private static void buildStrFromStatusList(StringBuilder sb, List<Status> statusList) {
+ Iterator it = statusList.iterator();
while (it.hasNext()) {
Status s = (Status) it.next();
buildStr(sb, "", s);
}
}
+ private static void buildStrFromStatusManager(StringBuilder sb, StatusManager sm) {
+ buildStrFromStatusList(sb, sm.getCopyOfStatusList());
+ }
+
private static void appendThrowable(StringBuilder sb, Throwable t) {
String[] stringRep = ThrowableToStringArray.convert(t);
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java Tue Nov 4 20:23:14 2008
@@ -21,4 +21,11 @@
return r + 1024;
}
+ public static int getPositiveInt() {
+ int r = random.nextInt();
+ if (r < 0) {
+ r = -r;
+ }
+ return r;
+ }
}
Modified: logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter2/MyAppWithConfigFile.java Tue Nov 4 20:23:14 2008
@@ -26,7 +26,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
- lc.shutdownAndReset();
+ lc.reset();
configurator.setContext(lc);
configurator.doConfigure(args[0]);
} catch (JoranException je) {
Modified: logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter3/MyApp3.java Tue Nov 4 20:23:14 2008
@@ -33,7 +33,7 @@
configurator.setContext(lc);
// the context was probably already configured by default configuration
// rules
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure(args[0]);
} catch (JoranException je) {
je.printStackTrace();
Modified: logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/ConfigurationTester.java Tue Nov 4 20:23:14 2008
@@ -41,7 +41,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure(args[0]);
} catch (JoranException je) {
je.printStackTrace();
Modified: logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes1.java Tue Nov 4 20:23:14 2008
@@ -25,7 +25,7 @@
public static void main(String[] args) throws Exception {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- lc.shutdownAndReset(); // we want to override the default-config.
+ lc.reset(); // we want to override the default-config.
WriterAppender<LoggingEvent> writerAppender = new WriterAppender<LoggingEvent>();
writerAppender.setContext(lc);
writerAppender.setLayout(new EchoLayout<LoggingEvent>());
Modified: logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/ExitWoes2.java Tue Nov 4 20:23:14 2008
@@ -26,7 +26,7 @@
public static void main(String[] args) throws Exception {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- lc.shutdownAndReset();//this is to cancel default-config.
+ lc.reset();//this is to cancel default-config.
WriterAppender<LoggingEvent> writerAppender = new WriterAppender<LoggingEvent>();
writerAppender.setContext(lc);
writerAppender.setLayout(new EchoLayout<LoggingEvent>());
@@ -42,7 +42,7 @@
logger.debug("Hello world.");
- lc.shutdownAndReset();
+ lc.reset();
StatusPrinter.print(lc);
}
Modified: logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/mail/EMail.java Tue Nov 4 20:23:14 2008
@@ -35,7 +35,7 @@
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
- lc.shutdownAndReset();
+ lc.reset();
configurator.setContext(lc);
configurator.doConfigure(configFile);
StatusPrinter.printIfErrorsOccured(lc);
Modified: logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter4/socket/SocketClient2.java Tue Nov 4 20:23:14 2008
@@ -45,7 +45,7 @@
if (configFile.endsWith(".xml")) {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
- lc.shutdownAndReset();
+ lc.reset();
configurator.setContext(lc);
configurator.doConfigure(configFile);
}
Modified: logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter5/CallerEvaluatorExample.java Tue Nov 4 20:23:14 2008
@@ -18,7 +18,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure(args[0]);
} catch (JoranException je) {
StatusPrinter.print(lc);
Modified: logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter5/ExceptionEvaluatorExample.java Tue Nov 4 20:23:14 2008
@@ -17,7 +17,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure(args[0]);
} catch (JoranException je) {
StatusPrinter.print(lc);
Modified: logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter5/GoMDC.java Tue Nov 4 20:23:14 2008
@@ -19,7 +19,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure("mdcFilter.xml");
} catch (JoranException je) {
Modified: logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter5/SampleLogging.java Tue Nov 4 20:23:14 2008
@@ -17,7 +17,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
- lc.shutdownAndReset();
+ lc.reset();
configurator.setContext(lc);
configurator.doConfigure(args[0]);
} catch (JoranException je) {
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 Tue Nov 4 20:23:14 2008
@@ -24,7 +24,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure(args[0]);
} catch (JoranException je) {
je.printStackTrace();
Modified: logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter7/NumberCruncherServer.java Tue Nov 4 20:23:14 2008
@@ -134,7 +134,7 @@
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
configurator.doConfigure(args[0]);
} catch (JoranException je) {
je.printStackTrace();
Modified: logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter7/SimpleMDC.java Tue Nov 4 20:23:14 2008
@@ -59,7 +59,7 @@
// Configure logback
LoggerContext loggerContext = (LoggerContext) LoggerFactory
.getILoggerFactory();
- loggerContext.shutdownAndReset();
+ loggerContext.reset();
PatternLayout layout = new PatternLayout();
layout.setContext(loggerContext);
layout.setPattern("%X{first} %X{last} - %m%n");
@@ -80,7 +80,7 @@
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
- lc.shutdownAndReset();
+ lc.reset();
URL url = Loader.getResourceBySelfClassLoader("chapter7/simpleMDC.xml");
configurator.doConfigure(url);
} catch (JoranException je) {
2
1