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
March 2009
- 10 participants
- 80 discussions
Hello,
I have committed an initial version of the logback logging event
Corpus. The actual source is in the ch.qos.logback.classic.corpus
package.
Typical usage:
ILoggingEvent[] eventArray = Corpus.makeStandardCorpus();
The returned array contains 50'000 elements. Calling the
makeStandatdCorpus() method multiple times will yield the exact same
results every time. If you wish to vary the number of results returned
or use a different random generator seed, just look into the source
code. It should be fairly easy to adapt.
For the probabilistic model of the Corpus see the CorpusModel class.
Most of the work is done in this class.
Altough it makes several sweeping assumptions and may be improved on
several counts, I think the model is fairly representative of the logs
generated by a real application. You can see the output of the corpus
when dumped into a file at:
http://logback.qos.ch/corpus.txt
Your comments are welcome,
--
Ceki Gülcü
Logback: The reliable, generic, fast and flexible logging framework for Java.
http://logback.qos.ch
2
2

09 Mar '09
[ http://jira.qos.ch/browse/LBCORE-45?page=com.atlassian.jira.plugin.system.i… ]
Michael Franz commented on LBCORE-45:
-------------------------------------
Hello Ceki,
if I understand you correctly you mean: the WirterAppender calls the FlushingPolicy after appending a log message and you are seeing two alternatives for the task of the policy:
1. return a boolean if the Appender should perform flush
2. pass the writer or stream so that the policy can perform the flush?
Although there seem to be some nice use case (like flushing after error and buffering for debug messages) both cases do not fit well into my scenario with a long running appliation where it is not guaranteed that after a message without a flush, a message triggering a flush is really passed to the appender because of the possibility for dynamic changes of the working logging configuration.
Currently I have a thread that every 30 seconds calls a flush for all buffering WriterAppenders (thanks to Java reflection). Ok with the second approach I could store the streams for flushing within the next 30 seconds, but I would have concerns about the posibility that the appender can close those streams in the meantime or that there might by some other concurrency conflicts, because the actual implementation for the stream is controlled by the appender only.
Also your example with the FLUSH marker really sounds like a workaround, since it can't be the task of a log message to control the behaviour of the logging system.
> introduce FlushableAppender
> ---------------------------
>
> Key: LBCORE-45
> URL: http://jira.qos.ch/browse/LBCORE-45
> Project: logback-core
> Issue Type: Improvement
> Components: Appender
> Affects Versions: unspecified
> Environment: Operating System: Linux
> Platform: PC
> Reporter: Bruno Navert
> Assignee: Ceki Gulcu
> Priority: Minor
>
> Suggest a new sub-interface of Appender:
> public interface FlushableAppender<E> extends Appender<E>, java.io.Flushable
> {
> }
> Then, WriterAppender could be defined to implement FlushableAppender, with this simple implementation:
> public void flush() throws IOException
> {
> writer.flush();
> }
> This would allow manual flushing of the appenders. This is particularly useful when buffered IO is used, obviously. It allows, for instance, to manually flush all appenders when a request has been fully processed, ensuring that we retain the benefits of buffered IO while also having the full logs after request processing.
> Here's sample code I used to get all appenders (run once after Logback configuration):
> public static Set<Appender> getAllAppenders()
> {
> ContextSelector selector = StaticLoggerBinder.SINGLETON.getContextSelector();
> LoggerContext loggerContext = selector.getLoggerContext();
> Map<String, Appender> appenders = newHashMap();
> // loop through all Loggers
> for ( Logger logger : loggerContext.getLoggerList() )
> {
> // for each logger, loop through all its appenders
> Iterator iter = logger.iteratorForAppenders();
> while ( iter.hasNext() )
> {
> // appenders are uniquely identified by name, so store them in the Map thus
> // this will overwrite the same entry in the Map many times (with the same reference)
> Appender appender = ( Appender ) iter.next();
> appenders.put( appender.getName(), appender );
> }
> }
> return newHashSet( appenders.values() );
> }
> The below bean is used in Spring, calling flush() forces all appenders to be flushed:
> public class LogbackFlushBean implements Flushable
> {
> protected final Logger log = LoggerFactory.getLogger( getClass() );
> private final Collection<FlushableAppender> flushableAppenders = newLinkedList();
> @PostConstruct
> public void loadFlushableAppenders()
> {
> for ( Appender appender : LogbackConfigurer.getAllAppenders() )
> {
> if ( appender instanceof FlushableAppender )
> {
> flushableAppenders.add( ( FlushableAppender ) appender );
> }
> else
> {
> log.debug( "appender {} is not Flushable, skipping", appender.getName() );
> }
> }
> }
> public void flush() throws IOException
> {
> for ( FlushableAppender appender : flushableAppenders )
> {
> log.debug( "flushing appender {}", appender.getName() );
> appender.flush();
> }
> }
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
0
Author: ceki
Date: Fri Mar 6 21:49:37 2009
New Revision: 2195
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/net/SyslogAppender.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/spi/StackTraceElementProxy.java
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/ThrowableProxyUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java
logback/trunk/logback-examples/src/main/java/chapter5/ (props changed)
Log:
- StackElementProxy's toSting() method no longer prepends the TAB character
- code dependent on this behavior was adapted consequently
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 Mar 6 21:49:37 2009
@@ -17,6 +17,7 @@
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.core.CoreConstants;
import ch.qos.logback.core.LayoutBase;
import ch.qos.logback.core.helpers.Transform;
@@ -128,6 +129,7 @@
StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
buf.append(" <log4j:throwable><![CDATA[");
for (StackTraceElementProxy step : stepArray) {
+ buf.append(CoreConstants.TAB);
buf.append(step.toString());
buf.append("\r\n");
}
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 Mar 6 21:49:37 2009
@@ -17,6 +17,7 @@
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.classic.util.LevelToSyslogSeverity;
+import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.net.SyslogAppenderBase;
import ch.qos.logback.core.net.SyslogWriter;
@@ -80,7 +81,9 @@
StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
try {
for (StackTraceElementProxy step : stepArray) {
- sw.write(prefix + step.toString());
+ sw.write(prefix);
+ sw.write(CoreConstants.TAB);
+ sw.write(step.toString());
sw.flush();
}
} catch (IOException e) {
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 Mar 6 21:49:37 2009
@@ -141,7 +141,7 @@
void printThrowableProxy(StringBuilder buf, IThrowableProxy tp) {
ThrowableProxyUtil.printFirstLine(buf, tp);
-
+ buf.append(CoreConstants.LINE_SEPARATOR);
StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
int commonFrames = tp.getCommonFrames();
@@ -156,6 +156,7 @@
for (int i = 0; i < maxIndex; i++) {
String string = stepArray[i].toString();
+ buf.append(CoreConstants.TAB);
buf.append(string);
extraData(buf, stepArray[i]); // allow other data to be added
buf.append(CoreConstants.LINE_SEPARATOR);
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java Fri Mar 6 21:49:37 2009
@@ -22,7 +22,7 @@
public String getSTEAsString() {
if (steAsString == null) {
- steAsString = "\tat " + ste.toString();
+ steAsString = "at " + ste.toString();
}
return steAsString;
}
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 Mar 6 21:49:37 2009
@@ -103,7 +103,7 @@
StringBuilder builder = new StringBuilder();
for (StackTraceElementProxy step : stackTraceElementProxyArray) {
String string = step.toString();
- builder.append(string);
+ builder.append(CoreConstants.TAB).append(string);
ThrowableProxyUtil.appendPackagingData(builder, step);
builder.append(CoreConstants.LINE_SEPARATOR);
}
Modified: 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/ThrowableProxyUtil.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java Fri Mar 6 21:49:37 2009
@@ -71,6 +71,7 @@
while (tp != null) {
printFirstLine(sb, tp);
+ sb.append(CoreConstants.LINE_SEPARATOR);
printSTEPArray(sb, tp);
tp = tp.getCause();
}
@@ -104,6 +105,7 @@
for (int i = 0; i < stepArray.length - commonFrames; i++) {
StackTraceElementProxy step = stepArray[i];
+ sb.append(CoreConstants.TAB);
printSTEP(sb, step);
sb.append(CoreConstants.LINE_SEPARATOR);
}
@@ -121,6 +123,5 @@
buf.append(CoreConstants.CAUSED_BY);
}
buf.append(tp.getClassName()).append(": ").append(tp.getMessage());
- buf.append(CoreConstants.LINE_SEPARATOR);
}
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java Fri Mar 6 21:49:37 2009
@@ -41,7 +41,7 @@
static public final int STANDARD_CORPUS_SIZE = 50 * 1000;
private static final int STANDARD_SEED = 34780;
- static List<String> getStandatdCorpusWordList() throws IOException {
+ static public List<String> getStandatdCorpusWordList() throws IOException {
ClassLoader classLoader = Corpus.class.getClassLoader();
URL originOfSpeciesURL = classLoader
.getResource("corpus/origin_of_species.txt");
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java Fri Mar 6 21:49:37 2009
@@ -12,6 +12,8 @@
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@@ -20,8 +22,10 @@
public static List<String> toWords(URL url) throws IOException {
- String filename = url.getFile();
- return toWords(filename);
+ InputStream is = url.openStream();
+ InputStreamReader reader = new InputStreamReader(is);
+ BufferedReader br = new BufferedReader(reader);
+ return toWords(br);
}
public static List<String> toWords(String filename) throws IOException {
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 Mar 6 21:49:37 2009
@@ -115,7 +115,7 @@
String[] result = buf.toString().split(CoreConstants.LINE_SEPARATOR);
System.out.println(result[0]);
assertEquals("test1: msg1", result[0]);
- assertEquals(DefaultThrowableRenderer.TRACE_PREFIX + "\tat c1.m1(f1:1)", result[1]);
+ assertEquals(DefaultThrowableRenderer.TRACE_PREFIX + "at c1.m1(f1:1)", result[1]);
}
@Test
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java Fri Mar 6 21:49:37 2009
@@ -80,4 +80,5 @@
public static long REFERENCE_BIPS = 9000;
static public final char DOT = '.';
+ static public final char TAB = '\t';
}
1
0

svn commit: r2191 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic/spi test/java/ch/qos/logback/classic/corpus
by noreply.ceki@qos.ch 06 Mar '09
by noreply.ceki@qos.ch 06 Mar '09
06 Mar '09
Author: ceki
Date: Fri Mar 6 19:27:06 2009
New Revision: 2191
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
Log:
minor changes
Modified: 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/ThrowableProxyUtil.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java Fri Mar 6 19:27:06 2009
@@ -93,14 +93,18 @@
}
}
+ static public void printSTEP(StringBuilder sb, StackTraceElementProxy step) {
+ sb.append(step.toString());
+ appendPackagingData(sb, step);
+ }
+
static public void printSTEPArray(StringBuilder sb, IThrowableProxy tp) {
StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
int commonFrames = tp.getCommonFrames();
for (int i = 0; i < stepArray.length - commonFrames; i++) {
StackTraceElementProxy step = stepArray[i];
- sb.append(step.toString());
- appendPackagingData(sb, step);
+ printSTEP(sb, step);
sb.append(CoreConstants.LINE_SEPARATOR);
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java Fri Mar 6 19:27:06 2009
@@ -29,19 +29,25 @@
*
* <p>if you wish to dump the events into a file, say "/corpus.log" :
*
- * <p>
- * <code>Corpus.dump(eventArray, "/corpus.log");
+ * <p> <code>Corpus.dump(eventArray, "/corpus.log");
*
* <p>For the model behind the corpus, refer to {@link CorpusModel}.
*
* @author Ceki Gülcü
- *
+ *
*/
public class Corpus {
static public final int STANDARD_CORPUS_SIZE = 50 * 1000;
private static final int STANDARD_SEED = 34780;
+ static List<String> getStandatdCorpusWordList() throws IOException {
+ ClassLoader classLoader = Corpus.class.getClassLoader();
+ URL originOfSpeciesURL = classLoader
+ .getResource("corpus/origin_of_species.txt");
+ return TextFileUtil.toWords(originOfSpeciesURL);
+ }
+
/**
* Make a standard corpus. The standard corpus has
* {@link #STANDARD_CORPUS_SIZE} elements.
@@ -50,31 +56,28 @@
* @throws IOException
*/
static public ILoggingEvent[] makeStandardCorpus() throws IOException {
- ClassLoader classLoader = Corpus.class.getClassLoader();
- URL originOfSpeciesURL = classLoader
- .getResource("corpus/origin_of_species.txt");
- List<String> worldList = TextFileUtil.toWords(originOfSpeciesURL);
+ List<String> worldList = getStandatdCorpusWordList();
CorpusModel corpusMaker = new CorpusModel(STANDARD_SEED, worldList);
return make(corpusMaker, STANDARD_CORPUS_SIZE);
}
- static public ILoggingEvent[] make(CorpusModel corpusMaker, int n) {
- LoggerContextVO lcVO = corpusMaker.getRandomlyNamedLoggerContextVO();
+ static public ILoggingEvent[] make(CorpusModel corpusModel, int n) {
+ LoggerContextVO lcVO = corpusModel.getRandomlyNamedLoggerContextVO();
PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n];
for (int i = 0; i < n; i++) {
PubLoggingEventVO e = new PubLoggingEventVO();
plevoArray[i] = e;
e.loggerContextVO = lcVO;
- e.timeStamp = corpusMaker.getRandomTimeStamp();
+ e.timeStamp = corpusModel.getRandomTimeStamp();
- LogStatement logStatement = corpusMaker.getRandomLogStatementFromPool();
+ LogStatement logStatement = corpusModel.getRandomLogStatementFromPool();
e.loggerName = logStatement.loggerName;
e.level = logStatement.level;
e.message = logStatement.mat.message;
- e.argumentArray = corpusMaker
+ e.argumentArray = corpusModel
.getRandomArgumentArray(logStatement.mat.numberOfArguments);
e.throwableProxy = logStatement.throwableProxy;
- e.threadName = corpusMaker.getRandomThreadNameFromPool();
+ e.threadName = corpusModel.getRandomThreadNameFromPool();
}
return plevoArray;
}
1
0

svn commit: r2187 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi
by noreply.ceki@qos.ch 06 Mar '09
by noreply.ceki@qos.ch 06 Mar '09
06 Mar '09
Author: ceki
Date: Fri Mar 6 17:55:05 2009
New Revision: 2187
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java
Log:
copyright statement
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java Fri Mar 6 17:55:05 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.spi;
import java.io.IOException;
1
0

svn commit: r2186 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus
by noreply.ceki@qos.ch 06 Mar '09
by noreply.ceki@qos.ch 06 Mar '09
06 Mar '09
Author: ceki
Date: Fri Mar 6 17:54:46 2009
New Revision: 2186
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/ExceptionBuilder.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java
Log:
more javadocs + copyright statement
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java Fri Mar 6 17:54:46 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.corpus;
import java.io.FileWriter;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/ExceptionBuilder.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/ExceptionBuilder.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/ExceptionBuilder.java Fri Mar 6 17:54:46 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.corpus;
import java.io.IOException;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java Fri Mar 6 17:54:46 2009
@@ -1,8 +1,25 @@
+/**
+ * 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.corpus;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.IThrowableProxy;
+/**
+ * Captures the data contained within a log statement, that is the data that the
+ * developer puts in the source code when he writes:
+ *
+ * <p>logger.debug("hello world");
+ *
+ * @author Ceki Gülcü
+ */
public class LogStatement {
final String loggerName;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java Fri Mar 6 17:54:46 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.corpus;
public class MessageArgumentTuple {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java Fri Mar 6 17:54:46 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.corpus;
import java.io.BufferedReader;
1
0

svn commit: r2185 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus
by noreply.ceki@qos.ch 06 Mar '09
by noreply.ceki@qos.ch 06 Mar '09
06 Mar '09
Author: ceki
Date: Fri Mar 6 16:20:09 2009
New Revision: 2185
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
Log:
flush before exit
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java Fri Mar 6 16:20:09 2009
@@ -77,7 +77,7 @@
* @param targetFile
* @throws IOException
*/
- public void dump(ILoggingEvent[] eventArray, String targetFile)
+ public static void dump(ILoggingEvent[] eventArray, String targetFile)
throws IOException {
FileWriter fw = new FileWriter(targetFile);
for (ILoggingEvent e : eventArray) {
@@ -88,6 +88,8 @@
fw.write(ThrowableProxyUtil.asString(tp));
}
}
+ fw.flush();
+ fw.close();
}
}
1
0

svn commit: r2184 - in logback/trunk/logback-classic/src/test: input/corpus java/ch/qos/logback/classic/corpus resources/corpus
by noreply.ceki@qos.ch 06 Mar '09
by noreply.ceki@qos.ch 06 Mar '09
06 Mar '09
Author: ceki
Date: Fri Mar 6 16:04:37 2009
New Revision: 2184
Added:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusModel.java
- copied, changed from r2183, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java
- copied, changed from r2183, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java
logback/trunk/logback-classic/src/test/resources/corpus/
- copied from r2179, /logback/trunk/logback-classic/src/test/input/corpus/
Removed:
logback/trunk/logback-classic/src/test/input/corpus/
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java
Log:
Finishing up work on the Corpus.
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java Fri Mar 6 16:04:37 2009
@@ -1,18 +1,55 @@
package ch.qos.logback.classic.corpus;
+import java.io.FileWriter;
import java.io.IOException;
+import java.net.URL;
import java.util.List;
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.classic.spi.PubLoggingEventVO;
+import ch.qos.logback.classic.spi.ThrowableProxyUtil;
+import ch.qos.logback.core.CoreConstants;
+/**
+ *
+ * <p>Usage:
+ *
+ * <p><code>ILoggingEvent[] eventArray = Corpus.makeStandardCorpus();</code>
+ *
+ * <p>if you wish to dump the events into a file, say "/corpus.log" :
+ *
+ * <p>
+ * <code>Corpus.dump(eventArray, "/corpus.log");
+ *
+ * <p>For the model behind the corpus, refer to {@link CorpusModel}.
+ *
+ * @author Ceki Gülcü
+ *
+ */
public class Corpus {
-
- static final int STANDARD_CORPUS_SIZE = 50 * 1000;
- static final int STANDARD_SEED = 1123;
- static public ILoggingEvent[] make(CorpusMaker corpusMaker, int n) {
+ static public final int STANDARD_CORPUS_SIZE = 50 * 1000;
+ private static final int STANDARD_SEED = 34780;
+
+ /**
+ * Make a standard corpus. The standard corpus has
+ * {@link #STANDARD_CORPUS_SIZE} elements.
+ *
+ * @return event array representing the standard corpus
+ * @throws IOException
+ */
+ static public ILoggingEvent[] makeStandardCorpus() throws IOException {
+ ClassLoader classLoader = Corpus.class.getClassLoader();
+ URL originOfSpeciesURL = classLoader
+ .getResource("corpus/origin_of_species.txt");
+ List<String> worldList = TextFileUtil.toWords(originOfSpeciesURL);
+ CorpusModel corpusMaker = new CorpusModel(STANDARD_SEED, worldList);
+ return make(corpusMaker, STANDARD_CORPUS_SIZE);
+ }
+
+ static public ILoggingEvent[] make(CorpusModel corpusMaker, int n) {
LoggerContextVO lcVO = corpusMaker.getRandomlyNamedLoggerContextVO();
PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n];
for (int i = 0; i < n; i++) {
@@ -20,23 +57,37 @@
plevoArray[i] = e;
e.loggerContextVO = lcVO;
e.timeStamp = corpusMaker.getRandomTimeStamp();
-
+
LogStatement logStatement = corpusMaker.getRandomLogStatementFromPool();
e.loggerName = logStatement.loggerName;
e.level = logStatement.level;
- e.message = logStatement.messagerItem.message;
- e.argumentArray = corpusMaker.getRandomArgumentArray(logStatement.messagerItem.numberOfArguments);
+ e.message = logStatement.mat.message;
+ e.argumentArray = corpusMaker
+ .getRandomArgumentArray(logStatement.mat.numberOfArguments);
e.throwableProxy = logStatement.throwableProxy;
e.threadName = corpusMaker.getRandomThreadNameFromPool();
}
return plevoArray;
}
- static public ILoggingEvent[] makeStandardCorpus() throws IOException {
- List<String> worldList = TextFileUtil
- .toWords("src/test/input/corpus/origin_of_species.txt");
- CorpusMaker corpusMaker = new CorpusMaker(STANDARD_SEED, worldList);
- return make(corpusMaker, STANDARD_CORPUS_SIZE);
+ /**
+ * Dump the events passed as argument into the file named targetFile.
+ *
+ * @param eventArray
+ * @param targetFile
+ * @throws IOException
+ */
+ public void dump(ILoggingEvent[] eventArray, String targetFile)
+ throws IOException {
+ FileWriter fw = new FileWriter(targetFile);
+ for (ILoggingEvent e : eventArray) {
+ fw.write(e.toString());
+ fw.append(CoreConstants.LINE_SEPARATOR);
+ if (e.getThrowableProxy() != null) {
+ IThrowableProxy tp = e.getThrowableProxy();
+ fw.write(ThrowableProxyUtil.asString(tp));
+ }
+ }
}
}
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusModel.java (from r2183, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusModel.java Fri Mar 6 16:04:37 2009
@@ -20,44 +20,75 @@
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxyVO;
-public class CorpusMaker {
+/**
+ * Models the corpus.
+ *
+ * <p>This contains the probability distributions of levels, logger names,
+ * messages, message arguments.
+ *
+ * @author Ceki Gülcü
+ *
+ */
+public class CorpusModel {
+
+ // N(u,s) denotes a random variable normally distributed with mean u and
+ // variance sqrt(s), where sqrt() is the square root function. For an
+ // explanation of normal distribution please see
+ // http://en.wikipedia.org/wiki/Normal_distribution
+
+ // It is assumed that the number of parts in a logger name is a random
+ // variable normally distributed with mean AVERAGE_LOGGER_NAME_PARTS and
+ // standard deviation STD_DEV_FOR_LOGGER_NAME_PARTS
+ static final int AVERAGE_LOGGER_NAME_PARTS = 6;
+ static final int STD_DEV_FOR_LOGGER_NAME_PARTS = 3;
+
+ // It is assumed that there are LOGGER_POOL_SIZE logger names
+ // in our model corpus.
+ static final int LOGGER_POOL_SIZE = 1000;
+
+ // It is assumed that there are LOG_STATEMENT_POOL_SIZE log statements
+ // in our model corpus.
+ static final int LOG_STATEMENT_POOL_SIZE = LOGGER_POOL_SIZE * 8;
// level distribution is determined by the following table
- // it corresponds to TRACE 20%, DEBUG 30%, INFO 30%, WARN 10%,
+ // It corresponds to TRACE 20%, DEBUG 30%, INFO 30%, WARN 10%,
// ERROR 10%. See also getRandomLevel() method.
static final double[] LEVEL_DISTRIBUTION = new double[] { .2, .5, .8, .9 };
+ // It is assumed that the number of words in the message (contained in a log
+ // statement) is a random variable normally distributed with mean
+ // AVERAGE_MESSAGE_WORDS and standard deviation STD_DEV_FOR_MESSAGE_WORDS
+ static final int AVERAGE_MESSAGE_WORDS = 8;
+ static final int STD_DEV_FOR_MESSAGE_WORDS = 4;
+
// messages will have no arguments 80% of the time, one argument in 8%, two
// arguments in 7% and three arguments in 5% of cases
static final double[] ARGUMENT_DISTRIBUTION = new double[] { .80, .88, 0.95 };
static final double THROWABLE_PROPABILITY_FOR_WARNING = .1;
static final double THROWABLE_PROPABILITY_FOR_ERRORS = .3;
+ // .5 of throwables are nested once
static final double NESTING_PROBABILITY = .5;
- static final int AVERAGE_LOGGER_NAME_PARTS = 6;
- static final int STD_DEV_FOR_LOGGER_NAME_PARTS = 3;
-
- static final int AVERAGE_MESSAGE_WORDS = 8;
- static final int STD_DEV_FOR_MESSAGE_WORDS = 4;
-
+ // For each logging event the timer is incremented by a certain value. it is
+ // assumed that this value is a random variable normally distributed with mean
+ // AVERAGE_MILLIS_INCREMENT and standard deviation
+ // STD_DEV_FOR_MILLIS_INCREMENT
static final int AVERAGE_MILLIS_INCREMENT = 10;
static final int STD_DEV_FOR_MILLIS_INCREMENT = 5;
+ // assume that there are THREAD_POOL_SIZE threads in the corpus
static final int THREAD_POOL_SIZE = 10;
- static final int LOGGER_POOL_SIZE = 1000;
- static final int LOG_STATEMENT_POOL_SIZE = LOGGER_POOL_SIZE * 8;
final Random random;
- List<String> worldList;
+ final List<String> worldList;
String[] threadNamePool;
-
LogStatement[] logStatementPool;
// 2009-03-06 13:08 GMT
long lastTimeStamp = 1236344888578L;
- public CorpusMaker(long seed, List<String> worldList) {
+ public CorpusModel(long seed, List<String> worldList) {
random = new Random(seed);
this.worldList = worldList;
buildThreadNamePool();
@@ -149,7 +180,7 @@
return argumentArray;
}
- private MessageItem makeRandomMessageEntry() {
+ private MessageArgumentTuple makeRandomMessageArgumentTuple() {
int numOfArguments = getNumberOfMessageArguments();
int wordCount = RandomUtil.gaussianAsPositiveInt(random,
@@ -167,11 +198,11 @@
sb.append(wordArray[i]).append(' ');
}
sb.append(getRandomWord());
- return new MessageItem(sb.toString(), numOfArguments);
+ return new MessageArgumentTuple(sb.toString(), numOfArguments);
}
private LogStatement makeRandomLogStatement(String[] loggerNamePool) {
- MessageItem mi = makeRandomMessageEntry();
+ MessageArgumentTuple mat = makeRandomMessageArgumentTuple();
String loggerName = getRandomLoggerNameFromPool(loggerNamePool);
Level randomLevel = getRandomLevel();
Throwable t = getRandomThrowable(randomLevel);
@@ -180,7 +211,7 @@
throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t));
pupulateWithPackagingData(throwableProxy.getStackTraceElementProxyArray());
}
- LogStatement logStatement = new LogStatement(loggerName, randomLevel, mi,
+ LogStatement logStatement = new LogStatement(loggerName, randomLevel, mat,
throwableProxy);
return logStatement;
}
@@ -208,7 +239,7 @@
step.setClassPackagingData(cpd);
}
}
-
+
private int getNumberOfMessageArguments() {
double rn = random.nextDouble();
if (rn < ARGUMENT_DISTRIBUTION[0]) {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java Fri Mar 6 16:04:37 2009
@@ -6,24 +6,16 @@
public class LogStatement {
final String loggerName;
- final MessageItem messagerItem;
+ final MessageArgumentTuple mat;
final Level level;
final IThrowableProxy throwableProxy;
- public LogStatement(String loggerName, Level level, MessageItem messagerItem,
+ public LogStatement(String loggerName, Level level, MessageArgumentTuple mat,
IThrowableProxy tp) {
this.loggerName = loggerName;
this.level = level;
- this.messagerItem = messagerItem;
+ this.mat = mat;
this.throwableProxy = tp;
}
- public String getLoggerName() {
- return loggerName;
- }
-
- public MessageItem getMessagerItem() {
- return messagerItem;
- }
-
}
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java (from r2183, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java Fri Mar 6 16:04:37 2009
@@ -1,16 +1,15 @@
package ch.qos.logback.classic.corpus;
-public class MessageItem {
-
+public class MessageArgumentTuple {
final String message;
final int numberOfArguments;
- MessageItem(String message) {
+ MessageArgumentTuple(String message) {
this(message, 0);
}
- public MessageItem(String message, int numberOfArguments) {
+ public MessageArgumentTuple(String message, int numberOfArguments) {
this.message = message;
this.numberOfArguments = numberOfArguments;
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java Fri Mar 6 16:04:37 2009
@@ -3,11 +3,17 @@
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class TextFileUtil {
+
+ public static List<String> toWords(URL url) throws IOException {
+ String filename = url.getFile();
+ return toWords(filename);
+ }
public static List<String> toWords(String filename) throws IOException {
FileReader fr = new FileReader(filename);
1
0

svn commit: r2183 - in logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic: corpus spi
by noreply.ceki@qos.ch 06 Mar '09
by noreply.ceki@qos.ch 06 Mar '09
06 Mar '09
Author: ceki
Date: Fri Mar 6 14:52:38 2009
New Revision: 2183
Added:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java
- copied, changed from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java
Removed:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java
Log:
Still working on the Corpus
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java Fri Mar 6 14:52:38 2009
@@ -0,0 +1,42 @@
+package ch.qos.logback.classic.corpus;
+
+import java.io.IOException;
+import java.util.List;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.LoggerContextVO;
+import ch.qos.logback.classic.spi.PubLoggingEventVO;
+
+public class Corpus {
+
+ static final int STANDARD_CORPUS_SIZE = 50 * 1000;
+ static final int STANDARD_SEED = 1123;
+
+ static public ILoggingEvent[] make(CorpusMaker corpusMaker, int n) {
+ LoggerContextVO lcVO = corpusMaker.getRandomlyNamedLoggerContextVO();
+ PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n];
+ for (int i = 0; i < n; i++) {
+ PubLoggingEventVO e = new PubLoggingEventVO();
+ plevoArray[i] = e;
+ e.loggerContextVO = lcVO;
+ e.timeStamp = corpusMaker.getRandomTimeStamp();
+
+ LogStatement logStatement = corpusMaker.getRandomLogStatementFromPool();
+ e.loggerName = logStatement.loggerName;
+ e.level = logStatement.level;
+ e.message = logStatement.messagerItem.message;
+ e.argumentArray = corpusMaker.getRandomArgumentArray(logStatement.messagerItem.numberOfArguments);
+ e.throwableProxy = logStatement.throwableProxy;
+ e.threadName = corpusMaker.getRandomThreadNameFromPool();
+ }
+ return plevoArray;
+ }
+
+ static public ILoggingEvent[] makeStandardCorpus() throws IOException {
+ List<String> worldList = TextFileUtil
+ .toWords("src/test/input/corpus/origin_of_species.txt");
+ CorpusMaker corpusMaker = new CorpusMaker(STANDARD_SEED, worldList);
+ return make(corpusMaker, STANDARD_CORPUS_SIZE);
+ }
+
+}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java Fri Mar 6 14:52:38 2009
@@ -9,32 +9,27 @@
*/
package ch.qos.logback.classic.corpus;
-import java.io.IOException;
import java.util.List;
import java.util.Random;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ClassPackagingData;
-import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggerContextVO;
-import ch.qos.logback.classic.spi.PubLoggingEventVO;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxyVO;
public class CorpusMaker {
- static final int STANDARD_CORPUS_SIZE = 100*1000;
-
// level distribution is determined by the following table
// it corresponds to TRACE 20%, DEBUG 30%, INFO 30%, WARN 10%,
// ERROR 10%. See also getRandomLevel() method.
static final double[] LEVEL_DISTRIBUTION = new double[] { .2, .5, .8, .9 };
- // messages will have no arguments 90% of the time, one argument in 3%, two
- // arguments in 3% and three arguments in 3% of cases
- static final double[] ARGUMENT_DISTRIBUTION = new double[] { .90, .933, 0.966 };
+ // messages will have no arguments 80% of the time, one argument in 8%, two
+ // arguments in 7% and three arguments in 5% of cases
+ static final double[] ARGUMENT_DISTRIBUTION = new double[] { .80, .88, 0.95 };
static final double THROWABLE_PROPABILITY_FOR_WARNING = .1;
static final double THROWABLE_PROPABILITY_FOR_ERRORS = .3;
@@ -46,86 +41,95 @@
static final int AVERAGE_MESSAGE_WORDS = 8;
static final int STD_DEV_FOR_MESSAGE_WORDS = 4;
+ static final int AVERAGE_MILLIS_INCREMENT = 10;
+ static final int STD_DEV_FOR_MILLIS_INCREMENT = 5;
+
static final int THREAD_POOL_SIZE = 10;
+ static final int LOGGER_POOL_SIZE = 1000;
+ static final int LOG_STATEMENT_POOL_SIZE = LOGGER_POOL_SIZE * 8;
final Random random;
List<String> worldList;
String[] threadNamePool;
+ LogStatement[] logStatementPool;
+
+ // 2009-03-06 13:08 GMT
+ long lastTimeStamp = 1236344888578L;
+
public CorpusMaker(long seed, List<String> worldList) {
random = new Random(seed);
this.worldList = worldList;
buildThreadNamePool();
+ buildLogStatementPool();
}
- void buildThreadNamePool() {
+ private void buildThreadNamePool() {
threadNamePool = new String[THREAD_POOL_SIZE];
for (int i = 0; i < THREAD_POOL_SIZE; i++) {
threadNamePool[i] = "CorpusMakerThread-" + i;
}
}
- static public ILoggingEvent[] makeStandardCorpus() throws IOException {
- List<String> worldList = TextFileUtil
- .toWords("src/test/input/corpus/origin_of_species.txt");
- CorpusMaker corpusMaker = new CorpusMaker(10, worldList);
- return corpusMaker.make(STANDARD_CORPUS_SIZE);
+ private void buildLogStatementPool() {
+ String[] loggerNamePool = new String[LOGGER_POOL_SIZE];
+ for (int i = 0; i < LOGGER_POOL_SIZE; i++) {
+ loggerNamePool[i] = makeRandomLoggerName();
+ }
+ logStatementPool = new LogStatement[LOG_STATEMENT_POOL_SIZE];
+ for (int i = 0; i < LOG_STATEMENT_POOL_SIZE; i++) {
+ logStatementPool[i] = makeRandomLogStatement(loggerNamePool);
+ }
}
- public ILoggingEvent[] make(int n) {
-
- LoggerContextVO lcVO = getRandomlyNamedLoggerContextVO();
+ private int[] getRandomAnchorPositions(int wordCount, int numAnchors) {
+ // note that the same position may appear multiple times in
+ // positionsIndex, but without serious consequences
+ int[] positionsIndex = new int[numAnchors];
+ for (int i = 0; i < numAnchors; i++) {
+ positionsIndex[i] = random.nextInt(wordCount);
+ }
+ return positionsIndex;
+ }
- PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n];
+ private String[] getRandomWords(int n) {
+ String[] wordArray = new String[n];
for (int i = 0; i < n; i++) {
- PubLoggingEventVO e = new PubLoggingEventVO();
- plevoArray[i] = e;
- e.timeStamp = getRandomLong();
- e.loggerName = getRandomLoggerName();
- e.level = getRandomLevel();
- MessageEntry me = getRandomMessageEntry();
- e.message = me.message;
- e.argumentArray = me.argumentArray;
- e.loggerContextVO = lcVO;
- Throwable t = getRandomThrowable(e.level);
- if (t != null) {
- e.throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t));
- pupulateWithPackagingData(e.throwableProxy
- .getStackTraceElementProxyArray());
- }
- e.threadName = getRandomThreadName();
+ wordArray[i] = getRandomWord();
}
- return plevoArray;
+ return wordArray;
}
- void pupulateWithPackagingData(StackTraceElementProxy[] stepArray) {
- int i = 0;
- for (StackTraceElementProxy step : stepArray) {
- String identifier = "na";
- String version = "na";
- if (i++ % 2 == 0) {
- identifier = getRandomJavaIdentifier();
- version = getRandomJavaIdentifier();
- }
- ClassPackagingData cpd = new ClassPackagingData(identifier, version);
- step.setClassPackagingData(cpd);
- }
+ public long getRandomLong() {
+ return random.nextLong();
+ }
+ public String getRandomThreadNameFromPool() {
+ int index = random.nextInt(THREAD_POOL_SIZE);
+ return threadNamePool[index];
}
- LoggerContextVO getRandomlyNamedLoggerContextVO() {
- LoggerContext lc = new LoggerContext();
- lc.setName(getRandomJavaIdentifier());
- return new LoggerContextVO(lc);
+ public LogStatement getRandomLogStatementFromPool() {
+ int index = random.nextInt(logStatementPool.length);
+ return logStatementPool[index];
}
- long getRandomLong() {
- return random.nextLong();
+ private String getRandomLoggerNameFromPool(String[] loggerNamePool) {
+ int index = random.nextInt(loggerNamePool.length);
+ return loggerNamePool[index];
}
- String getRandomThreadName() {
- int index = random.nextInt(THREAD_POOL_SIZE);
- return threadNamePool[index];
+ public long getRandomTimeStamp() {
+ // subtract 1 so that 0 is allowed
+ lastTimeStamp += RandomUtil.gaussianAsPositiveInt(random,
+ AVERAGE_MILLIS_INCREMENT, STD_DEV_FOR_MILLIS_INCREMENT) - 1;
+ return lastTimeStamp;
+ }
+
+ LoggerContextVO getRandomlyNamedLoggerContextVO() {
+ LoggerContext lc = new LoggerContext();
+ lc.setName(getRandomJavaIdentifier());
+ return new LoggerContextVO(lc);
}
String getRandomWord() {
@@ -134,56 +138,54 @@
return worldList.get(randomIndex);
}
- int[] getRandomAnchorPositions(int wordCount, int numAnchors) {
- // note that the same position may appear multiple times in
- // positionsIndex, but without serious consequences
- int[] positionsIndex = new int[numAnchors];
- for (int i = 0; i < numAnchors; i++) {
- positionsIndex[i] = random.nextInt(wordCount);
+ public Object[] getRandomArgumentArray(int numOfArguments) {
+ if (numOfArguments == 0) {
+ return null;
}
- return positionsIndex;
- }
-
- private String[] getRandomWords(int n) {
- String[] wordArray = new String[n];
- for (int i = 0; i < n; i++) {
- wordArray[i] = getRandomWord();
+ Object[] argumentArray = new Object[numOfArguments];
+ for (int i = 0; i < numOfArguments; i++) {
+ argumentArray[i] = new Long(random.nextLong());
}
- return wordArray;
+ return argumentArray;
}
- MessageEntry getRandomMessageEntry() {
+ private MessageItem makeRandomMessageEntry() {
int numOfArguments = getNumberOfMessageArguments();
- Object[] argumentArray = null;
- if (numOfArguments > 0) {
- argumentArray = new Object[numOfArguments];
- for (int i = 0; i < numOfArguments; i++) {
- argumentArray[i] = new Long(random.nextLong());
- }
- }
+
int wordCount = RandomUtil.gaussianAsPositiveInt(random,
AVERAGE_MESSAGE_WORDS, STD_DEV_FOR_MESSAGE_WORDS);
String[] wordArray = getRandomWords(wordCount);
int[] anchorPositions = getRandomAnchorPositions(wordCount, numOfArguments);
+
for (int anchorIndex : anchorPositions) {
wordArray[anchorIndex] = "{}";
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < wordCount; i++) {
- sb.append(getRandomWord()).append(' ');
+ sb.append(wordArray[i]).append(' ');
}
sb.append(getRandomWord());
-
- return new MessageEntry(sb.toString(), argumentArray);
+ return new MessageItem(sb.toString(), numOfArguments);
}
- Throwable buildThrowable(double i) {
- return null;
+ private LogStatement makeRandomLogStatement(String[] loggerNamePool) {
+ MessageItem mi = makeRandomMessageEntry();
+ String loggerName = getRandomLoggerNameFromPool(loggerNamePool);
+ Level randomLevel = getRandomLevel();
+ Throwable t = getRandomThrowable(randomLevel);
+ ThrowableProxyVO throwableProxy = null;
+ if (t != null) {
+ throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t));
+ pupulateWithPackagingData(throwableProxy.getStackTraceElementProxyArray());
+ }
+ LogStatement logStatement = new LogStatement(loggerName, randomLevel, mi,
+ throwableProxy);
+ return logStatement;
}
- Throwable getRandomThrowable(Level level) {
+ private Throwable getRandomThrowable(Level level) {
double rn = random.nextDouble();
if ((level == Level.WARN && rn < THROWABLE_PROPABILITY_FOR_WARNING)
|| (level == Level.ERROR && rn < THROWABLE_PROPABILITY_FOR_ERRORS)) {
@@ -193,7 +195,21 @@
}
}
- int getNumberOfMessageArguments() {
+ private void pupulateWithPackagingData(StackTraceElementProxy[] stepArray) {
+ int i = 0;
+ for (StackTraceElementProxy step : stepArray) {
+ String identifier = "na";
+ String version = "na";
+ if (i++ % 2 == 0) {
+ identifier = getRandomJavaIdentifier();
+ version = getRandomJavaIdentifier();
+ }
+ ClassPackagingData cpd = new ClassPackagingData(identifier, version);
+ step.setClassPackagingData(cpd);
+ }
+ }
+
+ private int getNumberOfMessageArguments() {
double rn = random.nextDouble();
if (rn < ARGUMENT_DISTRIBUTION[0]) {
return 0;
@@ -213,7 +229,7 @@
return w;
}
- String getRandomLoggerName() {
+ private String makeRandomLoggerName() {
int parts = RandomUtil.gaussianAsPositiveInt(random,
AVERAGE_LOGGER_NAME_PARTS, STD_DEV_FOR_LOGGER_NAME_PARTS);
StringBuilder sb = new StringBuilder();
@@ -224,7 +240,7 @@
return sb.toString();
}
- Level getRandomLevel() {
+ private Level getRandomLevel() {
double rn = random.nextDouble();
if (rn < LEVEL_DISTRIBUTION[0]) {
return Level.TRACE;
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java Fri Mar 6 14:52:38 2009
@@ -0,0 +1,29 @@
+package ch.qos.logback.classic.corpus;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.IThrowableProxy;
+
+public class LogStatement {
+
+ final String loggerName;
+ final MessageItem messagerItem;
+ final Level level;
+ final IThrowableProxy throwableProxy;
+
+ public LogStatement(String loggerName, Level level, MessageItem messagerItem,
+ IThrowableProxy tp) {
+ this.loggerName = loggerName;
+ this.level = level;
+ this.messagerItem = messagerItem;
+ this.throwableProxy = tp;
+ }
+
+ public String getLoggerName() {
+ return loggerName;
+ }
+
+ public MessageItem getMessagerItem() {
+ return messagerItem;
+ }
+
+}
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java (from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java Fri Mar 6 14:52:38 2009
@@ -1,27 +1,18 @@
package ch.qos.logback.classic.corpus;
-public class MessageEntry {
+public class MessageItem {
final String message;
- final Object[] argumentArray;
+ final int numberOfArguments;
- public MessageEntry(String message) {
- this(message, null);
+ MessageItem(String message) {
+ this(message, 0);
}
-
- public MessageEntry(String message, Object[] argumentArray) {
+ public MessageItem(String message, int numberOfArguments) {
this.message = message;
- this.argumentArray = argumentArray;
- }
-
- public String getMessage() {
- return message;
+ this.numberOfArguments = numberOfArguments;
}
- public Object[] getArgumentArray() {
- return argumentArray;
- }
-
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java Fri Mar 6 14:52:38 2009
@@ -36,7 +36,7 @@
public Object[] argumentArray;
- public ThrowableProxyVO throwableProxy;
+ public IThrowableProxy throwableProxy;
public CallerData[] callerDataArray;
public Marker marker;
public Map<String, String> mdcPropertyMap;
1
0

svn commit: r2182 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic main/java/ch/qos/logback/classic/spi test/java/ch/qos/logback/classic/corpus test/java/ch/qos/logback/classic/corpusTest test/java/ch/qos/logback/classic/net/testObjectBuilders test/java/ch/qos/logback/classic/spi
by noreply.ceki@qos.ch 05 Mar '09
by noreply.ceki@qos.ch 05 Mar '09
05 Mar '09
Author: ceki
Date: Thu Mar 5 20:55:12 2009
New Revision: 2182
Added:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java
- copied, changed from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/TextFileUtilTest.java
- copied, changed from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java
Removed:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPointUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventExtBuilder.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.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/spi/CallerData.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/LoggingEvent.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java
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/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/corpus/TextFileUtil.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java
Log:
ongoing work on the corpus
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java Thu Mar 5 20:55:12 2009
@@ -12,17 +12,21 @@
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.
+ * 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;
+
+ /**
+ * The default stack data depth computed during caller data extraction.
+ */
+ public static final int DEFAULT_MAX_CALLEDER_DATA_DEPTH = 8;
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java Thu Mar 5 20:55:12 2009
@@ -62,6 +62,8 @@
private final TurboFilterList turboFilterList = new TurboFilterList();
private boolean packagingDataEnabled = true;
+ private int maxCallerDataDepth = ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH;
+
boolean started = false;
public LoggerContext() {
@@ -334,5 +336,13 @@
public String toString() {
return this.getClass().getName() + "[" + getName() + "]";
}
+
+ public int getMaxCallerDataDepth() {
+ return maxCallerDataDepth;
+ }
+
+ public void setMaxCallerDataDepth(int maxCallerDataDepth) {
+ this.maxCallerDataDepth = maxCallerDataDepth;
+ }
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java Thu Mar 5 20:55:12 2009
@@ -28,21 +28,20 @@
// All logger call's in log4j-over-slf4j use the Category class
private static final String LOG4J_CATEGORY = "org.apache.log4j.Category";
-
+
/**
* When caller information is not available this constant is used for the line
* number.
*/
public static final int LINE_NA = -1;
-
- public static String CALLER_DATA_NA = "?#?:?"+CoreConstants.LINE_SEPARATOR;
+ public static String CALLER_DATA_NA = "?#?:?" + CoreConstants.LINE_SEPARATOR;
/**
* This value is returned in case no caller data could be extracted.
*/
public static CallerData[] EMPTY_CALLER_DATA_ARRAY = new CallerData[0];
-
+
/**
* Caller's line number.
*/
@@ -64,7 +63,7 @@
String methodName;
boolean nativeMethod = false;
-
+
public CallerData(String fileName, String className, String methodName,
int lineNumber) {
this.fileName = fileName;
@@ -82,50 +81,59 @@
}
/**
- * Extract caller data information as an array based on a Throwable passed as parameter
+ * Extract caller data information as an array based on a Throwable passed as
+ * parameter
*/
- public static CallerData[] extract(Throwable t, String fqnOfInvokingClass) {
+ public static CallerData[] extract(Throwable t, String fqnOfInvokingClass,
+ final int maxDepth) {
if (t == null) {
return null;
}
StackTraceElement[] steArray = t.getStackTrace();
CallerData[] callerDataArray;
-
+
int found = LINE_NA;
for (int i = 0; i < steArray.length; i++) {
- if(isDirectlyInvokingClass(steArray[i].getClassName(), fqnOfInvokingClass)) {
+ if (isDirectlyInvokingClass(steArray[i].getClassName(),
+ fqnOfInvokingClass)) {
// the caller is assumed to be the next stack frame, hence the +1.
found = i + 1;
} else {
- if(found != LINE_NA) {
+ if (found != LINE_NA) {
break;
}
}
}
// we failed to extract caller data
- if(found == LINE_NA) {
+ if (found == LINE_NA) {
return EMPTY_CALLER_DATA_ARRAY;
}
-
- callerDataArray = new CallerData[steArray.length - found];
- for (int i = found; i < steArray.length; i++) {
- callerDataArray[i-found] = new CallerData(steArray[i]);
+
+ int availableDepth = steArray.length - found;
+ int desiredDepth = maxDepth < (availableDepth) ? maxDepth : availableDepth;
+
+ callerDataArray = new CallerData[desiredDepth];
+ for (int i = 0; i < desiredDepth; i++) {
+ callerDataArray[i] = new CallerData(steArray[found+i]);
}
return callerDataArray;
}
-
- public static boolean isDirectlyInvokingClass(String currentClass, String fqnOfInvokingClass) {
- // the check for org.apachje.log4j.Category class is intended to support log4j-over-slf4j
+
+ public static boolean isDirectlyInvokingClass(String currentClass,
+ String fqnOfInvokingClass) {
+ // the check for org.apachje.log4j.Category class is intended to support
+ // log4j-over-slf4j
// it solves http://bugzilla.slf4j.org/show_bug.cgi?id=66
- if(currentClass.equals(fqnOfInvokingClass) || currentClass.equals(LOG4J_CATEGORY)) {
+ if (currentClass.equals(fqnOfInvokingClass)
+ || currentClass.equals(LOG4J_CATEGORY)) {
return true;
} else {
return false;
}
}
-
+
public boolean equals(Object o) {
// LogLog.info("equals called");
if (this == o) {
@@ -173,8 +181,7 @@
/**
* Return the file name of the caller.
*
- * <p>
- * This information is not always available.
+ * <p> This information is not always available.
*/
public String getFileName() {
return fileName;
@@ -183,8 +190,7 @@
/**
* Returns the line number of the caller.
*
- * <p>
- * This information is not always available.
+ * <p> This information is not always available.
*/
public int getLineNumber() {
return lineNumber;
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 Thu Mar 5 20:55:12 2009
@@ -10,23 +10,54 @@
* The core interface in logback-classic.
*
* @author Ceki Gülcü
+ * @since 0.9.16
*/
public interface ILoggingEvent {
public String getThreadName();
+
public Level getLevel();
+
public String getMessage();
+
public Object[] getArgumentArray();
+
public String getFormattedMessage();
public String getLoggerName();
+
public LoggerContextVO getLoggerContextVO();
public IThrowableProxy getThrowableProxy();
+
+ /**
+ * Return {@link CallerData} associated with this event. Note that calling
+ * this event may trigger the computation of caller data.
+ *
+ * @return the CallerData associated with this event.
+ *
+ * @see #hasCallerData()
+ */
public CallerData[] getCallerData();
+
+ /**
+ * If this event has caller data, then true is returned. Otherwise the
+ * returned value is null.
+ *
+ * <p>Logback components wishing to use caller data if available without
+ * causing it to be computed can invoke this method before invoking
+ * {@link #getCallerData()}.
+ *
+ * @return whether this event has caller data
+ */
+ public boolean hasCallerData();
+
public Marker getMarker();
+
public Map<String, String> getMDCPropertyMap();
+
public long getTimeStamp();
+
public void prepareForDeferredProcessing();
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java Thu Mar 5 20:55:12 2009
@@ -51,10 +51,9 @@
*/
private String threadName;
-
private String loggerName;
- private LoggerContextVO loggerContextRemoteView;
-
+ private LoggerContext loggerContext;
+ private LoggerContextVO loggerContextVO;
/**
* Level of logging event.
@@ -87,7 +86,7 @@
* created.
*/
private long timeStamp;
-
+
public LoggingEvent() {
}
@@ -95,15 +94,16 @@
Throwable throwable, Object[] argArray) {
this.fqnOfLoggerClass = fqcn;
this.loggerName = logger.getName();
- this.loggerContextRemoteView = logger.getLoggerRemoteView().getLoggerContextView();
+ this.loggerContext = logger.getLoggerContext();
+ this.loggerContextVO = loggerContext.getLoggerContextRemoteView();
this.level = level;
-
+
this.message = message;
if (throwable != null) {
this.throwableProxy = new ThrowableProxy(throwable);
LoggerContext lc = logger.getLoggerContext();
- if(lc.isPackagingDataEnabled()) {
+ if (lc.isPackagingDataEnabled()) {
this.throwableProxy.calculatePackagingData();
}
}
@@ -118,7 +118,7 @@
.getMDCAdapter();
mdcPropertyMap = logbackMDCAdapter.getPropertyMap();
}
-
+
public void setArgumentArray(Object[] argArray) {
if (this.argumentArray != null) {
throw new IllegalStateException("argArray has been already set");
@@ -137,11 +137,11 @@
public String getLoggerName() {
return loggerName;
}
-
+
public void setLoggerName(String loggerName) {
this.loggerName = loggerName;
}
-
+
public String getThreadName() {
if (threadName == null) {
threadName = (Thread.currentThread()).getName();
@@ -198,11 +198,11 @@
}
public LoggerContextVO getLoggerContextVO() {
- return loggerContextRemoteView;
+ return loggerContextVO;
}
- public void setLoggerContextRemoteView(LoggerContextVO loggerContextRemoteView) {
- this.loggerContextRemoteView = loggerContextRemoteView;
+ public void setLoggerContextRemoteView(LoggerContextVO loggerContextVO) {
+ this.loggerContextVO = loggerContextVO;
}
public String getMessage() {
@@ -242,15 +242,17 @@
* caller information. </p>
*/
public CallerData[] getCallerData() {
- // we rely on the fact that fqnOfLoggerClass does not survive
- // serialization
- if (callerDataArray == null && fqnOfLoggerClass != null) {
- callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass);
+ if (callerDataArray == null) {
+ callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass, loggerContext.getMaxCallerDataDepth());
}
return callerDataArray;
}
- public void setCallerInformation(CallerData[] callerDataArray) {
+ public boolean hasCallerData() {
+ return (callerDataArray != null);
+ }
+
+ public void setCallerData(CallerData[] callerDataArray) {
this.callerDataArray = callerDataArray;
}
@@ -267,10 +269,9 @@
}
public long getContextBirthTime() {
- return loggerContextRemoteView.getBirthTime();
+ return loggerContextVO.getBirthTime();
}
-
// computer formatted lazy as suggested in
// http://jira.qos.ch/browse/LBCLASSIC-47
public String getFormattedMessage() {
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java Thu Mar 5 20:55:12 2009
@@ -13,6 +13,12 @@
// http://www.riehle.org/computer-science/research/1998/ubilab-tr-1998-10-1.ht…
+/**
+ * A read-only and serializable implementation of {@link ILoggingEvent}.
+ *
+ * @author Ceki Gülcü
+ * @since 0.9.16
+ */
public class LoggingEventVO implements ILoggingEvent, Serializable {
private static final long serialVersionUID = 6553722650255690312L;
@@ -23,7 +29,7 @@
private String threadName;
private String loggerName;
private LoggerContextVO loggerContextVO;
-
+
private transient Level level;
private String message;
@@ -39,7 +45,6 @@
private Marker marker;
private Map<String, String> mdcPropertyMap;
private long timeStamp;
-
public static LoggingEventVO build(ILoggingEvent le) {
LoggingEventVO ledo = new LoggingEventVO();
@@ -51,7 +56,7 @@
ledo.argumentArray = (le.getArgumentArray());
ledo.marker = le.getMarker();
ledo.mdcPropertyMap = le.getMDCPropertyMap();
- ledo.setTimeStamp(le.getTimeStamp());
+ ledo.timeStamp = le.getTimeStamp();
ledo.throwableProxy = ThrowableProxyVO.build(le.getThrowableProxy());
return ledo;
}
@@ -63,11 +68,11 @@
public LoggerContextVO getLoggerContextVO() {
return loggerContextVO;
}
-
+
public String getLoggerName() {
return loggerName;
}
-
+
public Level getLevel() {
return level;
}
@@ -102,6 +107,10 @@
return callerDataArray;
}
+ public boolean hasCallerData() {
+ return callerDataArray != null;
+ }
+
public Marker getMarker() {
return marker;
}
@@ -110,10 +119,6 @@
return timeStamp;
}
- public void setTimeStamp(long timeStamp) {
- this.timeStamp = timeStamp;
- }
-
public long getContextBirthTime() {
@@ -200,7 +205,6 @@
} else if (!loggerName.equals(other.loggerName))
return false;
-
if (threadName == null) {
if (other.threadName != null)
return false;
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java Thu Mar 5 20:55:12 2009
@@ -31,7 +31,10 @@
return ste;
}
- void setClassPackagingData(ClassPackagingData cpd) {
+ public void setClassPackagingData(ClassPackagingData cpd) {
+ if(this.cpd != null) {
+ throw new IllegalStateException("Packaging data has been already set");
+ }
this.cpd = cpd;
}
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 Thu Mar 5 20:55:12 2009
@@ -104,24 +104,11 @@
for (StackTraceElementProxy step : stackTraceElementProxyArray) {
String string = step.toString();
builder.append(string);
- extraData(builder, step);
+ ThrowableProxyUtil.appendPackagingData(builder, step);
builder.append(CoreConstants.LINE_SEPARATOR);
}
System.out.println(builder.toString());
}
- protected void extraData(StringBuilder builder, StackTraceElementProxy step) {
- if (step != null) {
- ClassPackagingData cpd = step.getClassPackagingData();
- if (cpd != null) {
- if (!cpd.isExact()) {
- builder.append(" ~[");
- } else {
- builder.append(" [");
- }
- builder.append(cpd.getCodeLocation()).append(':').append(
- cpd.getVersion()).append(']');
- }
- }
- }
+
}
Modified: 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/ThrowableProxyUtil.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java Thu Mar 5 20:55:12 2009
@@ -20,8 +20,6 @@
*/
public class ThrowableProxyUtil {
- //static final ThrowableDataPoint[] TEMPLATE_ARRAY = new ThrowableDataPoint[0];
-
static public void build(ThrowableProxy nestedTP, Throwable nestedThrowable,
ThrowableProxy parentTP) {
@@ -68,25 +66,42 @@
return count;
}
- static String asString(IThrowableProxy tp) {
+ static public String asString(IThrowableProxy tp) {
StringBuilder sb = new StringBuilder();
while (tp != null) {
-
printFirstLine(sb, tp);
printSTEPArray(sb, tp);
tp = tp.getCause();
}
return sb.toString();
-
}
+ static void appendPackagingData(StringBuilder builder, StackTraceElementProxy step) {
+ if (step != null) {
+ ClassPackagingData cpd = step.getClassPackagingData();
+ if (cpd != null) {
+ if (!cpd.isExact()) {
+ builder.append(" ~[");
+ } else {
+ builder.append(" [");
+ }
+
+ builder.append(cpd.getCodeLocation()).append(':').append(
+ cpd.getVersion()).append(']');
+ }
+ }
+ }
+
static public void printSTEPArray(StringBuilder sb, IThrowableProxy tp) {
StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
int commonFrames = tp.getCommonFrames();
+
for (int i = 0; i < stepArray.length - commonFrames; i++) {
StackTraceElementProxy step = stepArray[i];
- sb.append(step.toString()).append(CoreConstants.LINE_SEPARATOR);
+ sb.append(step.toString());
+ appendPackagingData(sb, step);
+ sb.append(CoreConstants.LINE_SEPARATOR);
}
if (commonFrames > 0) {
@@ -96,12 +111,12 @@
}
- static public void printFirstLine(StringBuilder sb, IThrowableProxy tp) {
+ static public void printFirstLine(StringBuilder buf, IThrowableProxy tp) {
int commonFrames = tp.getCommonFrames();
if (commonFrames > 0) {
- sb.append(CoreConstants.CAUSED_BY);
+ buf.append(CoreConstants.CAUSED_BY);
}
- sb.append(tp.getClassName()).append(": ").append(tp.getMessage());
- sb.append(CoreConstants.LINE_SEPARATOR);
+ buf.append(tp.getClassName()).append(": ").append(tp.getMessage());
+ buf.append(CoreConstants.LINE_SEPARATOR);
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java Thu Mar 5 20:55:12 2009
@@ -94,7 +94,4 @@
}
return tpvo;
}
-
-
-
}
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java (from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java Thu Mar 5 20:55:12 2009
@@ -9,13 +9,24 @@
*/
package ch.qos.logback.classic.corpus;
+import java.io.IOException;
import java.util.List;
import java.util.Random;
import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ClassPackagingData;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.LoggerContextVO;
+import ch.qos.logback.classic.spi.PubLoggingEventVO;
+import ch.qos.logback.classic.spi.StackTraceElementProxy;
+import ch.qos.logback.classic.spi.ThrowableProxy;
+import ch.qos.logback.classic.spi.ThrowableProxyVO;
-public class CorpusMakerUtil {
+public class CorpusMaker {
+ static final int STANDARD_CORPUS_SIZE = 100*1000;
+
// level distribution is determined by the following table
// it corresponds to TRACE 20%, DEBUG 30%, INFO 30%, WARN 10%,
// ERROR 10%. See also getRandomLevel() method.
@@ -35,15 +46,88 @@
static final int AVERAGE_MESSAGE_WORDS = 8;
static final int STD_DEV_FOR_MESSAGE_WORDS = 4;
+ static final int THREAD_POOL_SIZE = 10;
+
final Random random;
List<String> worldList;
+ String[] threadNamePool;
- CorpusMakerUtil(long seed, List<String> worldList) {
+ public CorpusMaker(long seed, List<String> worldList) {
random = new Random(seed);
this.worldList = worldList;
+ buildThreadNamePool();
+ }
+
+ void buildThreadNamePool() {
+ threadNamePool = new String[THREAD_POOL_SIZE];
+ for (int i = 0; i < THREAD_POOL_SIZE; i++) {
+ threadNamePool[i] = "CorpusMakerThread-" + i;
+ }
+ }
+
+ static public ILoggingEvent[] makeStandardCorpus() throws IOException {
+ List<String> worldList = TextFileUtil
+ .toWords("src/test/input/corpus/origin_of_species.txt");
+ CorpusMaker corpusMaker = new CorpusMaker(10, worldList);
+ return corpusMaker.make(STANDARD_CORPUS_SIZE);
+ }
+
+ public ILoggingEvent[] make(int n) {
+
+ LoggerContextVO lcVO = getRandomlyNamedLoggerContextVO();
+
+ PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n];
+ for (int i = 0; i < n; i++) {
+ PubLoggingEventVO e = new PubLoggingEventVO();
+ plevoArray[i] = e;
+ e.timeStamp = getRandomLong();
+ e.loggerName = getRandomLoggerName();
+ e.level = getRandomLevel();
+ MessageEntry me = getRandomMessageEntry();
+ e.message = me.message;
+ e.argumentArray = me.argumentArray;
+ e.loggerContextVO = lcVO;
+ Throwable t = getRandomThrowable(e.level);
+ if (t != null) {
+ e.throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t));
+ pupulateWithPackagingData(e.throwableProxy
+ .getStackTraceElementProxyArray());
+ }
+ e.threadName = getRandomThreadName();
+ }
+ return plevoArray;
+ }
+
+ void pupulateWithPackagingData(StackTraceElementProxy[] stepArray) {
+ int i = 0;
+ for (StackTraceElementProxy step : stepArray) {
+ String identifier = "na";
+ String version = "na";
+ if (i++ % 2 == 0) {
+ identifier = getRandomJavaIdentifier();
+ version = getRandomJavaIdentifier();
+ }
+ ClassPackagingData cpd = new ClassPackagingData(identifier, version);
+ step.setClassPackagingData(cpd);
+ }
}
+ LoggerContextVO getRandomlyNamedLoggerContextVO() {
+ LoggerContext lc = new LoggerContext();
+ lc.setName(getRandomJavaIdentifier());
+ return new LoggerContextVO(lc);
+ }
+
+ long getRandomLong() {
+ return random.nextLong();
+ }
+
+ String getRandomThreadName() {
+ int index = random.nextInt(THREAD_POOL_SIZE);
+ return threadNamePool[index];
+ }
+
String getRandomWord() {
int size = worldList.size();
int randomIndex = random.nextInt(size);
@@ -123,14 +207,20 @@
return 3;
}
+ String getRandomJavaIdentifier() {
+ String w = getRandomWord();
+ w = w.replaceAll("\\p{Punct}", "");
+ return w;
+ }
+
String getRandomLoggerName() {
int parts = RandomUtil.gaussianAsPositiveInt(random,
AVERAGE_LOGGER_NAME_PARTS, STD_DEV_FOR_LOGGER_NAME_PARTS);
StringBuilder sb = new StringBuilder();
for (int i = 1; i < parts; i++) {
- sb.append(getRandomWord()).append('.');
+ sb.append(getRandomJavaIdentifier()).append('.');
}
- sb.append(getRandomWord());
+ sb.append(getRandomJavaIdentifier());
return sb.toString();
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java Thu Mar 5 20:55:12 2009
@@ -1,17 +1,21 @@
package ch.qos.logback.classic.corpus;
import java.io.BufferedReader;
+import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TextFileUtil {
- //FileReader fr = new FileReader(filename);
- //BufferedReader br = new BufferedReader(fr);
+
+ public static List<String> toWords(String filename) throws IOException {
+ FileReader fr = new FileReader(filename);
+ BufferedReader br = new BufferedReader(fr);
+ return toWords(br);
+ }
public static List<String> toWords(BufferedReader br) throws IOException {
-
// (\\d+)$
//String regExp = "^(\\d+) "+ msg + " ([\\dabcdef-]+)$";
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/TextFileUtilTest.java (from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/TextFileUtilTest.java Thu Mar 5 20:55:12 2009
@@ -11,7 +11,7 @@
import ch.qos.logback.classic.corpus.TextFileUtil;
-public class FileToWord {
+public class TextFileUtilTest {
@Test
public void smoke() throws IOException {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java Thu Mar 5 20:55:12 2009
@@ -14,7 +14,7 @@
Throwable t = new Throwable();
StackTraceElement[] steArray = t.getStackTrace();
- CallerData[] cda = CallerData.extract(t, CallerDataTest.class.getName());
+ CallerData[] cda = CallerData.extract(t, CallerDataTest.class.getName(), 50);
assertNotNull(cda);
assertTrue(cda.length > 0);
assertEquals(steArray.length - 1, cda.length);
@@ -27,7 +27,7 @@
*/
@Test
public void testDeferredProcessing() {
- CallerData[] cda = CallerData.extract(new Throwable(), "com.inexistent.foo");
+ CallerData[] cda = CallerData.extract(new Throwable(), "com.inexistent.foo", 10);
assertNotNull(cda);
assertEquals(0, cda.length);
}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java Thu Mar 5 20:55:12 2009
@@ -0,0 +1,227 @@
+package ch.qos.logback.classic.spi;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Map;
+
+import org.slf4j.Marker;
+import org.slf4j.helpers.MessageFormatter;
+
+import ch.qos.logback.classic.Level;
+
+/**
+ * A read/write and serializable implementation of {@link ILoggingEvent}.
+ *
+ * @author Ceki Gülcü
+
+ */
+public class PubLoggingEventVO implements ILoggingEvent, Serializable {
+
+
+ private static final long serialVersionUID = -3385765861078946218L;
+
+ private static final int NULL_ARGUMENT_ARRAY = -1;
+ private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT";
+
+ public String threadName;
+ public String loggerName;
+ public LoggerContextVO loggerContextVO;
+
+ public transient Level level;
+ public String message;
+
+ private transient String formattedMessage;
+
+ public Object[] argumentArray;
+
+ public ThrowableProxyVO throwableProxy;
+ public CallerData[] callerDataArray;
+ public Marker marker;
+ public Map<String, String> mdcPropertyMap;
+ public long timeStamp;
+
+
+
+ public String getThreadName() {
+ return threadName;
+ }
+
+ public LoggerContextVO getLoggerContextVO() {
+ return loggerContextVO;
+ }
+
+ public String getLoggerName() {
+ return loggerName;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getFormattedMessage() {
+ if (formattedMessage != null) {
+ return formattedMessage;
+ }
+
+ if (argumentArray != null) {
+ formattedMessage = MessageFormatter.arrayFormat(message, argumentArray);
+ } else {
+ formattedMessage = message;
+ }
+
+ return formattedMessage;
+ }
+
+ public Object[] getArgumentArray() {
+ return argumentArray;
+ }
+
+ public IThrowableProxy getThrowableProxy() {
+ return throwableProxy;
+ }
+
+ public CallerData[] getCallerData() {
+ return callerDataArray;
+ }
+
+ public boolean hasCallerData() {
+ return callerDataArray != null;
+ }
+
+ public Marker getMarker() {
+ return marker;
+ }
+
+ public long getTimeStamp() {
+ return 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);
+ if (argumentArray != null) {
+ int len = argumentArray.length;
+ out.writeInt(len);
+ for (int i = 0; i < argumentArray.length; i++) {
+ if (argumentArray[i] != null) {
+ out.writeObject(argumentArray[i].toString());
+ } else {
+ out.writeObject(NULL_ARGUMENT_ARRAY_ELEMENT);
+ }
+ }
+ } else {
+ out.writeInt(NULL_ARGUMENT_ARRAY);
+ }
+
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException,
+ ClassNotFoundException {
+ in.defaultReadObject();
+ int levelInt = in.readInt();
+ level = Level.toLevel(levelInt);
+
+ int argArrayLen = in.readInt();
+ if (argArrayLen != NULL_ARGUMENT_ARRAY) {
+ argumentArray = new String[argArrayLen];
+ for (int i = 0; i < argArrayLen; i++) {
+ Object val = in.readObject();
+ if (!NULL_ARGUMENT_ARRAY_ELEMENT.equals(val)) {
+ argumentArray[i] = val;
+ }
+ }
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((message == null) ? 0 : message.hashCode());
+ result = prime * result
+ + ((threadName == null) ? 0 : threadName.hashCode());
+ result = prime * result + (int) (timeStamp ^ (timeStamp >>> 32));
+ 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 PubLoggingEventVO other = (PubLoggingEventVO) 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;
+ } else if (!threadName.equals(other.threadName))
+ 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;
+ } else if (!mdcPropertyMap.equals(other.mdcPropertyMap))
+ return false;
+ return true;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(timeStamp);
+ sb.append(" ");
+ sb.append(level);
+ sb.append(" [");
+ sb.append(threadName);
+ sb.append("] ");
+ sb.append(loggerName);
+ sb.append(" - ");
+ sb.append(getFormattedMessage());
+ return sb.toString();
+ }
+
+}
1
0