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
February 2009
- 9 participants
- 95 discussions

[JIRA] Created: (LBCLASSIC-110) TargetLengthBasedClassNameAbbreviator does not work for strings with more than 12 dots (inclusive).
by Lukas Zapletal (JIRA) 22 Jun '09
by Lukas Zapletal (JIRA) 22 Jun '09
22 Jun '09
TargetLengthBasedClassNameAbbreviator does not work for strings with more than 12 dots (inclusive).
---------------------------------------------------------------------------------------------------
Key: LBCLASSIC-110
URL: http://jira.qos.ch/browse/LBCLASSIC-110
Project: logback-classic
Issue Type: Bug
Components: appender
Affects Versions: 0.9.9, 0.9.10, 0.9.11, 0.9.12, 0.9.13, 0.9.14, 0.9.15
Reporter: Lukas Zapletal
Assignee: Logback dev list
Please add this to TargetLengthBasedClassNameAbbreviatorTest:
System.out.println("13");
{
// 13 dots test
TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(20);
String name = "com.pike.test.puma.wm.isd2dita.core.g.project.server.pkg.isobjecttype.isobject.ISObjectContentGenerator";
assertEquals("c.p.t.p.w.i.c.g.o.s.r.i.ISObjectContentGenerator", abbreviator.abbreviate(name));
}
System.out.println("12");
{
// 12 dots test
TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(20);
String name = "com.pike.puma.wm.isd2dita.core.g.project.server.pkg.isobjecttype.isobject.ISObjectContentGenerator";
assertEquals("c.p.p.w.i.c.g.o.s.r.i.ISObjectContentGenerator", abbreviator.abbreviate(name));
}
Logs are disappearing when this bug occurs. It throws ArrayIndexOfBounds when testing but in production logs are just skipped (thus this bug is not FATAL-CRITICAL).
Workaround: higher the 12 dot limit.
Better workaround: handle with strings correctly not to ses AIOB exception ever.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
2
3

[JIRA] Created: (LBCLASSIC-107) thrown from toString exception swallowed
by Anton Lebedevich (JIRA) 15 Mar '09
by Anton Lebedevich (JIRA) 15 Mar '09
15 Mar '09
thrown from toString exception swallowed
----------------------------------------
Key: LBCLASSIC-107
URL: http://jira.qos.ch/browse/LBCLASSIC-107
Project: logback-classic
Issue Type: Bug
Affects Versions: 0.9.15
Environment: java version "1.6.0_12"
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
Java HotSpot(TM) Client VM (build 11.2-b01, mixed mode, sharing)
slf4j-api:1.5.6
Reporter: Anton Lebedevich
Assignee: Logback dev list
package loggerbug;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Loggerbug
{
private static final Logger logger = LoggerFactory.getLogger(Loggerbug.class);
static class ThrowsToString {
@Override
public String toString() {
throw new RuntimeException("from toString");
}
}
public static void main(String[] args)
{
ThrowsToString probe = new ThrowsToString();
logger.info("probe is {}", probe);
System.out.println("no exception");
}
}
prints "no exception" with logback-classic, but with slf4j-simple output is:
Exception in thread "main" java.lang.RuntimeException: from toString
at loggerbug.Loggerbug$ThrowsToString.toString(Loggerbug.java:13)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuffer.append(StringBuffer.java:219)
at org.slf4j.helpers.MessageFormatter.deeplyAppendParameter(MessageFormatter.java:237)
at org.slf4j.helpers.MessageFormatter.arrayFormat(MessageFormatter.java:196)
at org.slf4j.helpers.MessageFormatter.format(MessageFormatter.java:138)
at org.slf4j.impl.SimpleLogger.formatAndLog(SimpleLogger.java:222)
at org.slf4j.impl.SimpleLogger.info(SimpleLogger.java:258)
at loggerbug.Loggerbug.main(Loggerbug.java:20)
--
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
3
2

[JIRA] Created: (LBCLASSIC-111) Improve performance by removing StringBuffer where possible
by Rick Beton (JIRA) 15 Mar '09
by Rick Beton (JIRA) 15 Mar '09
15 Mar '09
Improve performance by removing StringBuffer where possible
-----------------------------------------------------------
Key: LBCLASSIC-111
URL: http://jira.qos.ch/browse/LBCLASSIC-111
Project: logback-classic
Issue Type: Bug
Affects Versions: 0.9.15
Environment: any
Reporter: Rick Beton
Assignee: Logback dev list
Priority: Minor
StringBuffer is used in some local variables. The newer StringBuilder alternative will improve the performance slightly in such cases.
E.g.in FileNamePattern
public String convert(Object o) {
Converter<Object> p = headTokenConverter;
StringBuffer buf = new StringBuffer();
while (p != null) {
buf.append(p.convert(o));
p = p.getNext();
}
return buf.toString();
}
should change to use
StringBuilder buf = new StringBuilder();
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
2
1
Hello all,
I would like to split/redesign the LoggingEvent object as follows:
interface ILoggingEvent {
String[] getArgumentArray();
CallerData[] getCallerData();
Level getLevel();
String getLoggerName();
Marker getMarker();
Map<String, String> getMDCPropertyMap();
String getMessage();
String getThreadName();
ThrowableDataPoint[] getThrowableDataPointArray();
long getTimeStamp();
void setArgumentArray(Object[])
// other setters omitted
}
// localized usage, temporary lifespan
class LoggingEvent implements ILoggingEvent {
// getter and setter methods from ILoggingEvent omitted
void prepareForDeferredProcessing();
// create a LoggingEventMemento image of this LoggingEvent
LoggingEventMemento asLoggingEventMemento();
}
// distributed (or remote) usage, long term lifespan
class LoggingEventMemento implements ILoggingEvent {
// getter and setter methods from ILoggingEvent omitted
int getVersion();
makeImmutable();
}
LoggingEvent is intended to be used within the application generating
the logging event. LoggingEventMemento is intended for remote
applications (applications other than the application at the origin of
the event) and for longer term lifespan. LoggingEventMemento objects
are intended to be compatible across logback versions. If possible,
LoggingEventMemento should also be suitable for long term storage (on
disk).
Both LoggingEvent and LoggingEventMemento implement the ILoggingEvent
interface so that most logback-classic components, assuming they
expect to operate on ILoggingEvent instances, will be able to handle
LoggingEvent or LoggingEventMemento objects interchangeably.
Instead of LoggingEvent, those appenders which perform serialization,
will be serializing instances of LoggingEventMemento. The
asLoggingEventMemento() method in LoggingEvent will return a
LoggingEventMemento image of a given LoggingEvent.
Obviously there several technical obstacles to overcome. However, I am
soliciting your comments about the general goals of the above
redesign. Do they make sense? Have I omitted important goals?
TIA,
--
Ceki Gülcü
Logback: The reliable, generic, fast and flexible logging framework for Java.
http://logback.qos.ch
7
47

What is the most efficient way - preferrably platform agnostic - to submit events from "the outside"?
by Thorbjoern Ravn Andersen 03 Mar '09
by Thorbjoern Ravn Andersen 03 Mar '09
03 Mar '09
As mentioned in the thread about LoggingEvent refactoring, I think that
the underlying problem that should be solved first, is how to transport
logging events in and out of a JVM as efficiently as possible.
Efficient means at least to me:
* Little overhead - both network bandwith wise, and cpu wise
* Large amounts of events can be sent fast - the host program is not
tied up.
* Large amounts of events can be received fast - perhaps a bundle concept?
* Supports Unicode (no 8-bit folding)
The current approach for the Socketserver is a simple accept-and-fork
system where the incoming data is serialized log events. Pro: Data
stream is rather compact -> network friendly. Contra: Log events can
only originate on a JVM with a compatible version of logback. Jörn,
perhaps you'd like to do a more complete writeup on what should be
anticipated?
Larger datablocks may be acceptible if the data is lightly compressed.
My personal preference before actual experiments would be a XML format
in a dialect supported by a third party, e.g. XMLDecoder/Encoder or an
Apache project, as it is important to delegate the performance work to
another team.
If we bring ZeroConf into it too for the discovery process it would be
nice. The default behaviour of network loggers in Java has not been
established yet.
--
Thorbjørn Ravn Andersen "...plus... Tubular Bells!"
6
37
Is there a way to programmatically configure logback without using any
config file at all.
I saw http://logback.qos.ch/xref/chapter3/MyApp3.html
and that is still configuring using a config file.
Use-case: multiple invocations of same app (with same classpath) needs
to
log to different file appenders, possibly with different patterns.
Hence, need facility to dynamically configure these at runtime (at
startup).
In log4j, I can do this using
Logger logger = Logger.getLogger("abc.xyz");
FileAppender fileAppender = (FileAppender)logger.getAppender("file");
if(fileAppender != null) {
fileAppender.setFile("new.log");
fileAppender.setLayout(new PatternLayout("%d{ISO8601} %5p %t [%c:
%L] %m%n"));
fileAppender.activateOptions();
}
How do I do similar thing in logback?
Thanks
Cheenu
2
2
Author: ceki
Date: Fri Feb 27 17:23:01 2009
New Revision: 2174
Added:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
- copied, changed from r2131, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicGlobal.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/IThrowableProxy.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java
- copied, changed from r2170, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextRemoteView.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java
- copied, changed from r2171, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventSDO.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPointUtil.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/DummyThrowableProxy.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableProxyTest.java
- copied, changed from r2131, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableToDataPointTest.java
Removed:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicGlobal.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextRemoteView.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventSDO.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableToDataPointArray.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableToDataPointTest.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/boolex/JaninoEventEvaluator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/log4j/XMLLayout.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueSink.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicSink.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/LoggingEventPreSerializationTransformer.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketNode.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LoggerConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RelativeTimeConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.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/spi/ILoggingEvent.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerRemoteView.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPoint.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java
logback/trunk/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/HLogger.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/ScenarioMaker.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventWithParametersBuilder.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLoggingEventBuilder.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/PackageTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationPerfTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/IThrowableRenderer.java
logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout.java
logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout2.java
logback/trunk/logback-site/src/site/pages/news.html
Log:
Refactoring of the ThrowableProxy class.
ThrowableProxy now implements the IThrowableProxy interface as shown below:
public interface IThrowableProxy {
public String getClassName();
public String getMessage();
public ThrowableDataPoint[] getThrowableDataPointArray();
public int getCommonFrames();
public IThrowableProxy getCause(); <-- Joern smiles
}
Instead of being a flat structure, ThrowableProxy now contains nested
exceptions (cause) as a nested ThrowableProxy references. This was
requested by Joern Huxhorn on several occasions.
Classes printing threads had to be modified as a result of this
refactoring.
The ILoggerEvent interface has also been slightly refactored. The
LoggerRemoteView class is no longer referenced. Instead the
LoggerContextVO class is used. As a result, serialized events are
larger by a few bytes, but the code is hopefully much clearer.
In response to comments from the dev mailing list, the LoggingEventSDO
class has been renamed as LoggingEventVO.
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java (from r2131, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicGlobal.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicGlobal.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java Fri Feb 27 17:23:01 2009
@@ -1,7 +1,7 @@
/**
* Logback: the generic, reliable, fast and flexible logging framework.
*
- * Copyright (C) 2000-2008, QOS.ch
+ * Copyright (C) 2000-2009, QOS.ch
*
* This library is free software, you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
@@ -9,11 +9,20 @@
*/
package ch.qos.logback.classic;
-public class ClassicGlobal {
+public class ClassicConstants {
static public final char LOGGER_SEPARATOR = '.';
static public final String USER_MDC_KEY = "user";
public static final String LOGBACK_CONTEXT_SELECTOR = "logback.ContextSelector";
public static String JNDI_CONFIGURATION_RESOURCE = "java:comp/env/logback/configuration-resource";
public static String JNDI_CONTEXT_NAME = "java:comp/env/logback/context-name";
+
+
+ /**
+ * The maximum number of package separators (dots) that abbreviation algorithms
+ * can handle. Class or logger names with more separators will have their first
+ * MAX_DOTS parts shortened.
+ *
+ */
+ public static final int MAX_DOTS = 16;
}
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 Fri Feb 27 17:23:01 2009
@@ -299,11 +299,11 @@
* @return
*/
Logger createChildByLastNamePart(final String lastPart) {
- int i_index = lastPart.indexOf(ClassicGlobal.LOGGER_SEPARATOR);
+ int i_index = lastPart.indexOf(ClassicConstants.LOGGER_SEPARATOR);
if (i_index != -1) {
throw new IllegalArgumentException("Child name [" + lastPart
+ " passed as parameter, may not include ["
- + ClassicGlobal.LOGGER_SEPARATOR + "]");
+ + ClassicConstants.LOGGER_SEPARATOR + "]");
}
if (childrenList == null) {
@@ -314,7 +314,7 @@
childLogger = new Logger(lastPart, this, this.loggerContext);
} else {
childLogger = new Logger(
- name + ClassicGlobal.LOGGER_SEPARATOR + lastPart, this,
+ name + ClassicConstants.LOGGER_SEPARATOR + lastPart, this,
this.loggerContext);
}
childrenList.add(childLogger);
@@ -350,7 +350,7 @@
static private final int DEFAULT_CHILD_ARRAY_SIZE = 5;
Logger createChildByName(final String childName) {
- int i_index = childName.indexOf(ClassicGlobal.LOGGER_SEPARATOR, this.name
+ int i_index = childName.indexOf(ClassicConstants.LOGGER_SEPARATOR, this.name
.length() + 1);
if (i_index != -1) {
throw new IllegalArgumentException("For logger [" + this.name
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 Fri Feb 27 17:23:01 2009
@@ -22,7 +22,7 @@
import ch.qos.logback.classic.spi.LoggerComparator;
import ch.qos.logback.classic.spi.LoggerContextListener;
-import ch.qos.logback.classic.spi.LoggerContextRemoteView;
+import ch.qos.logback.classic.spi.LoggerContextVO;
import ch.qos.logback.classic.spi.TurboFilterList;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.ContextBase;
@@ -58,15 +58,16 @@
// footprint.
private Hashtable<String, Logger> loggerCache;
- private LoggerContextRemoteView loggerContextRemoteView;
+ private LoggerContextVO loggerContextRemoteView;
private final TurboFilterList turboFilterList = new TurboFilterList();
-
+ private boolean packagingDataEnabled = true;
+
boolean started = false;
public LoggerContext() {
super();
this.loggerCache = new Hashtable<String, Logger>();
- this.loggerContextRemoteView = new LoggerContextRemoteView(this);
+ this.loggerContextRemoteView = new LoggerContextVO(this);
this.root = new Logger(ROOT_NAME, null, this);
this.root.setLevel(Level.DEBUG);
loggerCache.put(ROOT_NAME, root);
@@ -79,7 +80,7 @@
* name or propertyMap (including keys or values) changes.
*/
private void syncRemoteView() {
- loggerContextRemoteView = new LoggerContextRemoteView(this);
+ loggerContextRemoteView = new LoggerContextVO(this);
for (Logger logger : loggerCache.values()) {
logger.buildRemoteView();
}
@@ -128,7 +129,7 @@
// in between as well (if they don't already exist)
String childName;
while (true) {
- int h = name.indexOf(ClassicGlobal.LOGGER_SEPARATOR, i);
+ int h = name.indexOf(ClassicConstants.LOGGER_SEPARATOR, i);
if (h == -1) {
childName = name;
} else {
@@ -185,10 +186,19 @@
return loggerList;
}
- public LoggerContextRemoteView getLoggerContextRemoteView() {
+ public LoggerContextVO getLoggerContextRemoteView() {
return loggerContextRemoteView;
}
+ public void setPackagingDataEnabled(boolean packagingDataEnabled) {
+ this.packagingDataEnabled = packagingDataEnabled;
+ }
+
+ public boolean isPackagingDataEnabled() {
+ return packagingDataEnabled;
+ }
+
+
/**
* This method closes all appenders,
*/
@@ -324,4 +334,5 @@
public String toString() {
return this.getClass().getName() + "[" + getName() + "]";
}
+
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java Fri Feb 27 17:23:01 2009
@@ -16,8 +16,9 @@
import org.slf4j.Marker;
import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.spi.LoggerRemoteView;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
+import ch.qos.logback.classic.spi.LoggerContextVO;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.boolex.JaninoEventEvaluatorBase;
import ch.qos.logback.core.boolex.Matcher;
@@ -41,6 +42,7 @@
DEFAULT_PARAM_NAME_LIST.add("event");
DEFAULT_PARAM_NAME_LIST.add("message");
DEFAULT_PARAM_NAME_LIST.add("logger");
+ DEFAULT_PARAM_NAME_LIST.add("loggerContext");
DEFAULT_PARAM_NAME_LIST.add("level");
DEFAULT_PARAM_NAME_LIST.add("timeStamp");
DEFAULT_PARAM_NAME_LIST.add("marker");
@@ -55,12 +57,13 @@
DEFAULT_PARAM_TYPE_LIST.add(ILoggingEvent.class);
DEFAULT_PARAM_TYPE_LIST.add(String.class);
- DEFAULT_PARAM_TYPE_LIST.add(LoggerRemoteView.class);
+ DEFAULT_PARAM_TYPE_LIST.add(String.class);
+ DEFAULT_PARAM_TYPE_LIST.add(LoggerContextVO.class);
DEFAULT_PARAM_TYPE_LIST.add(int.class);
DEFAULT_PARAM_TYPE_LIST.add(long.class);
DEFAULT_PARAM_TYPE_LIST.add(Marker.class);
DEFAULT_PARAM_TYPE_LIST.add(Map.class);
- DEFAULT_PARAM_TYPE_LIST.add(Throwable.class);
+ DEFAULT_PARAM_TYPE_LIST.add(IThrowableProxy.class);
}
@@ -105,13 +108,14 @@
values[i++] = loggingEvent;
values[i++] = loggingEvent.getMessage();
- values[i++] = loggingEvent.getLoggerRemoteView();
+ values[i++] = loggingEvent.getLoggerName();
+ values[i++] = loggingEvent.getLoggerContextVO();
values[i++] = loggingEvent.getLevel().toInteger();
values[i++] = new Long(loggingEvent.getTimeStamp());
values[i++] = loggingEvent.getMarker();
values[i++] = loggingEvent.getMDCPropertyMap();
if (loggingEvent.getThrowableProxy() != null) {
- values[i++] = loggingEvent.getThrowableProxy().getThrowable();
+ values[i++] = loggingEvent.getThrowableProxy();
} else {
values[i++] = null;
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java Fri Feb 27 17:23:01 2009
@@ -100,7 +100,7 @@
throws SQLException {
stmt.setLong(1, event.getTimeStamp());
stmt.setString(2, event.getFormattedMessage());
- stmt.setString(3, event.getLoggerRemoteView().getName());
+ stmt.setString(3, event.getLoggerName());
stmt.setString(4, event.getLevel().toString());
stmt.setString(5, event.getThreadName());
stmt.setShort(6, DBHelper.computeReferenceMask(event));
@@ -123,8 +123,7 @@
// we consider that event-specific properties should have priority over
// context-wide
// properties.
- Map<String, String> loggerContextMap = event.getLoggerRemoteView()
- .getLoggerContextView().getPropertyMap();
+ Map<String, String> loggerContextMap = event.getLoggerContextVO().getPropertyMap();
Map<String, String> mdcMap = event.getMDCPropertyMap();
if (loggerContextMap != null) {
mergedMap.putAll(loggerContextMap);
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java Fri Feb 27 17:23:01 2009
@@ -11,7 +11,6 @@
package ch.qos.logback.classic.db;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.classic.spi.ThrowableDataPoint;
/**
* @author Ceki Gülcü
@@ -30,19 +29,15 @@
mdcPropSize = event.getMDCPropertyMap().keySet().size();
}
int contextPropSize = 0;
- if (event.getLoggerRemoteView().getLoggerContextView().getPropertyMap() != null) {
- contextPropSize = event.getLoggerRemoteView().getLoggerContextView()
- .getPropertyMap().size();
+ if (event.getLoggerContextVO().getPropertyMap() != null) {
+ contextPropSize = event.getLoggerContextVO().getPropertyMap().size();
}
if (mdcPropSize > 0 || contextPropSize > 0) {
mask = PROPERTIES_EXIST;
}
if (event.getThrowableProxy() != null) {
- ThrowableDataPoint[] tdpArray = event.getThrowableProxy().getThrowableDataPointArray();
- if (tdpArray != null) {
- mask |= EXCEPTION_EXISTS;
- }
+ mask |= EXCEPTION_EXISTS;
}
return mask;
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java Fri Feb 27 17:23:01 2009
@@ -9,50 +9,50 @@
*/
package ch.qos.logback.classic.html;
-import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
-import ch.qos.logback.classic.spi.ThrowableProxy;
+import ch.qos.logback.classic.spi.ThrowableProxyUtil;
+import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.helpers.Transform;
import ch.qos.logback.core.html.IThrowableRenderer;
-public class DefaultThrowableRenderer implements IThrowableRenderer {
+public class DefaultThrowableRenderer implements IThrowableRenderer<ILoggingEvent> {
static final String TRACE_PREFIX = "<br /> ";
- Throwable throwable;
-
public DefaultThrowableRenderer() {
-
- }
-
- public void setThrowable(Throwable t) {
- this.throwable = t;
}
- public void render(StringBuilder sbuf, ThrowableDataPoint[] tdpArray) {
- if (tdpArray != null) {
- int len = tdpArray.length;
- if (len == 0) {
- return;
- }
- sbuf.append("<tr><td class=\"Exception\" colspan=\"6\">");
- sbuf.append(Transform.escapeTags(tdpArray[0].toString()));
- sbuf.append(LINE_SEPARATOR);
- for (int i = 1; i < len; i++) {
- sbuf.append(TRACE_PREFIX);
- sbuf.append(Transform.escapeTags(tdpArray[i].toString()));
- sbuf.append(LINE_SEPARATOR);
- }
- sbuf.append("</td></tr>");
+ void render(StringBuilder sbuf, IThrowableProxy tp) {
+ StringBuilder firstLine = new StringBuilder();
+ ThrowableProxyUtil.printFirstLine(firstLine, tp);
+ sbuf.append(Transform.escapeTags(firstLine.toString()));
+
+ int commonFrames = tp.getCommonFrames();
+ ThrowableDataPoint[] tdpa = tp.getThrowableDataPointArray();
+
+ for (int i = 0; i < tdpa.length - commonFrames; i++) {
+ ThrowableDataPoint tdp = tdpa[i];
+ sbuf.append(TRACE_PREFIX);
+ sbuf.append(Transform.escapeTags(tdp.toString()));
+ sbuf.append(CoreConstants.LINE_SEPARATOR);
+ }
+
+ if (commonFrames > 0) {
+ sbuf.append(TRACE_PREFIX);
+ sbuf.append("\t... " + commonFrames).append(" common frames omitted")
+ .append(CoreConstants.LINE_SEPARATOR);
}
}
- public void render(StringBuilder sbuf, Object eventObject) {
- ILoggingEvent event = (ILoggingEvent)eventObject;
- ThrowableProxy tp = event.getThrowableProxy();
- if (tp != null) {
- render(sbuf, tp.getThrowableDataPointArray());
+ public void render(StringBuilder sbuf, ILoggingEvent event) {
+ IThrowableProxy tp = event.getThrowableProxy();
+ sbuf.append("<tr><td class=\"Exception\" colspan=\"6\">");
+ while(tp != null) {
+ render(sbuf, tp);
+ tp = tp.getCause();
}
+ sbuf.append("</td></tr>");
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java Fri Feb 27 17:23:01 2009
@@ -39,7 +39,7 @@
*/
static final String DEFAULT_CONVERSION_PATTERN = "%date%thread%level%logger%mdc%msg";
- IThrowableRenderer throwableRenderer;
+ IThrowableRenderer<ILoggingEvent> throwableRenderer;
/**
* Constructs a PatternLayout using the DEFAULT_LAYOUT_PATTERN.
@@ -117,7 +117,7 @@
return throwableRenderer;
}
- public void setThrowableRenderer(IThrowableRenderer throwableRenderer) {
+ public void setThrowableRenderer(IThrowableRenderer<ILoggingEvent> throwableRenderer) {
this.throwableRenderer = throwableRenderer;
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/log4j/XMLLayout.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/log4j/XMLLayout.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/log4j/XMLLayout.java Fri Feb 27 17:23:01 2009
@@ -15,8 +15,8 @@
import ch.qos.logback.classic.spi.CallerData;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
-import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.LayoutBase;
import ch.qos.logback.core.helpers.Transform;
@@ -103,7 +103,7 @@
// We yield to the \r\n heresy.
buf.append("<log4j:event logger=\"");
- buf.append(event.getLoggerRemoteView().getName());
+ buf.append(event.getLoggerName());
buf.append("\"\r\n");
buf.append(" timestamp=\"");
buf.append(event.getTimeStamp());
@@ -122,11 +122,11 @@
// logback does not support NDC
// String ndc = event.getNDC();
- ThrowableProxy tp = event.getThrowableProxy();
+ IThrowableProxy tp = event.getThrowableProxy();
if (tp != null) {
- buf.append(" <log4j:throwable><![CDATA[");
ThrowableDataPoint[] tdpArray = tp.getThrowableDataPointArray();
+ buf.append(" <log4j:throwable><![CDATA[");
for (ThrowableDataPoint tdp : tdpArray) {
buf.append(tdp.toString());
buf.append("\r\n");
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueSink.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueSink.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueSink.java Fri Feb 27 17:23:01 2009
@@ -117,7 +117,7 @@
if (message instanceof ObjectMessage) {
ObjectMessage objectMessage = (ObjectMessage) message;
event = (ILoggingEvent) objectMessage.getObject();
- Logger log = (Logger) LoggerFactory.getLogger(event.getLoggerRemoteView().getName());
+ Logger log = (Logger) LoggerFactory.getLogger(event.getLoggerName());
log.callAppenders(event);
} else {
logger.warn("Received message is of type " + message.getJMSType()
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicSink.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicSink.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicSink.java Fri Feb 27 17:23:01 2009
@@ -117,7 +117,7 @@
if (message instanceof ObjectMessage) {
ObjectMessage objectMessage = (ObjectMessage) message;
event = (ILoggingEvent) objectMessage.getObject();
- Logger log = (Logger) LoggerFactory.getLogger(event.getLoggerRemoteView().getName());
+ Logger log = (Logger) LoggerFactory.getLogger(event.getLoggerName());
log.callAppenders(event);
} else {
logger.warn("Received message is of type " + message.getJMSType()
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/LoggingEventPreSerializationTransformer.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/LoggingEventPreSerializationTransformer.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/LoggingEventPreSerializationTransformer.java Fri Feb 27 17:23:01 2009
@@ -13,7 +13,7 @@
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.classic.spi.LoggingEventSDO;
+import ch.qos.logback.classic.spi.LoggingEventVO;
import ch.qos.logback.core.spi.PreSerializationTransformer;
public class LoggingEventPreSerializationTransformer implements
@@ -24,9 +24,9 @@
return null;
}
if (event instanceof LoggingEvent) {
- return LoggingEventSDO.build(event);
- } else if (event instanceof LoggingEventSDO) {
- return (LoggingEventSDO) event;
+ return LoggingEventVO.build(event);
+ } else if (event instanceof LoggingEventVO) {
+ return (LoggingEventVO) event;
} else {
throw new IllegalArgumentException("Unsupported type "+event.getClass().getName());
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketNode.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketNode.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketNode.java Fri Feb 27 17:23:01 2009
@@ -78,7 +78,7 @@
event = (ILoggingEvent) ois.readObject();
// get a logger from the hierarchy. The name of the logger is taken to
// be the name contained in the event.
- remoteLogger = context.getLogger(event.getLoggerRemoteView().getName());
+ remoteLogger = context.getLogger(event.getLoggerName());
// apply the logger-level filter
if (remoteLogger.isEnabledFor(event.getLevel())) {
// finally log the event as if was generated locally
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java Fri Feb 27 17:23:01 2009
@@ -14,6 +14,7 @@
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.pattern.SyslogStartConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.classic.util.LevelToSyslogSeverity;
import ch.qos.logback.core.Layout;
@@ -21,10 +22,8 @@
import ch.qos.logback.core.net.SyslogWriter;
/**
- * This appender can be used to send messages to a remote
- * syslog daemon.
- * <p>
- * For more information about this appender, please refer to the online manual at
+ * This appender can be used to send messages to a remote syslog daemon. <p> For
+ * more information about this appender, please refer to the online manual at
* http://logback.qos.ch/manual/appenders.html#SyslogAppender
*
* @author Ceki Gülcü
@@ -37,17 +36,17 @@
public Layout<ILoggingEvent> buildLayout(String facilityStr) {
String prefixPattern = "%syslogStart{" + facilityStr + "}%nopex";
-
+
prefixLayout.getInstanceConverterMap().put("syslogStart",
SyslogStartConverter.class.getName());
prefixLayout.setPattern(prefixPattern);
prefixLayout.setContext(getContext());
prefixLayout.start();
-
+
PatternLayout fullLayout = new PatternLayout();
fullLayout.getInstanceConverterMap().put("syslogStart",
SyslogStartConverter.class.getName());
-
+
if (suffixPattern == null) {
suffixPattern = DEFAULT_SUFFIX_PATTERN;
}
@@ -73,20 +72,21 @@
@Override
protected void postProcess(Object eventObject, SyslogWriter sw) {
ILoggingEvent event = (ILoggingEvent) eventObject;
-
+
String prefix = prefixLayout.doLayout(event);
-
- if (event.getThrowableProxy() != null) {
- ThrowableDataPoint[] strRep = event.getThrowableProxy().getThrowableDataPointArray();
+
+ IThrowableProxy tp = event.getThrowableProxy();
+ while (tp != null) {
+ ThrowableDataPoint[] strRep = tp.getThrowableDataPointArray();
try {
for (ThrowableDataPoint line : strRep) {
sw.write(prefix + line.toString());
sw.flush();
}
} catch (IOException e) {
+ break;
}
+ tp = tp.getCause();
}
-
}
-
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java Fri Feb 27 17:23:01 2009
@@ -13,7 +13,6 @@
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
-import ch.qos.logback.classic.spi.ThrowableProxy;
public class ExtendedThrowableProxyConverter extends ThrowableProxyConverter {
@@ -31,8 +30,7 @@
}
protected void prepareLoggingEvent(ILoggingEvent event) {
- ThrowableProxy tp = event.getThrowableProxy();
- tp.calculatePackagingData();
+
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LoggerConverter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LoggerConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LoggerConverter.java Fri Feb 27 17:23:01 2009
@@ -14,6 +14,6 @@
public class LoggerConverter extends NamedConverter {
protected String getFullyQualifiedName(ILoggingEvent event) {
- return event.getLoggerRemoteView().getName();
+ return event.getLoggerName();
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RelativeTimeConverter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RelativeTimeConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RelativeTimeConverter.java Fri Feb 27 17:23:01 2009
@@ -25,7 +25,7 @@
return timesmapStr;
} else {
lastTimestamp = timestamp;
- timesmapStr = Long.toString(timestamp - event.getContextBirthTime());
+ timesmapStr = Long.toString(timestamp - event.getLoggerContextVO().getBirthTime());
return timesmapStr;
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java Fri Feb 27 17:23:01 2009
@@ -39,10 +39,12 @@
}
buf.setLength(0);
- int[] dotArray = new int[ClassicConstants.MAX_DOTS];
+ int[] dotIndexesArray = new int[ClassicConstants.MAX_DOTS];
+ // a.b.c contains 2 dots but 2+1 parts.
+ // see also http://jira.qos.ch/browse/LBCLASSIC-110
int[] lengthArray = new int[ClassicConstants.MAX_DOTS+1];
- int dotCount = computeIndexes(fqClassName, dotArray);
+ int dotCount = computeDotIndexes(fqClassName, dotIndexesArray);
// System.out.println();
// System.out.println("Dot count for [" + className + "] is " + dotCount);
@@ -51,13 +53,13 @@
return fqClassName;
}
// printArray("dotArray: ", dotArray);
- computeLengthArray(fqClassName, dotArray, lengthArray, dotCount);
+ computeLengthArray(fqClassName, dotIndexesArray, lengthArray, dotCount);
// printArray("lengthArray: ", lengthArray);
for (int i = 0; i <= dotCount; i++) {
if (i == 0) {
buf.append(fqClassName.substring(0, lengthArray[i] - 1));
} else {
- buf.append(fqClassName.substring(dotArray[i - 1], dotArray[i - 1]
+ buf.append(fqClassName.substring(dotIndexesArray[i - 1], dotIndexesArray[i - 1]
+ lengthArray[i]));
}
// System.out.println("i=" + i + ", buf=" + buf);
@@ -67,7 +69,7 @@
}
- static int computeIndexes(final String className, int[] dotArray) {
+ static int computeDotIndexes(final String className, int[] dotArray) {
int dotCount = 0;
int k = 0;
while (true) {
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java Fri Feb 27 17:23:01 2009
@@ -14,8 +14,9 @@
import java.util.Map;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
-import ch.qos.logback.classic.spi.ThrowableProxy;
+import ch.qos.logback.classic.spi.ThrowableProxyUtil;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.boolex.EvaluationException;
@@ -67,7 +68,8 @@
String evaluatorStr = (String) optionList.get(i);
Context context = getContext();
Map evaluatorMap = (Map) context.getObject(CoreConstants.EVALUATOR_MAP);
- EventEvaluator<ILoggingEvent> ee = (EventEvaluator<ILoggingEvent>) evaluatorMap.get(evaluatorStr);
+ EventEvaluator<ILoggingEvent> ee = (EventEvaluator<ILoggingEvent>) evaluatorMap
+ .get(evaluatorStr);
addEvaluator(ee);
}
}
@@ -89,26 +91,16 @@
protected void extraData(StringBuilder builder, ThrowableDataPoint tdp) {
// nop
}
-
- protected void prepareLoggingEvent(ILoggingEvent event) {
- // nop
- }
-
+
public String convert(ILoggingEvent event) {
StringBuilder buf = new StringBuilder(32);
- ThrowableProxy information = event.getThrowableProxy();
-
- if (information == null) {
+ IThrowableProxy tp = event.getThrowableProxy();
+ if (tp == null) {
return CoreConstants.EMPTY_STRING;
}
- ThrowableDataPoint[] tdpArray = information.getThrowableDataPointArray();
-
- int length = (lengthOption > tdpArray.length) ? tdpArray.length
- : lengthOption;
-
- // an evaluator match will cause stack printing to be skipped
+ // an evaluator match will cause stack printing to be skipped
if (evaluatorList != null) {
boolean printStack = true;
for (int i = 0; i < evaluatorList.size(); i++) {
@@ -127,8 +119,9 @@
ErrorStatus errorStatus = new ErrorStatus(
"Exception thrown for evaluator named [" + ee.getName() + "].",
this, eex);
- errorStatus.add(new ErrorStatus("This was the last warning about this evaluator's errors." +
- "We don't want the StatusManager to get flooded.", this));
+ errorStatus.add(new ErrorStatus(
+ "This was the last warning about this evaluator's errors."
+ + "We don't want the StatusManager to get flooded.", this));
addStatus(errorStatus);
}
}
@@ -139,17 +132,38 @@
}
}
- prepareLoggingEvent(event);
-
- buf.append(tdpArray[0]).append(CoreConstants.LINE_SEPARATOR);
- for (int i = 1; i < length; i++) {
+ while (tp != null) {
+ printThrowableProxy(buf, tp);
+ tp = tp.getCause();
+ }
+ return buf.toString();
+ }
+
+ void printThrowableProxy(StringBuilder buf, IThrowableProxy tp) {
+ ThrowableProxyUtil.printFirstLine(buf, tp);
+
+ ThrowableDataPoint[] tdpArray = tp.getThrowableDataPointArray();
+ int commonFrames = tp.getCommonFrames();
+
+ boolean unrestrictedPrinting = lengthOption > tdpArray.length;
+ int length = (unrestrictedPrinting) ? tdpArray.length : lengthOption;
+
+
+ int maxIndex = length;
+ if (commonFrames > 0 && unrestrictedPrinting) {
+ maxIndex -= commonFrames;
+ }
+
+ for (int i = 0; i < maxIndex; i++) {
String string = tdpArray[i].toString();
buf.append(string);
- extraData(buf, tdpArray[i]); // allow other data to be appended
+ extraData(buf, tdpArray[i]); // allow other data to be added
buf.append(CoreConstants.LINE_SEPARATOR);
}
- return buf.toString();
+ if (commonFrames > 0 && unrestrictedPrinting) {
+ buf.append("\t... " + tp.getCommonFrames()).append(
+ " common frames omitted").append(CoreConstants.LINE_SEPARATOR);
+ }
}
-
}
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 Fri Feb 27 17:23:01 2009
@@ -9,8 +9,8 @@
*/
package ch.qos.logback.classic.selector;
-import static ch.qos.logback.classic.ClassicGlobal.JNDI_CONFIGURATION_RESOURCE;
-import static ch.qos.logback.classic.ClassicGlobal.JNDI_CONTEXT_NAME;
+import static ch.qos.logback.classic.ClassicConstants.JNDI_CONFIGURATION_RESOURCE;
+import static ch.qos.logback.classic.ClassicConstants.JNDI_CONTEXT_NAME;
import java.net.URL;
import java.util.ArrayList;
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 Fri Feb 27 17:23:01 2009
@@ -10,7 +10,7 @@
package ch.qos.logback.classic.selector.servlet;
-import static ch.qos.logback.classic.ClassicGlobal.JNDI_CONTEXT_NAME;
+import static ch.qos.logback.classic.ClassicConstants.JNDI_CONTEXT_NAME;
import javax.naming.Context;
import javax.naming.NamingException;
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java Fri Feb 27 17:23:01 2009
@@ -19,20 +19,14 @@
public Object[] getArgumentArray();
public String getFormattedMessage();
- public LoggerRemoteView getLoggerRemoteView();
-
- public ThrowableProxy getThrowableProxy();
+ public String getLoggerName();
+ public LoggerContextVO getLoggerContextVO();
+ public IThrowableProxy getThrowableProxy();
public CallerData[] getCallerData();
-
public Marker getMarker();
-
public Map<String, String> getMDCPropertyMap();
-
public long getTimeStamp();
-
- public long getContextBirthTime();
-
public void prepareForDeferredProcessing();
}
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/IThrowableProxy.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/IThrowableProxy.java Fri Feb 27 17:23:01 2009
@@ -0,0 +1,23 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.spi;
+
+public interface IThrowableProxy {
+
+ public String getMessage();
+ public String getClassName();
+ /**
+ * The data point representation of the throwable proxy.
+ */
+ public ThrowableDataPoint[] getThrowableDataPointArray();
+ public int getCommonFrames();
+ public IThrowableProxy getCause();
+
+}
\ No newline at end of file
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java (from r2170, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextRemoteView.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextRemoteView.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java Fri Feb 27 17:23:01 2009
@@ -15,40 +15,33 @@
import ch.qos.logback.classic.LoggerContext;
/**
- * LoggerContextRemoteView offers a restricted view of LoggerContext intended to
- * be exposed by LoggingEvent. This restricted view is optimised for
- * serialisation.
+ * LoggerContextVO offers a restricted view of LoggerContext intended to be
+ * exposed by LoggingEvent to remote system. This restricted view is optimized
+ * for serialization.
*
* Some of the LoggerContext or Logger attributes should not survive
* serialization, e.g appenders, level values etc, as these attributes may have
- * other values on the remote platform. LoggerContextRemoteView class exposes
+ * other values on the remote platform. LoggerContextVO class exposes
* the minimal (relevant) attributes to remote host, instead of having to deal
* with an incomplete LoggerContext with many null references.
*
* @author Ceki Gülcü
* @author Sébastien Pennec
*/
-public class LoggerContextRemoteView implements Serializable {
+public class LoggerContextVO implements Serializable {
private static final long serialVersionUID = 5488023392483144387L;
final String name;
final Map<String, String> propertyMap;
final long birthTime;
-
- public LoggerContextRemoteView(LoggerContext lc) {
- // this(lc.getName(), lc.getPropertyMap());
+
+ public LoggerContextVO(LoggerContext lc) {
this.name = lc.getName();
this.propertyMap = lc.getCopyOfPropertyMap();
this.birthTime = lc.getBithTime();
}
- // public LoggerContextRemoteView(String name, Map<String, String>
- // propertyMap) {
- // this.name = name;
- // this.propertyMap = propertyMap;
- // }
-
public String getName() {
return name;
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerRemoteView.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerRemoteView.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerRemoteView.java Fri Feb 27 17:23:01 2009
@@ -18,7 +18,7 @@
* An interface that allows Logger objects and LoggerSer objects to be used the
* same way be client of the LoggingEvent object.
* <p>
- * See {@link LoggerContextRemoteView} for the rationale of this class.
+ * See {@link LoggerContextVO} for the rationale of this class.
*
* @author Ceki Gülcü
* @author Sébastien Pennec
@@ -27,7 +27,7 @@
private static final long serialVersionUID = 5028223666108713696L;
- final LoggerContextRemoteView loggerContextView;
+ final LoggerContextVO loggerContextView;
final String name;
public LoggerRemoteView(String name, LoggerContext lc) {
@@ -36,7 +36,7 @@
loggerContextView = lc.getLoggerContextRemoteView();
}
- public LoggerContextRemoteView getLoggerContextView() {
+ public LoggerContextVO getLoggerContextView() {
return loggerContextView;
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java Fri Feb 27 17:23:01 2009
@@ -20,6 +20,7 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
/**
* The internal representation of logging events. When an affirmative decision
@@ -50,6 +51,11 @@
*/
private String threadName;
+
+ private String loggerName;
+ private LoggerContextVO loggerContextRemoteView;
+
+
/**
* Level of logging event.
*
@@ -71,7 +77,6 @@
private ThrowableProxy throwableProxy;
private CallerData[] callerDataArray;
- private LoggerRemoteView loggerRemoteView;
private Marker marker;
@@ -89,12 +94,18 @@
public LoggingEvent(String fqcn, Logger logger, Level level, String message,
Throwable throwable, Object[] argArray) {
this.fqnOfLoggerClass = fqcn;
- this.loggerRemoteView = logger.getLoggerRemoteView();
+ this.loggerName = logger.getName();
+ this.loggerContextRemoteView = logger.getLoggerRemoteView().getLoggerContextView();
this.level = level;
+
this.message = message;
if (throwable != null) {
this.throwableProxy = new ThrowableProxy(throwable);
+ LoggerContext lc = logger.getLoggerContext();
+ if(lc.isPackagingDataEnabled()) {
+ this.throwableProxy.calculatePackagingData();
+ }
}
// bug 85 (we previously failed to set this.argumentArray)
@@ -107,7 +118,7 @@
.getMDCAdapter();
mdcPropertyMap = logbackMDCAdapter.getPropertyMap();
}
-
+
public void setArgumentArray(Object[] argArray) {
if (this.argumentArray != null) {
throw new IllegalStateException("argArray has been already set");
@@ -123,6 +134,14 @@
return level;
}
+ public String getLoggerName() {
+ return loggerName;
+ }
+
+ public void setLoggerName(String loggerName) {
+ this.loggerName = loggerName;
+ }
+
public String getThreadName() {
if (threadName == null) {
threadName = (Thread.currentThread()).getName();
@@ -147,7 +166,7 @@
* Returns the throwable information contained within this event. May be
* <code>null</code> if there is no such information.
*/
- public ThrowableProxy getThrowableProxy() {
+ public IThrowableProxy getThrowableProxy() {
return throwableProxy;
}
@@ -178,12 +197,12 @@
}
}
- public LoggerRemoteView getLoggerRemoteView() {
- return loggerRemoteView;
+ public LoggerContextVO getLoggerContextVO() {
+ return loggerContextRemoteView;
}
- public void setLoggerRemoteView(LoggerRemoteView loggerRemoteView) {
- this.loggerRemoteView = loggerRemoteView;
+ public void setLoggerContextRemoteView(LoggerContextVO loggerContextRemoteView) {
+ this.loggerContextRemoteView = loggerContextRemoteView;
}
public String getMessage() {
@@ -248,7 +267,7 @@
}
public long getContextBirthTime() {
- return loggerRemoteView.loggerContextView.getBirthTime();
+ return loggerContextRemoteView.getBirthTime();
}
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java (from r2171, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventSDO.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventSDO.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java Fri Feb 27 17:23:01 2009
@@ -11,7 +11,9 @@
import ch.qos.logback.classic.Level;
-public class LoggingEventSDO implements ILoggingEvent, Serializable {
+// http://www.riehle.org/computer-science/research/1998/ubilab-tr-1998-10-1.ht…
+
+public class LoggingEventVO implements ILoggingEvent, Serializable {
private static final long serialVersionUID = 6553722650255690312L;
@@ -19,6 +21,9 @@
private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT";
private String threadName;
+ private String loggerName;
+ private LoggerContextVO loggerContextVO;
+
private transient Level level;
private String message;
@@ -29,16 +34,17 @@
private transient Object[] argumentArray;
- private ThrowableProxy throwableProxy;
+ private ThrowableProxyVO throwableProxy;
private CallerData[] callerDataArray;
private Marker marker;
private Map<String, String> mdcPropertyMap;
- private LoggerRemoteView lrv;
private long timeStamp;
+
- public static LoggingEventSDO build(ILoggingEvent le) {
- LoggingEventSDO ledo = new LoggingEventSDO();
- ledo.lrv = le.getLoggerRemoteView();
+ public static LoggingEventVO build(ILoggingEvent le) {
+ LoggingEventVO ledo = new LoggingEventVO();
+ ledo.loggerName = le.getLoggerName();
+ ledo.loggerContextVO = le.getLoggerContextVO();
ledo.threadName = le.getThreadName();
ledo.level = (le.getLevel());
ledo.message = (le.getMessage());
@@ -46,7 +52,7 @@
ledo.marker = le.getMarker();
ledo.mdcPropertyMap = le.getMDCPropertyMap();
ledo.setTimeStamp(le.getTimeStamp());
- ledo.throwableProxy = le.getThrowableProxy();
+ ledo.throwableProxy = ThrowableProxyVO.build(le.getThrowableProxy());
return ledo;
}
@@ -54,10 +60,18 @@
return threadName;
}
+ public LoggerContextVO getLoggerContextVO() {
+ return loggerContextVO;
+ }
+
+ public String getLoggerName() {
+ return loggerName;
+ }
+
public Level getLevel() {
return level;
}
-
+
public String getMessage() {
return message;
}
@@ -80,7 +94,7 @@
return argumentArray;
}
- public ThrowableProxy getThrowableProxy() {
+ public IThrowableProxy getThrowableProxy() {
return throwableProxy;
}
@@ -100,6 +114,23 @@
this.timeStamp = timeStamp;
}
+
+
+ public long getContextBirthTime() {
+ return loggerContextVO.getBirthTime();
+ }
+
+ public LoggerContextVO getContextLoggerRemoteView() {
+ return loggerContextVO;
+ }
+
+ public Map<String, String> getMDCPropertyMap() {
+ return mdcPropertyMap;
+ }
+
+ public void prepareForDeferredProcessing() {
+ }
+
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeInt(level.levelInt);
@@ -137,21 +168,6 @@
}
}
- public long getContextBirthTime() {
- return lrv.loggerContextView.getBirthTime();
- }
-
- public LoggerRemoteView getLoggerRemoteView() {
- return lrv;
- }
-
- public Map<String, String> getMDCPropertyMap() {
- return mdcPropertyMap;
- }
-
- public void prepareForDeferredProcessing() {
- }
-
@Override
public int hashCode() {
final int prime = 31;
@@ -171,13 +187,20 @@
return false;
if (getClass() != obj.getClass())
return false;
- final LoggingEventSDO other = (LoggingEventSDO) obj;
+ final LoggingEventVO other = (LoggingEventVO) obj;
if (message == null) {
if (other.message != null)
return false;
} else if (!message.equals(other.message))
return false;
+ if (loggerName == null) {
+ if (other.loggerName != null)
+ return false;
+ } else if (!loggerName.equals(other.loggerName))
+ return false;
+
+
if (threadName == null) {
if (other.threadName != null)
return false;
@@ -185,13 +208,13 @@
return false;
if (timeStamp != other.timeStamp)
return false;
-
+
if (marker == null) {
if (other.marker != null)
return false;
} else if (!marker.equals(other.marker))
return false;
-
+
if (mdcPropertyMap == null) {
if (other.mdcPropertyMap != null)
return false;
@@ -199,6 +222,4 @@
return false;
return true;
}
-
-
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java Fri Feb 27 17:23:01 2009
@@ -3,7 +3,7 @@
public class STEUtil {
- static int findNumberOfCommonFrames(StackTraceElement[] steArray,
+ static int UNUSED_findNumberOfCommonFrames(StackTraceElement[] steArray,
StackTraceElement[] otherSTEArray) {
if (otherSTEArray == null) {
return 0;
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPoint.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPoint.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPoint.java Fri Feb 27 17:23:01 2009
@@ -31,10 +31,10 @@
StackTraceElementProxy step;
final ThrowableDataPointType type;
- public ThrowableDataPoint(String rawString) {
- this.rawString = rawString;
- this.type = ThrowableDataPointType.RAW;
- }
+// public ThrowableDataPoint(String rawString) {
+// this.rawString = rawString;
+// this.type = ThrowableDataPointType.RAW;
+// }
public ThrowableDataPoint(StackTraceElement ste) {
this.step = new StackTraceElementProxy(ste);
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPointUtil.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPointUtil.java Fri Feb 27 17:23:01 2009
@@ -0,0 +1,15 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.spi;
+
+public class ThrowableDataPointUtil {
+
+
+}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java Fri Feb 27 17:23:01 2009
@@ -1,7 +1,7 @@
/**
- * LOGBack: the reliable, fast and flexible logging library for Java.
+ * Logback: the generic, reliable, fast and flexible logging framework.
*
- * Copyright (C) 1999-2005, QOS.ch
+ * Copyright (C) 2000-2009, QOS.ch
*
* This library is free software, you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
@@ -13,22 +13,75 @@
import ch.qos.logback.core.CoreConstants;
-public class ThrowableProxy implements java.io.Serializable {
+public class ThrowableProxy implements IThrowableProxy {
+
+ Throwable throwable;
+ String className;
+ String message;
+ ThrowableDataPoint[] throwableDataPointArray;
+ int commonFrames;
+ ThrowableProxy cause;
- private static final long serialVersionUID = 6307784764626694851L;
- private ThrowableDataPoint[] tdpArray;
- private transient final Throwable throwable;
private transient PackagingDataCalculator packagingDataCalculator;
private boolean calculatedPackageData = false;
-
+
public ThrowableProxy(Throwable throwable) {
+
this.throwable = throwable;
- this.tdpArray = ThrowableToDataPointArray.convert(throwable);
+ this.className = throwable.getClass().getName();
+ this.message = throwable.getMessage();
+ this.throwableDataPointArray = ThrowableProxyUtil.stea2tdpa(throwable
+ .getStackTrace());
+
+ Throwable nested = throwable.getCause();
+
+ if (nested != null) {
+ this.cause = new ThrowableProxy(nested);
+ this.cause.commonFrames = ThrowableProxyUtil
+ .findNumberOfCommonFrames(nested.getStackTrace(),
+ throwableDataPointArray);
+ }
}
+
public Throwable getThrowable() {
return throwable;
- }
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see ch.qos.logback.classic.spi.IThrowableProxy#getClassName()
+ */
+ public String getClassName() {
+ return className;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see ch.qos.logback.classic.spi.IThrowableProxy#getThrowableDataPointArray()
+ */
+ public ThrowableDataPoint[] getThrowableDataPointArray() {
+ return throwableDataPointArray;
+ }
+
+ public int getCommonFrames() {
+ return commonFrames;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see ch.qos.logback.classic.spi.IThrowableProxy#getCause()
+ */
+ public IThrowableProxy getCause() {
+ return cause;
+ }
public PackagingDataCalculator getPackagingDataCalculator() {
// if original instance (non-deserialized), and packagingDataCalculator
@@ -41,28 +94,21 @@
}
public void calculatePackagingData() {
- if(calculatedPackageData) {
+ if (calculatedPackageData) {
return;
}
PackagingDataCalculator pdc = this.getPackagingDataCalculator();
- if(pdc != null) {
+ if (pdc != null) {
calculatedPackageData = true;
- pdc.calculate(tdpArray);
+ pdc.calculate(throwableDataPointArray);
}
}
-
- /**
- * The data point representation of the throwable proxy.
- */
- public ThrowableDataPoint[] getThrowableDataPointArray() {
- return tdpArray;
- }
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
- result = PRIME * result + Arrays.hashCode(tdpArray);
+ result = PRIME * result + Arrays.hashCode(throwableDataPointArray);
return result;
}
@@ -75,7 +121,7 @@
if (getClass() != obj.getClass())
return false;
final ThrowableProxy other = (ThrowableProxy) obj;
- if (!Arrays.equals(tdpArray, other.tdpArray))
+ if (!Arrays.equals(throwableDataPointArray, other.throwableDataPointArray))
return false;
return true;
}
@@ -96,10 +142,10 @@
if (step != null) {
ClassPackagingData cpd = step.getClassPackagingData();
if (cpd != null) {
- if(!cpd.isExact()){
- builder.append(" ~[") ;
+ if (!cpd.isExact()) {
+ builder.append(" ~[");
} else {
- builder.append(" [") ;
+ builder.append(" [");
}
builder.append(cpd.getCodeLocation()).append(':').append(
cpd.getVersion()).append(']');
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java Fri Feb 27 17:23:01 2009
@@ -0,0 +1,108 @@
+/**
+ * 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.core.CoreConstants;
+
+/**
+ * Convert a throwable into an array of ThrowableDataPoint objects.
+ *
+ *
+ * @author Ceki Gülcü
+ */
+public class ThrowableProxyUtil {
+
+ static final ThrowableDataPoint[] TEMPLATE_ARRAY = new ThrowableDataPoint[0];
+
+ static public void build(ThrowableProxy nestedTP, Throwable nestedThrowable,
+ ThrowableProxy parentTP) {
+
+ StackTraceElement[] nestedSTE = nestedThrowable.getStackTrace();
+
+ int commonFramesCount = -1;
+ if (parentTP != null) {
+ commonFramesCount = findNumberOfCommonFrames(nestedSTE, parentTP
+ .getThrowableDataPointArray());
+ }
+
+ nestedTP.commonFrames = commonFramesCount;
+ nestedTP.throwableDataPointArray = stea2tdpa(nestedSTE);
+ }
+
+ static ThrowableDataPoint[] stea2tdpa(StackTraceElement[] stea) {
+ ThrowableDataPoint[] tdpa = new ThrowableDataPoint[stea.length];
+ for (int i = 0; i < tdpa.length; i++) {
+ tdpa[i] = new ThrowableDataPoint(stea[i]);
+ }
+ return tdpa;
+ }
+
+ static int findNumberOfCommonFrames(StackTraceElement[] steArray,
+ ThrowableDataPoint[] parentTDPA) {
+ if (parentTDPA == null) {
+ return 0;
+ }
+
+ int steIndex = steArray.length - 1;
+ int parentIndex = parentTDPA.length - 1;
+ int count = 0;
+ while (steIndex >= 0 && parentIndex >= 0) {
+ StackTraceElement ste = steArray[steIndex];
+ StackTraceElement otherSte = parentTDPA[parentIndex].step.ste;
+ if (ste.equals(otherSte)) {
+ count++;
+ } else {
+ break;
+ }
+ steIndex--;
+ parentIndex--;
+ }
+ return count;
+ }
+
+ static String asString(IThrowableProxy tp) {
+ StringBuilder sb = new StringBuilder();
+
+ while (tp != null) {
+
+ printFirstLine(sb, tp);
+ printTDP(sb, tp);
+ tp = tp.getCause();
+ }
+ return sb.toString();
+
+ }
+
+ static public void printTDP(StringBuilder sb, IThrowableProxy tp) {
+ ThrowableDataPoint[] tdpa = tp.getThrowableDataPointArray();
+ int commonFrames = tp.getCommonFrames();
+ for (int i = 0; i < tdpa.length - commonFrames; i++) {
+ ThrowableDataPoint tdp = tdpa[i];
+ sb.append(tdp.toString()).append(CoreConstants.LINE_SEPARATOR);
+ }
+
+ if (commonFrames > 0) {
+ sb.append("\t... " + commonFrames).append(" common frames omitted")
+ .append(CoreConstants.LINE_SEPARATOR);
+ }
+
+
+ }
+
+ static public void printFirstLine(StringBuilder sb, IThrowableProxy tp) {
+ int commonFrames = tp.getCommonFrames();
+ if (commonFrames > 0) {
+ sb.append(CoreConstants.CAUSED_BY);
+ }
+ sb.append(tp.getClassName()).append(": ").append(tp.getMessage());
+ sb.append(CoreConstants.LINE_SEPARATOR);
+ }
+}
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java Fri Feb 27 17:23:01 2009
@@ -0,0 +1,100 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.spi;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+public class ThrowableProxyVO implements IThrowableProxy, Serializable {
+
+ private static final long serialVersionUID = 685387990886325422L;
+
+ private String className;
+ private String message;
+ private int commonFramesCount;
+ private ThrowableDataPoint[] throwableDataPointArray;
+ private IThrowableProxy cause;
+
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public int getCommonFrames() {
+ return commonFramesCount;
+ }
+
+ public IThrowableProxy getCause() {
+ return cause;
+ }
+
+ public ThrowableDataPoint[] getThrowableDataPointArray() {
+ return throwableDataPointArray;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((className == null) ? 0 : className.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final ThrowableProxyVO other = (ThrowableProxyVO) obj;
+
+ if (className == null) {
+ if (other.className != null)
+ return false;
+ } else if (!className.equals(other.className))
+ return false;
+
+ if (!Arrays.equals(throwableDataPointArray, other.throwableDataPointArray))
+ return false;
+
+ if (cause == null) {
+ if (other.cause != null)
+ return false;
+ } else if (!cause.equals(other.cause))
+ return false;
+
+ return true;
+ }
+
+ public static ThrowableProxyVO build(IThrowableProxy throwableProxy) {
+ if(throwableProxy == null) {
+ return null;
+ }
+ ThrowableProxyVO tpvo = new ThrowableProxyVO();
+ tpvo.className = throwableProxy.getClassName();
+ tpvo.message = throwableProxy.getMessage();
+ tpvo.commonFramesCount = throwableProxy.getCommonFrames();
+ tpvo.throwableDataPointArray = throwableProxy.getThrowableDataPointArray();
+ if(throwableProxy.getCause() != null) {
+ tpvo.cause = ThrowableProxyVO.build(throwableProxy.getCause());
+ }
+ return tpvo;
+ }
+
+
+
+}
Modified: logback/trunk/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java (original)
+++ logback/trunk/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java Fri Feb 27 17:23:01 2009
@@ -17,7 +17,7 @@
import org.slf4j.helpers.Util;
import org.slf4j.spi.LoggerFactoryBinder;
-import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.selector.ContextJNDISelector;
import ch.qos.logback.classic.selector.ContextSelector;
@@ -91,7 +91,7 @@
// See if a special context selector is needed
String contextSelectorStr = OptionHelper
- .getSystemProperty(ClassicGlobal.LOGBACK_CONTEXT_SELECTOR);
+ .getSystemProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR);
if (contextSelectorStr == null) {
contextSelector = new DefaultContextSelector(defaultLoggerContext);
} else if (contextSelectorStr.equals("JNDI")) {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/HLogger.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/HLogger.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/HLogger.java Fri Feb 27 17:23:01 2009
@@ -17,7 +17,7 @@
import org.slf4j.helpers.MarkerIgnoringBase;
-import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
@@ -234,10 +234,10 @@
* @return
*/
HLogger createChildByLastNamePart(final String lastPart) {
- int i_index = lastPart.indexOf(ClassicGlobal.LOGGER_SEPARATOR);
+ int i_index = lastPart.indexOf(ClassicConstants.LOGGER_SEPARATOR);
if (i_index != -1) {
throw new IllegalArgumentException("Child name [" + lastPart
- + " passed as parameter, may not include [" + ClassicGlobal.LOGGER_SEPARATOR
+ + " passed as parameter, may not include [" + ClassicConstants.LOGGER_SEPARATOR
+ "]");
}
@@ -248,7 +248,7 @@
if (this.isRootLogger()) {
childHLogger = new HLogger(lastPart, this);
} else {
- childHLogger = new HLogger(name + ClassicGlobal.LOGGER_SEPARATOR + lastPart,
+ childHLogger = new HLogger(name + ClassicConstants.LOGGER_SEPARATOR + lastPart,
this);
}
childrenMap.put(lastPart, childHLogger);
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 Fri Feb 27 17:23:01 2009
@@ -12,7 +12,7 @@
import java.util.HashMap;
import java.util.Map;
-import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.Level;
/**
@@ -76,7 +76,7 @@
int i = 0;
while (true) {
- i = name.indexOf(ClassicGlobal.LOGGER_SEPARATOR, i);
+ i = name.indexOf(ClassicConstants.LOGGER_SEPARATOR, i);
if (i == -1) {
// System.out.println("FINAL-Creating logger named [" + name + "] with
// parent " + parent.getName());
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 Fri Feb 27 17:23:01 2009
@@ -11,7 +11,7 @@
import java.util.LinkedList;
-import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.Level;
public class ScenarioMaker {
@@ -72,7 +72,7 @@
childName = ScenarioRandomUtil.randomId();
count += childName.length();
} else {
- childName = loggerName + ClassicGlobal.LOGGER_SEPARATOR
+ childName = loggerName + ClassicConstants.LOGGER_SEPARATOR
+ ScenarioRandomUtil.randomId();
count += childName.length();
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java Fri Feb 27 17:23:01 2009
@@ -82,7 +82,7 @@
if (rs.next()) {
assertEquals(event.getTimeStamp(), rs.getLong(1));
assertEquals(event.getFormattedMessage(), rs.getString(2));
- assertEquals(event.getLoggerRemoteView().getName(), rs.getString(3));
+ assertEquals(event.getLoggerName(), rs.getString(3));
assertEquals(event.getLevel().toString(), rs.getString(4));
assertEquals(event.getThreadName(), rs.getString(5));
assertEquals(DBHelper.computeReferenceMask(event), rs.getShort(6));
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java Fri Feb 27 17:23:01 2009
@@ -22,6 +22,7 @@
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.TestConstants;
import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.classic.spi.DummyThrowableProxy;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
@@ -96,15 +97,25 @@
@Test
public void testAppendThrowable() throws Exception {
StringBuilder buf = new StringBuilder();
- ThrowableDataPoint[] strArray = { new ThrowableDataPoint("test1"),
- new ThrowableDataPoint("test2") };
+ DummyThrowableProxy tp = new DummyThrowableProxy();
+ tp.setClassName("test1");
+ tp.setMessage("msg1");
+
+ StackTraceElement ste1 = new StackTraceElement("c1", "m1", "f1", 1);
+ StackTraceElement ste2 = new StackTraceElement("c2", "m2", "f2", 2);
+
+ ThrowableDataPoint[] strArray = { new ThrowableDataPoint(ste1),
+ new ThrowableDataPoint(ste2) };
+ tp.setThrowableDataPointArray(strArray);
DefaultThrowableRenderer renderer = (DefaultThrowableRenderer) layout
.getThrowableRenderer();
- renderer.render(buf, strArray);
- // System.out.println(buf.toString());
+
+ renderer.render(buf, tp);
+ System.out.println(buf.toString());
String[] result = buf.toString().split(CoreConstants.LINE_SEPARATOR);
- assertEquals("<tr><td class=\"Exception\" colspan=\"6\">test1", result[0]);
- assertEquals(DefaultThrowableRenderer.TRACE_PREFIX + "test2", result[1]);
+ System.out.println(result[0]);
+ assertEquals("test1: msg1", result[0]);
+ assertEquals(DefaultThrowableRenderer.TRACE_PREFIX + "\tat c1.m1(f1:1)", result[1]);
}
@Test
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java Fri Feb 27 17:23:01 2009
@@ -9,7 +9,9 @@
*/
package ch.qos.logback.classic.net;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import java.util.Map;
@@ -21,9 +23,8 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.LoggerContextRemoteView;
-import ch.qos.logback.classic.spi.LoggerRemoteView;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.LoggerContextVO;
import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.util.StatusPrinter;
@@ -32,7 +33,7 @@
static final String LIST_APPENDER_NAME = "la";
static final int JOIN_OR_WAIT_TIMEOUT = 200;
static final int SLEEP_AFTER_LOG = 100;
-
+
int port = 4561;
LoggerContext lc = new LoggerContext();
LoggerContext serverLC = new LoggerContext();
@@ -88,12 +89,12 @@
ILoggingEvent remoteEvent = la.list.get(0);
- LoggerRemoteView loggerRemoteView = remoteEvent.getLoggerRemoteView();
- assertNotNull(loggerRemoteView);
- assertEquals("root", loggerRemoteView.getName());
+ String loggerName = remoteEvent.getLoggerName();
+ assertNotNull(loggerName);
+ assertEquals("root", loggerName);
- LoggerContextRemoteView loggerContextRemoteView = loggerRemoteView
- .getLoggerContextView();
+ LoggerContextVO loggerContextRemoteView = remoteEvent
+ .getLoggerContextVO();
assertNotNull(loggerContextRemoteView);
assertEquals("test", loggerContextRemoteView.getName());
Map<String, String> props = loggerContextRemoteView.getPropertyMap();
@@ -127,8 +128,8 @@
public void messageWithMarker() throws InterruptedException {
fireServer();
waitForServerToStart();
-
- //Thread.sleep(SLEEP_AFTER_SERVER_START);
+
+ // Thread.sleep(SLEEP_AFTER_SERVER_START);
configureClient();
Logger logger = lc.getLogger(LoggerContext.ROOT_NAME);
@@ -150,7 +151,7 @@
public void messageWithUpdatedMDC() throws InterruptedException {
fireServer();
waitForServerToStart();
-
+
configureClient();
Logger logger = lc.getLogger(LoggerContext.ROOT_NAME);
@@ -185,10 +186,11 @@
fireServer();
waitForServerToStart();
- Thread.sleep(SLEEP_AFTER_LOG); // allow time for client and server to connect
+ Thread.sleep(SLEEP_AFTER_LOG); // allow time for client and server to
+ // connect
logger.debug("test msg 2");
Thread.sleep(SLEEP_AFTER_LOG);
-
+
simpleSocketServer.close();
Thread.sleep(SLEEP_AFTER_LOG);
simpleSocketServer.join(JOIN_OR_WAIT_TIMEOUT);
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventWithParametersBuilder.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventWithParametersBuilder.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventWithParametersBuilder.java Fri Feb 27 17:23:01 2009
@@ -37,7 +37,8 @@
// exercise)
le.getFormattedMessage();
le.setLevel(Level.DEBUG);
- le.setLoggerRemoteView(logger.getLoggerRemoteView());
+ le.setLoggerName(logger.getName());
+ le.setLoggerContextRemoteView(logger.getLoggerRemoteView().getLoggerContextView());
le.setThreadName("threadName");
return le;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLoggingEventBuilder.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLoggingEventBuilder.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLoggingEventBuilder.java Fri Feb 27 17:23:01 2009
@@ -23,7 +23,8 @@
LoggingEvent le = new LoggingEvent();
le.setTimeStamp(System.currentTimeMillis());
le.setLevel(Level.DEBUG);
- le.setLoggerRemoteView(logger.getLoggerRemoteView());
+ le.setLoggerName(logger.getName());
+ le.setLoggerContextRemoteView(logger.getLoggerRemoteView().getLoggerContextView());
le.setMessage(MSG_PREFIX);
le.setThreadName("threadName");
return le;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java Fri Feb 27 17:23:01 2009
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2009, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.pattern;
import static org.junit.Assert.assertEquals;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/PackageTest.java Fri Feb 27 17:23:01 2009
@@ -16,7 +16,8 @@
@RunWith(Suite.class)
@SuiteClasses( { ConverterTest.class,
TargetLengthBasedClassNameAbbreviatorTest.class, MDCConverterTest.class,
- MarkerConverterTest.class })
+ MarkerConverterTest.class, ExtendedThrowableProxyConverterTest.class,
+ ThrowableProxyConverterTest.class })
public class PackageTest {
}
\ No newline at end of file
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java Fri Feb 27 17:23:01 2009
@@ -8,7 +8,7 @@
import org.slf4j.LoggerFactory;
import org.slf4j.impl.StaticLoggerBinder;
-import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.selector.servlet.ContextDetachingSCL;
import ch.qos.logback.classic.util.MockInitialContext;
import ch.qos.logback.classic.util.MockInitialContextFactory;
@@ -21,14 +21,14 @@
@Before
public void setUp() throws Exception {
- System.setProperty(ClassicGlobal.LOGBACK_CONTEXT_SELECTOR, "JNDI");
+ System.setProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR, "JNDI");
//LoggerFactory.setup();
listener = new ContextDetachingSCL();
MockInitialContextFactory.initialize();
MockInitialContext mic = MockInitialContextFactory.getContext();
- mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "toto");
+ mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "toto");
//The property must be set after we setup the Mock
System.setProperty(INITIAL_CONTEXT_KEY, MockInitialContextFactory.class.getName());
@@ -54,11 +54,11 @@
@Test
public void testDetachWithMissingContext() {
MockInitialContext mic = MockInitialContextFactory.getContext();
- mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "tata");
+ mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "tata");
ContextJNDISelector selector = (ContextJNDISelector) StaticLoggerBinder.getSingleton().getContextSelector();
assertEquals("tata", selector.getLoggerContext().getName());
- mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "titi");
+ mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "titi");
assertEquals("titi", selector.getLoggerContext().getName());
listener.contextDestroyed(null);
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java Fri Feb 27 17:23:01 2009
@@ -9,7 +9,7 @@
import org.slf4j.impl.StaticLoggerBinder;
import org.slf4j.impl.StaticLoggerBinderFriend;
-import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.util.MockInitialContext;
import ch.qos.logback.classic.util.MockInitialContextFactory;
import ch.qos.logback.core.Context;
@@ -21,12 +21,12 @@
@Before
public void setUp() throws Exception {
- System.setProperty(ClassicGlobal.LOGBACK_CONTEXT_SELECTOR, "JNDI");
+ System.setProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR, "JNDI");
StaticLoggerBinderFriend.reset();
MockInitialContextFactory.initialize();
MockInitialContext mic = MockInitialContextFactory.getContext();
- mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "toto");
+ mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "toto");
//The property must be set after we setup the Mock
System.setProperty(INITIAL_CONTEXT_KEY, MockInitialContextFactory.class.getName());
@@ -50,7 +50,7 @@
@Test
public void testCreateContext() {
MockInitialContext mic = MockInitialContextFactory.getContext();
- mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, "tata");
+ mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "tata");
LoggerFactory.getLogger(ContextDetachingSCLTest.class);
@@ -64,7 +64,7 @@
@Test
public void defaultContext() {
MockInitialContext mic = MockInitialContextFactory.getContext();
- mic.map.put(ClassicGlobal.JNDI_CONTEXT_NAME, null);
+ mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, null);
ContextJNDISelector selector = (ContextJNDISelector)StaticLoggerBinder.getSingleton().getContextSelector();
Context context = selector.getLoggerContext();
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java Fri Feb 27 17:23:01 2009
@@ -6,6 +6,6 @@
public abstract Throwable getThrowable();
- public abstract ThrowableProxy getThrowableProxy();
+ public abstract IThrowableProxy getThrowableProxy();
}
\ No newline at end of file
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/DummyThrowableProxy.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/DummyThrowableProxy.java Fri Feb 27 17:23:01 2009
@@ -0,0 +1,49 @@
+package ch.qos.logback.classic.spi;
+
+public class DummyThrowableProxy implements IThrowableProxy {
+
+ private String className;
+ private String message;
+ private int commonFramesCount;
+ private ThrowableDataPoint[] throwableDataPointArray;
+ private IThrowableProxy cause;
+
+
+ public String getClassName() {
+ return className;
+ }
+ public void setClassName(String className) {
+ this.className = className;
+ }
+ public String getMessage() {
+ return message;
+ }
+ public void setMessage(String message) {
+ this.message = message;
+ }
+ public int getCommonFrames() {
+ return commonFramesCount;
+ }
+ public void setCommonFramesCount(int commonFramesCount) {
+ this.commonFramesCount = commonFramesCount;
+ }
+
+ public ThrowableDataPoint[] getThrowableDataPointArray() {
+ return throwableDataPointArray;
+ }
+ public void setThrowableDataPointArray(
+ ThrowableDataPoint[] throwableDataPointArray) {
+ this.throwableDataPointArray = throwableDataPointArray;
+ }
+
+ public IThrowableProxy getCause() {
+ return cause;
+ }
+ public void setCause(IThrowableProxy cause) {
+ this.cause = cause;
+ }
+
+
+
+
+}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java Fri Feb 27 17:23:01 2009
@@ -82,7 +82,7 @@
private Logger logger;
- private ThrowableProxy throwableInfo;
+ private IThrowableProxy throwableInfo;
private CallerData[] callerDataArray;
@@ -148,14 +148,14 @@
* Returns the throwable information contained within this event. May be
* <code>null</code> if there is no such information.
*/
- public ThrowableProxy getThrowableInformation() {
+ public IThrowableProxy getThrowableInformation() {
return throwableInfo;
}
/**
* Set this event's throwable information.
*/
- public void setThrowableInformation(ThrowableProxy ti) {
+ public void setThrowableInformation(IThrowableProxy ti) {
if (throwableInfo != null) {
throw new IllegalStateException(
"ThrowableInformation has been already set.");
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationPerfTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationPerfTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationPerfTest.java Fri Feb 27 17:23:01 2009
@@ -25,8 +25,11 @@
// Using LoggingEventDO
//
// average time per logging event: 4052 nanoseconds
-// size 544'086 bytes
-
+// average size=45, with params, average size=136
+//
+// Using LoggerEventVO, with loggerName, and loggerContextRemoteView
+// average time per logging event: 4034
+// average size 57, with params, average size=148
public class LoggingEventSerializationPerfTest {
@@ -50,8 +53,7 @@
for (int i = 0; i < loopLen; i++) {
try {
ILoggingEvent le = (ILoggingEvent) builder.build(i);
- //oos.writeObject(le);
- oos.writeObject(LoggingEventSDO.build(le));
+ oos.writeObject(LoggingEventVO.build(le));
oos.flush();
if (++resetCounter >= CoreConstants.OOS_RESET_FREQUENCY) {
@@ -78,18 +80,18 @@
noos.reset();
double avg = doLoop(builder, LOOP_LEN); noos.reset();
avg += doLoop(builder, LOOP_LEN); noos.reset();
- avg += doLoop(builder, LOOP_LEN); noos.reset();
+ avg += doLoop(builder, LOOP_LEN);
avg = avg/3;
System.out.println("avetage time per logging event "+avg+" nanoseconds");
- System.out.println("noos size "+noos.size());
- long actualSize = (long) (noos.size()/(1024*1.1d));
- double baosSizeLimit = 500;
+ long averageSize = (long) (noos.size()/(LOOP_LEN));
+ System.out.println("noos size "+noos.size()+ " average size="+averageSize);
+ double averageSizeLimit = 60;
- assertTrue("baos size " + actualSize + " should be less than "
- + baosSizeLimit, baosSizeLimit > actualSize);
+ assertTrue("average size " + averageSize + " should be less than "
+ + averageSizeLimit, averageSizeLimit > averageSize);
// the reference was computed on Orion (Ceki's computer)
long referencePerf = 5000;
@@ -107,12 +109,13 @@
doLoop(builder, LOOP_LEN);
noos.reset();
double avg = doLoop(builder, LOOP_LEN);
+ long averageSize = (long) (noos.size()/(LOOP_LEN));
- long actualSize = (long) (noos.size()/(1024*1.1d));
+ System.out.println("noos size "+noos.size()+ " average size="+averageSize);
- double baosSizeLimit = 1300;
- assertTrue("actualSize " + actualSize + " should be less than "
- + baosSizeLimit, baosSizeLimit > actualSize);
+ double averageSizeLimit = 160;
+ assertTrue("averageSize " + averageSize + " should be less than "
+ + averageSizeLimit, averageSizeLimit > averageSize);
// the reference was computed on Orion (Ceki's computer)
long referencePerf = 7000;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java Fri Feb 27 17:23:01 2009
@@ -64,12 +64,10 @@
ILoggingEvent remoteEvent = writeAndRead(event);
checkForEquality(event, remoteEvent);
- LoggerRemoteView loggerRemoteView = remoteEvent.getLoggerRemoteView();
- assertNotNull(loggerRemoteView);
- assertEquals("root", loggerRemoteView.getName());
+ assertNotNull(remoteEvent.getLoggerName());
+ assertEquals("root", remoteEvent.getLoggerName());
- LoggerContextRemoteView loggerContextRemoteView = loggerRemoteView
- .getLoggerContextView();
+ LoggerContextVO loggerContextRemoteView = remoteEvent.getLoggerContextVO();
assertNotNull(loggerContextRemoteView);
assertEquals("testContext", loggerContextRemoteView.getName());
Map<String, String> props = loggerContextRemoteView.getPropertyMap();
@@ -120,7 +118,7 @@
event.setArgumentArray(new Object[] { lucky0, null });
ILoggingEvent remoteEvent = writeAndRead(event);
checkForEquality(event, remoteEvent);
-
+
Object[] aa = remoteEvent.getArgumentArray();
assertNotNull(aa);
assertEquals(2, aa.length);
@@ -149,22 +147,20 @@
ILoggingEvent remoteEvent = writeAndRead(event);
checkForEquality(event, remoteEvent);
}
-
-
+
@Test
public void serializeLargeArgs() throws Exception {
-
+
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 100000; i++) {
buffer.append("X");
}
String largeString = buffer.toString();
- Object[] argArray = new Object[] {new LuckyCharms(2),
- largeString };
-
+ Object[] argArray = new Object[] { new LuckyCharms(2), largeString };
+
LoggingEvent event = createLoggingEvent();
event.setArgumentArray(argArray);
-
+
ILoggingEvent remoteEvent = writeAndRead(event);
checkForEquality(event, remoteEvent);
Object[] aa = remoteEvent.getArgumentArray();
@@ -186,11 +182,12 @@
assertEquals(original.getFormattedMessage(), afterSerialization
.getFormattedMessage());
assertEquals(original.getMessage(), afterSerialization.getMessage());
-
+
System.out.println();
-
- assertEquals(original.getThrowableProxy(), afterSerialization
+
+ ThrowableProxyVO witness = ThrowableProxyVO.build(original
.getThrowableProxy());
+ assertEquals(witness, afterSerialization.getThrowableProxy());
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java Fri Feb 27 17:23:01 2009
@@ -16,7 +16,7 @@
@RunWith(Suite.class)
@SuiteClasses( { ContextListenerTest.class, CallerDataTest.class,
LoggerComparatorTest.class, LoggingEventSerializationTest.class,
- LoggingEventSerializationPerfTest.class, ThrowableToDataPointTest.class,
+ LoggingEventSerializationPerfTest.class, ThrowableProxyTest.class,
BasicCPDCTest.class })
public class PackageTest {
}
\ No newline at end of file
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableProxyTest.java (from r2131, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableToDataPointTest.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableToDataPointTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableProxyTest.java Fri Feb 27 17:23:01 2009
@@ -9,9 +9,7 @@
import org.junit.Before;
import org.junit.Test;
-import ch.qos.logback.core.CoreConstants;
-
-public class ThrowableToDataPointTest {
+public class ThrowableProxyTest {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
@@ -26,19 +24,23 @@
public void verify(Throwable t) {
t.printStackTrace(pw);
+
+ IThrowableProxy tp = new ThrowableProxy(t);
- ThrowableDataPoint[] tdpArray = ThrowableToDataPointArray.convert(t);
- StringBuilder sb = new StringBuilder();
- for (ThrowableDataPoint tdp : tdpArray) {
- sb.append(tdp.toString());
- sb.append(CoreConstants.LINE_SEPARATOR);
- }
+ String result = ThrowableProxyUtil.asString(tp);
+ result = result.replace("common frames omitted", "more");
+
String expected = sw.toString();
- String result = sb.toString().replace("common frames omitted", "more");
+ System.out.println("========expected");
+ System.out.println(expected);
+
+ System.out.println("========result");
+ System.out.println(result);
+
assertEquals(expected, result);
}
-
+
@Test
public void smoke() {
Exception e = new Exception("smoke");
@@ -66,7 +68,7 @@
}
verify(w);
}
-
+
void someMethod() throws Exception {
throw new Exception("someMethod");
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java Fri Feb 27 17:23:01 2009
@@ -1,6 +1,7 @@
package ch.qos.logback.classic.spi.special;
import ch.qos.logback.classic.spi.CPDCSpecial;
+import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.PackagingDataCalculator;
import ch.qos.logback.classic.spi.ThrowableProxy;
@@ -9,7 +10,7 @@
Throwable throwable;
- ThrowableProxy throwableProxy;
+ IThrowableProxy throwableProxy;
public void doTest() {
nesting();
@@ -25,7 +26,7 @@
public Throwable getThrowable() {
return throwable;
}
- public ThrowableProxy getThrowableProxy() {
+ public IThrowableProxy getThrowableProxy() {
return throwableProxy;
}
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java Fri Feb 27 17:23:01 2009
@@ -6,7 +6,7 @@
import org.slf4j.MDC;
import org.slf4j.Marker;
-import ch.qos.logback.classic.ClassicGlobal;
+import ch.qos.logback.classic.ClassicConstants;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.core.spi.FilterReply;
@@ -31,7 +31,7 @@
if (!level.equals(Level.DEBUG)) {
return FilterReply.NEUTRAL;
}
- String user = MDC.get(ClassicGlobal.USER_MDC_KEY);
+ String user = MDC.get(ClassicConstants.USER_MDC_KEY);
if (user != null && userList.contains(user)) {
return FilterReply.ACCEPT;
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/IThrowableRenderer.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/IThrowableRenderer.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/html/IThrowableRenderer.java Fri Feb 27 17:23:01 2009
@@ -10,8 +10,8 @@
package ch.qos.logback.core.html;
-public interface IThrowableRenderer {
+public interface IThrowableRenderer<E> {
- public void render(StringBuilder sbuf, Object event);
+ public void render(StringBuilder sbuf, E event);
}
Modified: logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout.java Fri Feb 27 17:23:01 2009
@@ -8,13 +8,13 @@
public String doLayout(ILoggingEvent event) {
StringBuffer sbuf = new StringBuffer(128);
- sbuf.append(event.getTimeStamp() - event.getContextBirthTime());
+ sbuf.append(event.getTimeStamp() - event.getLoggerContextVO().getBirthTime());
sbuf.append(" ");
sbuf.append(event.getLevel());
sbuf.append(" [");
sbuf.append(event.getThreadName());
sbuf.append("] ");
- sbuf.append(event.getLoggerRemoteView().getName());
+ sbuf.append(event.getLoggerName());
sbuf.append(" - ");
sbuf.append(event.getFormattedMessage());
sbuf.append(CoreConstants.LINE_SEPARATOR);
Modified: logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout2.java
==============================================================================
--- logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout2.java (original)
+++ logback/trunk/logback-examples/src/main/java/chapter5/MySampleLayout2.java Fri Feb 27 17:23:01 2009
@@ -22,7 +22,7 @@
if (prefix != null) {
sbuf.append(prefix + ": ");
}
- sbuf.append(event.getTimeStamp() - event.getContextBirthTime());
+ sbuf.append(event.getTimeStamp() - event.getLoggerContextVO().getBirthTime());
sbuf.append(" ");
sbuf.append(event.getLevel());
if (printThreadName) {
@@ -32,7 +32,7 @@
} else {
sbuf.append(" ");
}
- sbuf.append(event.getLoggerRemoteView().getName());
+ sbuf.append(event.getLoggerName());
sbuf.append(" - ");
sbuf.append(event.getFormattedMessage());
sbuf.append(CoreConstants.LINE_SEPARATOR);
Modified: logback/trunk/logback-site/src/site/pages/news.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/news.html (original)
+++ logback/trunk/logback-site/src/site/pages/news.html Fri Feb 27 17:23:01 2009
@@ -40,6 +40,14 @@
a message</a> to the logback-user list
</p>
+ <p>If the logger name had 12 or more segments, a the logger
+ conversion specified would throw an
+ <code>ArrayIndexOfBounds</code> exception. Lukas Zapletal has
+ kindly reported this problem in <a
+ href="http://jira.qos.ch/browse/LBCLASSIC-110">LBCLASSIC-110</a>
+ and provided a test case.
+ </p>
+
<hr width="80%" align="center" />
<h3>12th of February 2009 - Release of version 0.9.15</h3>
2
1

svn commit: r2178 - logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html
by noreply.ceki@qos.ch 27 Feb '09
by noreply.ceki@qos.ch 27 Feb '09
27 Feb '09
Author: ceki
Date: Fri Feb 27 20:11:50 2009
New Revision: 2178
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
Log:
print nested exceptions appear correctly in DefaultThowableRenderer (used by HTMLLayout)
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java Fri Feb 27 20:11:50 2009
@@ -12,22 +12,30 @@
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
-import ch.qos.logback.classic.spi.ThrowableProxyUtil;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.helpers.Transform;
import ch.qos.logback.core.html.IThrowableRenderer;
-public class DefaultThrowableRenderer implements IThrowableRenderer<ILoggingEvent> {
-
+public class DefaultThrowableRenderer implements
+ IThrowableRenderer<ILoggingEvent> {
+
static final String TRACE_PREFIX = "<br /> ";
-
+
public DefaultThrowableRenderer() {
}
-
+
+ public void render(StringBuilder sbuf, ILoggingEvent event) {
+ IThrowableProxy tp = event.getThrowableProxy();
+ sbuf.append("<tr><td class=\"Exception\" colspan=\"6\">");
+ while (tp != null) {
+ render(sbuf, tp);
+ tp = tp.getCause();
+ }
+ sbuf.append("</td></tr>");
+ }
+
void render(StringBuilder sbuf, IThrowableProxy tp) {
- StringBuilder firstLine = new StringBuilder();
- ThrowableProxyUtil.printFirstLine(firstLine, tp);
- sbuf.append(Transform.escapeTags(firstLine.toString()));
+ printFirstLine(sbuf, tp);
int commonFrames = tp.getCommonFrames();
StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
@@ -45,14 +53,15 @@
.append(CoreConstants.LINE_SEPARATOR);
}
}
-
- public void render(StringBuilder sbuf, ILoggingEvent event) {
- IThrowableProxy tp = event.getThrowableProxy();
- sbuf.append("<tr><td class=\"Exception\" colspan=\"6\">");
- while(tp != null) {
- render(sbuf, tp);
- tp = tp.getCause();
+
+ public void printFirstLine(StringBuilder sb, IThrowableProxy tp) {
+ int commonFrames = tp.getCommonFrames();
+ if (commonFrames > 0) {
+ sb.append("<br />").append(CoreConstants.CAUSED_BY);
}
- sbuf.append("</td></tr>");
+ sb.append(tp.getClassName()).append(": ").append(
+ Transform.escapeTags(tp.getMessage()));
+ sb.append(CoreConstants.LINE_SEPARATOR);
}
+
}
1
0

svn commit: r2177 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db
by noreply.ceki@qos.ch 27 Feb '09
by noreply.ceki@qos.ch 27 Feb '09
27 Feb '09
Author: ceki
Date: Fri Feb 27 19:55:24 2009
New Revision: 2177
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java
Log:
more tests
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java Fri Feb 27 19:55:24 2009
@@ -9,9 +9,7 @@
import java.util.Map;
import org.junit.After;
-import org.junit.AfterClass;
import org.junit.Before;
-import org.junit.BeforeClass;
import org.junit.Test;
import ch.qos.logback.classic.Level;
@@ -29,21 +27,13 @@
DBAppender appender;
DriverManagerConnectionSource connectionSource;
- static DBAppenderTestFixture DB_APPENDER_TEST_FIXTURE;
-
- @BeforeClass
- public static void fixtureSetUp() throws SQLException {
- DB_APPENDER_TEST_FIXTURE = new DBAppenderTestFixture();
- DB_APPENDER_TEST_FIXTURE.setUp();
- }
-
- @AfterClass
- public static void fixtureTearDown() throws SQLException {
- DB_APPENDER_TEST_FIXTURE.tearDown();
- }
+ DBAppenderTestFixture dbAppenderTestFixture;
@Before
public void setUp() throws SQLException {
+ dbAppenderTestFixture = new DBAppenderTestFixture();
+ dbAppenderTestFixture.setUp();
+
lc = new LoggerContext();
lc.setName("default");
logger = lc.getLogger("root");
@@ -53,9 +43,9 @@
connectionSource = new DriverManagerConnectionSource();
connectionSource.setContext(lc);
connectionSource.setDriverClass(DBAppenderTestFixture.HSQLDB_DRIVER_CLASS);
- connectionSource.setUrl(DB_APPENDER_TEST_FIXTURE.url);
- connectionSource.setUser(DB_APPENDER_TEST_FIXTURE.user);
- connectionSource.setPassword(DB_APPENDER_TEST_FIXTURE.password);
+ connectionSource.setUrl(dbAppenderTestFixture.url);
+ connectionSource.setUser(dbAppenderTestFixture.user);
+ connectionSource.setPassword(dbAppenderTestFixture.password);
connectionSource.start();
appender.setConnectionSource(connectionSource);
appender.start();
@@ -67,6 +57,7 @@
lc = null;
appender = null;
connectionSource = null;
+ dbAppenderTestFixture.tearDown();
}
@Test
@@ -98,6 +89,7 @@
stmt.close();
}
+ @Test
public void testAppendThrowable() throws SQLException {
ILoggingEvent event = createLoggingEvent();
@@ -116,6 +108,7 @@
stmt.close();
}
+ @Test
public void testContextInfo() throws SQLException {
ILoggingEvent event = createLoggingEvent();
lc.putProperty("testKey1", "testValue1");
@@ -136,6 +129,7 @@
stmt.close();
}
+ @Test
public void testAppendMultipleEvents() throws SQLException {
for (int i = 0; i < 10; i++) {
ILoggingEvent event = createLoggingEvent();
1
0

27 Feb '09
Author: ceki
Date: Fri Feb 27 19:48:51 2009
New Revision: 2176
Modified:
logback/trunk/logback-site/src/site/pages/documentation.html
Log:
link to nogunner's article
Modified: logback/trunk/logback-site/src/site/pages/documentation.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/documentation.html (original)
+++ logback/trunk/logback-site/src/site/pages/documentation.html Fri Feb 27 19:48:51 2009
@@ -80,6 +80,10 @@
Evolving Java Logging</a> by Geoffrey Wiseman
</li>
+ <li><a
+ href="http://blog.kornr.net/index.php/2008/12/09/understanding-the-osgi-logging-s…">Understanding
+ the OSGI logging service</a> by Nogunner</li>
+
</ul>
<script src="templates/footer.js" type="text/javascript"></script>
1
0