logback-dev
Threads by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 9940 discussions
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, encoder, updated. v0.9.18-30-ge4da8a8
by git-noreply@pixie.qos.ch 18 Feb '10
by git-noreply@pixie.qos.ch 18 Feb '10
18 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, encoder has been updated
via e4da8a824934b61ea4d8c885d8f65a8ec3b1e85e (commit)
from e5b5e16ad145327257be746e23153ac14e7bccad (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=e4da8a824934b61ea4d8c885…
http://github.com/ceki/logback/commit/e4da8a824934b61ea4d8c885d8f65a8ec3b1e…
commit e4da8a824934b61ea4d8c885d8f65a8ec3b1e85e
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Feb 18 20:19:33 2010 +0100
- all logback-core tests pass. Ongoing work.
diff --git a/logback-access/src/main/java/ch/qos/logback/access/PatternEncoder.java b/logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java
similarity index 62%
rename from logback-access/src/main/java/ch/qos/logback/access/PatternEncoder.java
rename to logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java
index f27a561..7fbdc30 100644
--- a/logback-access/src/main/java/ch/qos/logback/access/PatternEncoder.java
+++ b/logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java
@@ -1,10 +1,10 @@
package ch.qos.logback.access;
import ch.qos.logback.access.spi.AccessEvent;
-import ch.qos.logback.core.pattern.PatternEncoderBase;
+import ch.qos.logback.core.pattern.PatternLayoutEncoderBase;
-public class PatternEncoder extends PatternEncoderBase<AccessEvent> {
+public class PatternLayoutEncoder extends PatternLayoutEncoderBase<AccessEvent> {
public void start() {
layout = new PatternLayout();
diff --git a/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java b/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java
index e667fad..87fb172 100644
--- a/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java
+++ b/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java
@@ -26,7 +26,7 @@ import org.mortbay.jetty.Request;
import org.mortbay.jetty.handler.AbstractHandler;
import org.mortbay.util.ByteArrayISO8859Writer;
-import ch.qos.logback.access.PatternEncoder;
+import ch.qos.logback.access.PatternLayoutEncoder;
import ch.qos.logback.access.spi.AccessEvent;
import ch.qos.logback.access.testUtil.NotifyingListAppender;
import ch.qos.logback.core.ConsoleAppender;
@@ -59,7 +59,7 @@ public class JettyFixture extends JettyFixtureBase {
ConsoleAppender<AccessEvent> console = new ConsoleAppender<AccessEvent>();
console.setContext(requestLogImpl);
console.setName("console");
- PatternEncoder layout = new PatternEncoder();
+ PatternLayoutEncoder layout = new PatternLayoutEncoder();
layout.setContext(requestLogImpl);
layout.setPattern("%date %server %clientHost");
console.setEncoder(layout);
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java b/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java
index 5bb119f..b6e0eca 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java
@@ -15,7 +15,7 @@ package ch.qos.logback.classic;
import org.slf4j.LoggerFactory;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.status.InfoStatus;
@@ -44,7 +44,7 @@ public class BasicConfigurator {
ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
ca.setContext(lc);
ca.setName("console");
- PatternEncoder pl = new PatternEncoder();
+ PatternLayoutEncoder pl = new PatternLayoutEncoder();
pl.setContext(lc);
pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
pl.start();
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternEncoder.java b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java
similarity index 66%
rename from logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternEncoder.java
rename to logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java
index aea9f4a..c456e52 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternEncoder.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java
@@ -2,9 +2,9 @@ package ch.qos.logback.classic.encoder;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.pattern.PatternEncoderBase;
+import ch.qos.logback.core.pattern.PatternLayoutEncoderBase;
-public class PatternEncoder extends PatternEncoderBase<ILoggingEvent> {
+public class PatternLayoutEncoder extends PatternLayoutEncoderBase<ILoggingEvent> {
public void start() {
layout = new PatternLayout();
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java
index fa2c7eb..927557e 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java
@@ -15,7 +15,7 @@ package ch.qos.logback.classic.issue.lbclassic135;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.contention.ThreadedThroughputCalculator;
@@ -51,7 +51,7 @@ public class LoggingToFileThrouhput {
static Logger buildLoggerContext(LoggerContext lc) {
Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
- PatternEncoder patternLayout = new PatternEncoder();
+ PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
patternLayout.setContext(lc);
patternLayout.setPattern("%d %l [%t] - %msg%n");
patternLayout.start();
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java
index 159d904..009490c 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java
@@ -16,7 +16,7 @@ package ch.qos.logback.classic.multiJVM;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.testUtil.RandomUtil;
@@ -33,7 +33,7 @@ public class FileAppenderPerf {
FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
- PatternEncoder patternLayout = new PatternEncoder();
+ PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
patternLayout.setPattern("%5p %c - %m%n");
patternLayout.setContext(loggerContext);
patternLayout.start();
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java
index b33a635..afa7153 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java
@@ -16,7 +16,7 @@ package ch.qos.logback.classic.multiJVM;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
@@ -58,7 +58,7 @@ public class SafeModeFileAppender {
FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
- PatternEncoder patternLayout = new PatternEncoder();
+ PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
patternLayout.setPattern(stamp + " %5p - %m%n");
patternLayout.setContext(loggerContext);
patternLayout.start();
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java
index 367e1f2..112f7d0 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java
@@ -16,7 +16,7 @@ package ch.qos.logback.classic.multiJVM;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
@@ -61,7 +61,7 @@ public class SafeModeRollingFileAppender {
LoggerContext loggerContext = new LoggerContext();
RollingFileAppender<ILoggingEvent> rfa = new RollingFileAppender<ILoggingEvent>();
- PatternEncoder patternLayout = new PatternEncoder();
+ PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
patternLayout.setPattern(stamp + " %5p - %-50m%n");
patternLayout.setContext(loggerContext);
patternLayout.start();
diff --git a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
index 24d31fe..bd1098e 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
@@ -86,7 +86,7 @@ public class ConsoleAppender<E> extends WriterAppender<E> {
* implementation because the console stream is not ours to close.
*/
protected final void closeWriter() {
- writeFooter();
+ encoderClose();
}
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/Encoder.java b/logback-core/src/main/java/ch/qos/logback/core/Encoder.java
index 87a7350..28cb9fc 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/Encoder.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/Encoder.java
@@ -23,6 +23,7 @@ public interface Encoder<E> extends ContextAware, LifeCycle {
void doEncode(E event, OutputStream os) throws IOException;
+ void init(OutputStream os) throws IOException;
void close(OutputStream os) throws IOException;
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java b/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java
index c1f36e4..48b3090 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java
@@ -31,13 +31,13 @@ import ch.qos.logback.core.status.ErrorStatus;
public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
protected Encoder<E> encoder;
-
+
/**
* Immediate flush means that the underlying writer or output stream will be
* flushed at the end of each append operation. Immediate flush is slower but
* ensures that each append request is actually written. If
- * <code>immediateFlush</code> is set to <code>false</code>, then there
- * is a good chance that the last few logs events are not actually written to
+ * <code>immediateFlush</code> is set to <code>false</code>, then there is a
+ * good chance that the last few logs events are not actually written to
* persistent media if and when the application crashes.
*
* <p>
@@ -68,8 +68,8 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
/**
* If the <b>ImmediateFlush</b> option is set to <code>true</code>, the
* appender will flush at the end of each write. This is the default behavior.
- * If the option is set to <code>false</code>, then the underlying stream
- * can defer writing to physical medium to a later time.
+ * If the option is set to <code>false</code>, then the underlying stream can
+ * defer writing to physical medium to a later time.
* <p>
* Avoiding the flush operation at the end of each append results in a
* performance gain of 10 to 20 percent. However, there is safety tradeoff
@@ -96,14 +96,14 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
public void start() {
int errors = 0;
if (this.encoder == null) {
- addStatus(new ErrorStatus("No layout set for the appender named \""
+ addStatus(new ErrorStatus("No encoder set for the appender named \""
+ name + "\".", this));
errors++;
}
if (this.outputStream == null) {
- addStatus(new ErrorStatus("No output stream set for the appender named \""
- + name + "\".", this));
+ addStatus(new ErrorStatus(
+ "No output stream set for the appender named \"" + name + "\".", this));
errors++;
}
// only error free appenders should be activated
@@ -140,7 +140,7 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
if (this.outputStream != null) {
try {
// before closing we have to output out layout's footer
- writeFooter();
+ encoderClose();
this.outputStream.close();
this.outputStream = null;
} catch (IOException e) {
@@ -152,10 +152,9 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
/**
* Returns an OutputStreamWriter when passed an OutputStream. The encoding
- * used will depend on the value of the <code>encoding</code> property. If
- * the encoding value is specified incorrectly the writer will be opened using
- * the default system encoding (an error message will be printed to the
- * loglog.
+ * used will depend on the value of the <code>encoding</code> property. If the
+ * encoding value is specified incorrectly the writer will be opened using the
+ * default system encoding (an error message will be printed to the loglog.
*/
protected OutputStreamWriter createWriter(OutputStream os) {
OutputStreamWriter retval = null;
@@ -184,20 +183,21 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
encoding = value;
}
- void writeHeader() {
-
- }
-
- private void appendIfNotNull(StringBuilder sb, String s) {
- if (s != null) {
- sb.append(s);
+ void encoderInit() {
+ if (encoder != null && this.outputStream != null) {
+ try {
+ encoder.init(outputStream);
+ } catch (IOException ioe) {
+ this.started = false;
+ addStatus(new ErrorStatus("Failed to write footer for appender named ["
+ + name + "].", this, ioe));
+ }
}
}
- void writeFooter() {
+ void encoderClose() {
if (encoder != null && this.outputStream != null) {
try {
- StringBuilder sb = new StringBuilder();
encoder.close(outputStream);
} catch (IOException ioe) {
this.started = false;
@@ -210,8 +210,8 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
/**
* <p>
* Sets the Writer where the log output will go. The specified Writer must be
- * opened by the user and be writable. The <code>java.io.Writer</code> will
- * be closed when the appender instance is closed.
+ * opened by the user and be writable. The <code>java.io.Writer</code> will be
+ * closed when the appender instance is closed.
*
* @param writer
* An already opened Writer.
@@ -221,14 +221,22 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
closeWriter();
this.outputStream = outputStream;
- writeHeader();
+ if(encoder == null) {
+ addWarn("Encoder not yet set. Cannot invoke init method ");
+ return;
+ }
+
+ try {
+ encoder.init(outputStream);
+ } catch (IOException e) {
+ addError("Failied to initialize encoder", e);
+ }
}
-
- void writeOut(E event) throws IOException {
+ protected void writeOut(E event) throws IOException {
this.encoder.doEncode(event, outputStream);
}
-
+
/**
* Actual writing occurs here.
* <p>
@@ -242,7 +250,10 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
return;
}
try {
- writeOut(event);
+ // it is
+ synchronized (this) {
+ writeOut(event);
+ }
} catch (IOException ioe) {
// as soon as an exception occurs, move to non-started state
// and add a single ErrorStatus to the SM.
@@ -258,6 +269,5 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
public void setEncoder(Encoder<E> encoder) {
this.encoder = encoder;
}
-
-
+
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/html/LayoutWrappingEncoder.java b/logback-core/src/main/java/ch/qos/logback/core/html/LayoutWrappingEncoder.java
index 8f99398..11d938b 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/html/LayoutWrappingEncoder.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/html/LayoutWrappingEncoder.java
@@ -3,15 +3,17 @@ package ch.qos.logback.core.html;
import java.io.IOException;
import java.io.OutputStream;
+import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.Encoder;
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.spi.ContextAwareBase;
-public class LayoutWrappingEncoder<E> extends ContextAwareBase implements Encoder<E> {
+public class LayoutWrappingEncoder<E> extends ContextAwareBase implements
+ Encoder<E> {
boolean started;
protected Layout<E> layout;
-
+
public Layout<E> getLayout() {
return layout;
}
@@ -20,7 +22,48 @@ public class LayoutWrappingEncoder<E> extends ContextAwareBase implements Encode
this.layout = layout;
}
+
+ public void init(OutputStream os) throws IOException {
+ writeHeader(os);
+ }
+
public void close(OutputStream os) throws IOException {
+ writeFooter(os);
+ }
+
+ private void appendIfNotNull(StringBuilder sb, String s) {
+ if (s != null) {
+ sb.append(s);
+ }
+ }
+
+ void writeHeader(OutputStream os) throws IOException {
+ if (layout != null && (os != null)) {
+ StringBuilder sb = new StringBuilder();
+ appendIfNotNull(sb, layout.getFileHeader());
+ appendIfNotNull(sb, layout.getPresentationHeader());
+ if (sb.length() > 0) {
+ sb.append(CoreConstants.LINE_SEPARATOR);
+ // If at least one of file header or presentation header were not
+ // null, then append a line separator.
+ // This should be useful in most cases and should not hurt.
+ os.write(sb.toString().getBytes());
+ os.flush();
+ }
+ }
+ }
+
+ void writeFooter(OutputStream os) throws IOException {
+ if (layout != null && os != null) {
+ StringBuilder sb = new StringBuilder();
+ appendIfNotNull(sb, layout.getPresentationFooter());
+ appendIfNotNull(sb, layout.getFileFooter());
+ if (sb.length() > 0) {
+ os.write(sb.toString().getBytes());
+ os.flush();
+ }
+
+ }
}
public void doEncode(E event, OutputStream os) throws IOException {
@@ -38,7 +81,7 @@ public class LayoutWrappingEncoder<E> extends ContextAwareBase implements Encode
}
public void stop() {
+ started = false;
}
-
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternEncoderBase.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternEncoderBase.java
deleted file mode 100644
index a3bfc16..0000000
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternEncoderBase.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package ch.qos.logback.core.pattern;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import ch.qos.logback.core.Encoder;
-import ch.qos.logback.core.spi.ContextAwareBase;
-
-public class PatternEncoderBase<E> extends ContextAwareBase implements Encoder<E> {
-
- boolean started;
- protected PatternLayoutBase<E> layout;
- String pattern;
-
- public void close(OutputStream os) throws IOException {
- }
-
- public void doEncode(E event, OutputStream os) throws IOException {
- String txt = layout.doLayout(event);
- os.write(txt.getBytes());
- os.flush();
- }
-
- public boolean isStarted() {
- return false;
- }
-
- public void start() {
- started = true;
- }
-
- public void stop() {
- }
-
- public String getPattern() {
- return pattern;
- }
-
- public void setPattern(String pattern) {
- this.pattern = pattern;
- }
-
-
-
-}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutEncoderBase.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutEncoderBase.java
new file mode 100644
index 0000000..5c90ac1
--- /dev/null
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutEncoderBase.java
@@ -0,0 +1,25 @@
+package ch.qos.logback.core.pattern;
+
+import ch.qos.logback.core.Layout;
+import ch.qos.logback.core.html.LayoutWrappingEncoder;
+
+public class PatternLayoutEncoderBase<E> extends LayoutWrappingEncoder<E> {
+
+ protected PatternLayoutBase<E> layout;
+ String pattern;
+
+ public String getPattern() {
+ return pattern;
+ }
+
+ public void setPattern(String pattern) {
+ this.pattern = pattern;
+ }
+
+ @Override
+ public void setLayout(Layout<E> layout) {
+ throw new UnsupportedOperationException("one cannot set the layout of "
+ + this.getClass().getName());
+ }
+
+}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java
index b728166..44f2f51 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java
@@ -27,13 +27,13 @@ import ch.qos.logback.core.layout.DummyLayout;
public class DummyAppenderTest extends AbstractAppenderTest<Object> {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
+ DummyWriterAppender<Object> da = new DummyWriterAppender<Object>(baos);
+
protected Appender<Object> getAppender() {
- return new DummyAppender<Object>(baos);
+ return da;
}
protected Appender<Object> getConfiguredAppender() {
- DummyAppender<Object> da = new DummyAppender<Object>(baos);
da.setEncoder(new DummyEncoder<Object>());
da.start();
return da;
@@ -41,7 +41,6 @@ public class DummyAppenderTest extends AbstractAppenderTest<Object> {
@Test
public void testBasic() {
- DummyAppender<Object> da = new DummyAppender<Object>(baos);
da.setEncoder(new DummyEncoder<Object>());
da.start();
da.doAppend(new Object());
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java
similarity index 85%
rename from logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
rename to logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java
index d2f0c82..c54ff3d 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java
@@ -17,10 +17,9 @@ import java.io.OutputStream;
import ch.qos.logback.core.WriterAppender;
-public class DummyAppender<E> extends WriterAppender<E> {
+public class DummyWriterAppender<E> extends WriterAppender<E> {
- DummyAppender(OutputStream os) {
+ DummyWriterAppender(OutputStream os) {
this.setWriter(os);
}
-
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java
index 2e82951..998ed52 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java
@@ -42,15 +42,41 @@ public class DummyEncoder<E> extends EncoderBase<E> {
}
public void doEncode(E event, OutputStream os) throws IOException {
+ writeOut(os, val);
+ }
+
+ private void appendIfNotNull(StringBuilder sb, String s) {
+ if (s != null) {
+ sb.append(s);
+ }
+ }
+
+ void writeOut(OutputStream os, String s) throws IOException {
if (encodingName == null) {
- os.write(val.getBytes());
+ os.write(s.getBytes());
} else {
- os.write(val.getBytes(encodingName));
+ os.write(s.getBytes(encodingName));
}
}
+ void writeHeader(OutputStream os) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ appendIfNotNull(sb, fileHeader);
+ if (sb.length() > 0) {
+ sb.append(CoreConstants.LINE_SEPARATOR);
+ // If at least one of file header or presentation header were not
+ // null, then append a line separator.
+ // This should be useful in most cases and should not hurt.
+ writeOut(os, sb.toString());
+ }
+ }
+
+ public void init(OutputStream os) throws IOException {
+ writeHeader(os);
+ }
+
public void close(OutputStream os) throws IOException {
- if(fileFooter == null) {
+ if (fileFooter == null) {
return;
}
if (encodingName == null) {
diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/EchoEncoder.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/EchoEncoder.java
index 90c4b0c..5cc19f5 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/encoder/EchoEncoder.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/EchoEncoder.java
@@ -38,5 +38,10 @@ public class EchoEncoder<E> extends EncoderBase<E> {
os.write(fileFooter.getBytes());
}
-
+ public void init(OutputStream os) throws IOException {
+ if (fileHeader == null) {
+ return;
+ }
+ os.write(fileHeader.getBytes());
+ }
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java
index 8132f79..62afe4f 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java
@@ -22,6 +22,8 @@ public class NopEncoder<E> extends EncoderBase<E> {
}
public void doEncode(E event, OutputStream os) throws IOException {
-
+ }
+
+ public void init(OutputStream os) throws IOException {
}
}
diff --git a/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java b/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java
index 9ddfab6..e2b3d74 100644
--- a/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java
+++ b/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java
@@ -15,19 +15,19 @@ package chapter11;
import java.io.IOException;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class TrivialLogbackAppender extends AppenderBase<ILoggingEvent> {
- PatternEncoder encoder;
+ PatternLayoutEncoder encoder;
- public PatternEncoder getEncoder() {
+ public PatternLayoutEncoder getEncoder() {
return encoder;
}
- public void setEncoder(PatternEncoder encoder) {
+ public void setEncoder(PatternLayoutEncoder encoder) {
this.encoder = encoder;
}
diff --git a/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java b/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java
index 1df11e9..b4f0bec 100644
--- a/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java
+++ b/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java
@@ -15,7 +15,7 @@ package chapter4;
import java.io.IOException;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
@@ -25,7 +25,7 @@ public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
int counter = 0;
int limit = DEFAULT_LIMIT;
- PatternEncoder encoder;
+ PatternLayoutEncoder encoder;
public CountingConsoleAppender() {
}
@@ -62,11 +62,11 @@ public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
counter++;
}
- public PatternEncoder getEncoder() {
+ public PatternLayoutEncoder getEncoder() {
return encoder;
}
- public void setEncoder(PatternEncoder encoder) {
+ public void setEncoder(PatternLayoutEncoder encoder) {
this.encoder = encoder;
}
diff --git a/logback-examples/src/main/java/chapter4/IO.java b/logback-examples/src/main/java/chapter4/IO.java
index 015bbff..fb989ce 100644
--- a/logback-examples/src/main/java/chapter4/IO.java
+++ b/logback-examples/src/main/java/chapter4/IO.java
@@ -16,7 +16,7 @@ package chapter4;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.encoder.EchoEncoder;
@@ -47,7 +47,7 @@ public class IO extends Thread {
FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
if (longMessage) {
- PatternEncoder pa = new PatternEncoder();
+ PatternLayoutEncoder pa = new PatternLayoutEncoder();
pa.setPattern("%r %5p %c [%t] - %m%n");
pa.setContext(context);
pa.start();
diff --git a/logback-examples/src/main/java/chapter5/PatternSample.java b/logback-examples/src/main/java/chapter5/PatternSample.java
index 6c7ec82..07b1ede 100644
--- a/logback-examples/src/main/java/chapter5/PatternSample.java
+++ b/logback-examples/src/main/java/chapter5/PatternSample.java
@@ -16,7 +16,7 @@ package chapter5;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
@@ -25,7 +25,7 @@ public class PatternSample {
static public void main(String[] args) throws Exception {
Logger rootLogger = (Logger) LoggerFactory.getLogger("root");
- PatternEncoder layout = new PatternEncoder();
+ PatternLayoutEncoder layout = new PatternLayoutEncoder();
layout.setPattern("%-5level [%thread]: %message%n");
layout.start();
diff --git a/logback-examples/src/main/java/chapter7/SimpleMDC.java b/logback-examples/src/main/java/chapter7/SimpleMDC.java
index 304b7c3..228ae70 100644
--- a/logback-examples/src/main/java/chapter7/SimpleMDC.java
+++ b/logback-examples/src/main/java/chapter7/SimpleMDC.java
@@ -20,7 +20,7 @@ import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternEncoder;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
@@ -63,7 +63,7 @@ public class SimpleMDC {
LoggerContext loggerContext = (LoggerContext) LoggerFactory
.getILoggerFactory();
loggerContext.reset();
- PatternEncoder layout = new PatternEncoder();
+ PatternLayoutEncoder layout = new PatternLayoutEncoder();
layout.setContext(loggerContext);
layout.setPattern("%X{first} %X{last} - %m%n");
layout.start();
-----------------------------------------------------------------------
Summary of changes:
...tternEncoder.java => PatternLayoutEncoder.java} | 4 +-
.../ch/qos/logback/access/jetty/JettyFixture.java | 4 +-
.../ch/qos/logback/classic/BasicConfigurator.java | 4 +-
...tternEncoder.java => PatternLayoutEncoder.java} | 4 +-
.../issue/lbclassic135/LoggingToFileThrouhput.java | 4 +-
.../logback/classic/multiJVM/FileAppenderPerf.java | 4 +-
.../classic/multiJVM/SafeModeFileAppender.java | 4 +-
.../multiJVM/SafeModeRollingFileAppender.java | 4 +-
.../java/ch/qos/logback/core/ConsoleAppender.java | 2 +-
.../src/main/java/ch/qos/logback/core/Encoder.java | 1 +
.../java/ch/qos/logback/core/WriterAppender.java | 72 +++++++++++---------
.../logback/core/html/LayoutWrappingEncoder.java | 49 +++++++++++++-
.../logback/core/pattern/PatternEncoderBase.java | 45 ------------
.../core/pattern/PatternLayoutEncoderBase.java | 25 +++++++
.../logback/core/appender/DummyAppenderTest.java | 7 +-
...DummyAppender.java => DummyWriterAppender.java} | 5 +-
.../ch/qos/logback/core/encoder/DummyEncoder.java | 32 ++++++++-
.../ch/qos/logback/core/encoder/EchoEncoder.java | 7 ++-
.../ch/qos/logback/core/encoder/NopEncoder.java | 4 +-
.../java/chapter11/TrivialLogbackAppender.java | 8 +-
.../java/chapter4/CountingConsoleAppender.java | 8 +-
logback-examples/src/main/java/chapter4/IO.java | 4 +-
.../src/main/java/chapter5/PatternSample.java | 4 +-
.../src/main/java/chapter7/SimpleMDC.java | 4 +-
24 files changed, 187 insertions(+), 122 deletions(-)
rename logback-access/src/main/java/ch/qos/logback/access/{PatternEncoder.java => PatternLayoutEncoder.java} (62%)
rename logback-classic/src/main/java/ch/qos/logback/classic/encoder/{PatternEncoder.java => PatternLayoutEncoder.java} (66%)
delete mode 100644 logback-core/src/main/java/ch/qos/logback/core/pattern/PatternEncoderBase.java
create mode 100644 logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutEncoderBase.java
rename logback-core/src/test/java/ch/qos/logback/core/appender/{DummyAppender.java => DummyWriterAppender.java} (85%)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, encoder, created. v0.9.18-29-ge5b5e16
by git-noreply@pixie.qos.ch 18 Feb '10
by git-noreply@pixie.qos.ch 18 Feb '10
18 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, encoder has been created
at e5b5e16ad145327257be746e23153ac14e7bccad (commit)
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=e5b5e16ad145327257be746e…
http://github.com/ceki/logback/commit/e5b5e16ad145327257be746e23153ac14e7bc…
commit e5b5e16ad145327257be746e23153ac14e7bccad
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Feb 18 17:09:48 2010 +0100
WriteAppender and sub-classes now expect to work with an Encoder. The
code compiles but the test do NOT pass. To be considered as ongoing work.
diff --git a/logback-access/src/main/java/ch/qos/logback/access/PatternEncoder.java b/logback-access/src/main/java/ch/qos/logback/access/PatternEncoder.java
new file mode 100644
index 0000000..f27a561
--- /dev/null
+++ b/logback-access/src/main/java/ch/qos/logback/access/PatternEncoder.java
@@ -0,0 +1,16 @@
+package ch.qos.logback.access;
+
+import ch.qos.logback.access.spi.AccessEvent;
+import ch.qos.logback.core.pattern.PatternEncoderBase;
+
+
+public class PatternEncoder extends PatternEncoderBase<AccessEvent> {
+
+ public void start() {
+ layout = new PatternLayout();
+ layout.setContext(context);
+ layout.setPattern(getPattern());
+ layout.start();
+ }
+
+}
\ No newline at end of file
diff --git a/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java b/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java
index d6f10bd..e667fad 100644
--- a/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java
+++ b/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixture.java
@@ -26,7 +26,7 @@ import org.mortbay.jetty.Request;
import org.mortbay.jetty.handler.AbstractHandler;
import org.mortbay.util.ByteArrayISO8859Writer;
-import ch.qos.logback.access.PatternLayout;
+import ch.qos.logback.access.PatternEncoder;
import ch.qos.logback.access.spi.AccessEvent;
import ch.qos.logback.access.testUtil.NotifyingListAppender;
import ch.qos.logback.core.ConsoleAppender;
@@ -59,10 +59,10 @@ public class JettyFixture extends JettyFixtureBase {
ConsoleAppender<AccessEvent> console = new ConsoleAppender<AccessEvent>();
console.setContext(requestLogImpl);
console.setName("console");
- PatternLayout layout = new PatternLayout();
+ PatternEncoder layout = new PatternEncoder();
layout.setContext(requestLogImpl);
layout.setPattern("%date %server %clientHost");
- console.setLayout(layout);
+ console.setEncoder(layout);
layout.start();
console.start();
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java b/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java
index 6d7a9ce..5bb119f 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java
@@ -15,6 +15,7 @@ package ch.qos.logback.classic;
import org.slf4j.LoggerFactory;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.status.InfoStatus;
@@ -43,12 +44,12 @@ public class BasicConfigurator {
ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
ca.setContext(lc);
ca.setName("console");
- PatternLayout pl = new PatternLayout();
+ PatternEncoder pl = new PatternEncoder();
pl.setContext(lc);
pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
pl.start();
- ca.setLayout(pl);
+ ca.setEncoder(pl);
ca.start();
Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(ca);
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternEncoder.java b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternEncoder.java
new file mode 100644
index 0000000..aea9f4a
--- /dev/null
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternEncoder.java
@@ -0,0 +1,16 @@
+package ch.qos.logback.classic.encoder;
+
+import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.pattern.PatternEncoderBase;
+
+public class PatternEncoder extends PatternEncoderBase<ILoggingEvent> {
+
+ public void start() {
+ layout = new PatternLayout();
+ layout.setContext(context);
+ layout.setPattern(getPattern());
+ layout.start();
+ }
+
+}
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
index e7b9f6a..f1ee47c 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
@@ -30,10 +30,10 @@ import org.junit.Ignore;
import org.junit.Test;
import org.xml.sax.EntityResolver;
+import ch.qos.logback.classic.ClassicTestConstants;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.ClassicTestConstants;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.spi.DummyThrowableProxy;
import ch.qos.logback.classic.spi.ILoggingEvent;
@@ -43,7 +43,6 @@ import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.classic.util.TeztConstants;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.joran.spi.JoranException;
-import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.testUtil.StringListAppender;
import ch.qos.logback.core.util.StatusPrinter;
@@ -58,17 +57,14 @@ public class HTMLLayoutTest {
lc = new LoggerContext();
lc.setName("default");
- ListAppender<ILoggingEvent> appender = new ListAppender<ILoggingEvent>();
- appender.setContext(lc);
layout = new HTMLLayout();
layout.setThrowableRenderer(new DefaultThrowableRenderer());
layout.setContext(lc);
layout.setPattern("%level%thread%msg");
layout.start();
- appender.setLayout(layout);
+
root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
- root.addAppender(appender);
- appender.start();
+
}
@After
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java
index 4590a0d..fa2c7eb 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThrouhput.java
@@ -15,7 +15,7 @@ package ch.qos.logback.classic.issue.lbclassic135;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.contention.ThreadedThroughputCalculator;
@@ -51,14 +51,14 @@ public class LoggingToFileThrouhput {
static Logger buildLoggerContext(LoggerContext lc) {
Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
- PatternLayout patternLayout = new PatternLayout();
+ PatternEncoder patternLayout = new PatternEncoder();
patternLayout.setContext(lc);
patternLayout.setPattern("%d %l [%t] - %msg%n");
patternLayout.start();
FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
fileAppender.setContext(lc);
fileAppender.setFile("target/lbclassic135.log");
- fileAppender.setLayout(patternLayout);
+ fileAppender.setEncoder(patternLayout);
fileAppender.setAppend(false);
fileAppender.start();
root.addAppender(fileAppender);
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java
index c499534..159d904 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java
@@ -16,7 +16,7 @@ package ch.qos.logback.classic.multiJVM;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.testUtil.RandomUtil;
@@ -33,12 +33,12 @@ public class FileAppenderPerf {
FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
- PatternLayout patternLayout = new PatternLayout();
+ PatternEncoder patternLayout = new PatternEncoder();
patternLayout.setPattern("%5p %c - %m%n");
patternLayout.setContext(loggerContext);
patternLayout.start();
- fa.setLayout(patternLayout);
+ fa.setEncoder(patternLayout);
fa.setFile(filename);
fa.setAppend(false);
fa.setImmediateFlush(true);
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java
index 9a029c1..b33a635 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java
@@ -16,7 +16,7 @@ package ch.qos.logback.classic.multiJVM;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
@@ -58,12 +58,12 @@ public class SafeModeFileAppender {
FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
- PatternLayout patternLayout = new PatternLayout();
+ PatternEncoder patternLayout = new PatternEncoder();
patternLayout.setPattern(stamp + " %5p - %m%n");
patternLayout.setContext(loggerContext);
patternLayout.start();
- fa.setLayout(patternLayout);
+ fa.setEncoder(patternLayout);
fa.setFile(filename);
fa.setAppend(true);
fa.setImmediateFlush(true);
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java
index 0878bbf..367e1f2 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java
@@ -16,7 +16,7 @@ package ch.qos.logback.classic.multiJVM;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
@@ -61,12 +61,12 @@ public class SafeModeRollingFileAppender {
LoggerContext loggerContext = new LoggerContext();
RollingFileAppender<ILoggingEvent> rfa = new RollingFileAppender<ILoggingEvent>();
- PatternLayout patternLayout = new PatternLayout();
+ PatternEncoder patternLayout = new PatternEncoder();
patternLayout.setPattern(stamp + " %5p - %-50m%n");
patternLayout.setContext(loggerContext);
patternLayout.start();
- rfa.setLayout(patternLayout);
+ rfa.setEncoder(patternLayout);
rfa.setAppend(true);
rfa.setImmediateFlush(true);
diff --git a/logback-core/src/main/java/ch/qos/logback/core/Appender.java b/logback-core/src/main/java/ch/qos/logback/core/Appender.java
index 856e387..e951877 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/Appender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/Appender.java
@@ -33,16 +33,6 @@ public interface Appender<E> extends LifeCycle, ContextAware, FilterAttachable<E
void doAppend(E event) throws LogbackException;
/**
- * Set the {@link Layout} for this appender.
- */
- public void setLayout(Layout<E> layout);
-
- /**
- * Returns this appenders layout.
- */
- public Layout<E> getLayout();
-
- /**
* Set the name of this appender. The name is used by other components to
* identify this appender.
*
diff --git a/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java
index 4183767..b6939bf 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java
@@ -32,12 +32,6 @@ import ch.qos.logback.core.status.WarnStatus;
abstract public class AppenderBase<E> extends ContextAwareBase implements
Appender<E> {
- /**
- * The layout variable does not need to be set depending on the appender. Some
- * appenders do not need a layout.
- */
- protected Layout<E> layout;
-
protected boolean started = false;
/**
@@ -144,19 +138,4 @@ abstract public class AppenderBase<E> extends ContextAwareBase implements
return fai.getFilterChainDecision(event);
}
- /**
- * Returns the layout of this appender. The returned value may be null if this
- * appender does not have a layout.
- */
- public Layout<E> getLayout() {
- return layout;
- }
-
- /**
- * Set the layout for this appender. Note that some appenders have their own
- * (fixed) layouts or do not use any.
- */
- public void setLayout(Layout<E> layout) {
- this.layout = layout;
- }
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
index 1c52db7..24d31fe 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java
@@ -74,9 +74,9 @@ public class ConsoleAppender<E> extends WriterAppender<E> {
public void start() {
if (target.equals(SYSTEM_OUT)) {
- setWriter(createWriter(System.out));
+ setWriter(System.out);
} else {
- setWriter(createWriter(System.err));
+ setWriter(System.err);
}
super.start();
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java b/logback-core/src/main/java/ch/qos/logback/core/Encoder.java
similarity index 57%
copy from logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
copy to logback-core/src/main/java/ch/qos/logback/core/Encoder.java
index 8e1d504..87a7350 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/Encoder.java
@@ -11,16 +11,18 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package ch.qos.logback.core.appender;
+package ch.qos.logback.core;
-import java.io.Writer;
+import java.io.IOException;
+import java.io.OutputStream;
-import ch.qos.logback.core.WriterAppender;
+import ch.qos.logback.core.spi.ContextAware;
+import ch.qos.logback.core.spi.LifeCycle;
-public class DummyAppender<E> extends WriterAppender<E> {
-
- DummyAppender(Writer writer) {
- this.setWriter(writer);
- }
+public interface Encoder<E> extends ContextAware, LifeCycle {
+
+ void doEncode(E event, OutputStream os) throws IOException;
+ void close(OutputStream os) throws IOException;
+
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java b/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
index 2b915d2..c76aef0 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
@@ -13,11 +13,9 @@
*/
package ch.qos.logback.core;
-import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.Writer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
@@ -192,11 +190,11 @@ public class FileAppender<E> extends WriterAppender<E> {
if (prudent) {
fileChannel = fileOutputStream.getChannel();
}
- Writer w = createWriter(fileOutputStream);
- if (bufferedIO) {
- w = new BufferedWriter(w, bufferSize);
- }
- setWriter(w);
+// Writer w = createWriter(fileOutputStream);
+// if (bufferedIO) {
+// w = new BufferedWriter(w, bufferSize);
+// }
+ setWriter(fileOutputStream);
}
public boolean isBufferedIO() {
@@ -238,7 +236,7 @@ public class FileAppender<E> extends WriterAppender<E> {
this.append = append;
}
- final private void safeWrite(String s) throws IOException {
+ final private void safeWrite(E event) throws IOException {
FileLock fileLock = null;
try {
fileLock = fileChannel.lock();
@@ -247,7 +245,7 @@ public class FileAppender<E> extends WriterAppender<E> {
if (size != position) {
fileChannel.position(size);
}
- super.writerWrite(s, true);
+ super.writeOut(event);
} finally {
if (fileLock != null) {
fileLock.release();
@@ -256,11 +254,11 @@ public class FileAppender<E> extends WriterAppender<E> {
}
@Override
- protected void writerWrite(String s, boolean flush) throws IOException {
+ protected void writeOut(E event) throws IOException {
if (prudent && fileChannel != null) {
- safeWrite(s);
+ safeWrite(event);
} else {
- super.writerWrite(s, flush);
+ super.writeOut(event);
}
}
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/UnsynchronizedAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/UnsynchronizedAppenderBase.java
index 6a258d7..8c9efe3 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/UnsynchronizedAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/UnsynchronizedAppenderBase.java
@@ -31,8 +31,6 @@ import ch.qos.logback.core.status.WarnStatus;
abstract public class UnsynchronizedAppenderBase<E> extends ContextAwareBase implements
Appender<E> {
- protected Layout<E> layout;
-
protected boolean started = false;
// using a ThreadLocal instead of a boolean add 75 nanoseconds per
@@ -146,12 +144,4 @@ abstract public class UnsynchronizedAppenderBase<E> extends ContextAwareBase imp
public FilterReply getFilterChainDecision(E event) {
return fai.getFilterChainDecision(event);
}
-
- public Layout<E> getLayout() {
- return layout;
- }
-
- public void setLayout(Layout<E> layout) {
- this.layout = layout;
- }
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java b/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java
index d4e66d6..c1f36e4 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java
@@ -16,7 +16,6 @@ package ch.qos.logback.core;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
-import java.io.Writer;
import ch.qos.logback.core.status.ErrorStatus;
@@ -31,6 +30,8 @@ import ch.qos.logback.core.status.ErrorStatus;
*/
public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
+ protected Encoder<E> encoder;
+
/**
* Immediate flush means that the underlying writer or output stream will be
* flushed at the end of each append operation. Immediate flush is slower but
@@ -54,9 +55,9 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
private String encoding;
/**
- * This is the {@link Writer Writer} where we will write to.
+ * This is the {@link OutputStream outputStream} where we will write to.
*/
- private Writer writer;
+ private OutputStream outputStream;
/**
* The default constructor does nothing.
@@ -94,14 +95,14 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
*/
public void start() {
int errors = 0;
- if (this.layout == null) {
+ if (this.encoder == null) {
addStatus(new ErrorStatus("No layout set for the appender named \""
+ name + "\".", this));
errors++;
}
- if (this.writer == null) {
- addStatus(new ErrorStatus("No writer set for the appender named \""
+ if (this.outputStream == null) {
+ addStatus(new ErrorStatus("No output stream set for the appender named \""
+ name + "\".", this));
errors++;
}
@@ -136,12 +137,12 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
* Close the underlying {@link java.io.Writer}.
*/
protected void closeWriter() {
- if (this.writer != null) {
+ if (this.outputStream != null) {
try {
// before closing we have to output out layout's footer
writeFooter();
- this.writer.close();
- this.writer = null;
+ this.outputStream.close();
+ this.outputStream = null;
} catch (IOException e) {
addStatus(new ErrorStatus("Could not close writer for WriterAppener.",
this, e));
@@ -160,7 +161,6 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
OutputStreamWriter retval = null;
String enc = getEncoding();
-
try {
if (enc != null) {
retval = new OutputStreamWriter(os, enc);
@@ -185,25 +185,7 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
}
void writeHeader() {
- if (layout != null && (this.writer != null)) {
- try {
- StringBuilder sb = new StringBuilder();
- appendIfNotNull(sb, layout.getFileHeader());
- appendIfNotNull(sb, layout.getPresentationHeader());
- if (sb.length() > 0) {
- sb.append(CoreConstants.LINE_SEPARATOR);
- // If at least one of file header or presentation header were not
- // null, then append a line separator.
- // This should be useful in most cases and should not hurt.
- writerWrite(sb.toString(), true);
- }
-
- } catch (IOException ioe) {
- this.started = false;
- addStatus(new ErrorStatus("Failed to write header for appender named ["
- + name + "].", this, ioe));
- }
- }
+
}
private void appendIfNotNull(StringBuilder sb, String s) {
@@ -213,14 +195,10 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
}
void writeFooter() {
- if (layout != null && this.writer != null) {
+ if (encoder != null && this.outputStream != null) {
try {
StringBuilder sb = new StringBuilder();
- appendIfNotNull(sb, layout.getPresentationFooter());
- appendIfNotNull(sb, layout.getFileFooter());
- if (sb.length() > 0) {
- writerWrite(sb.toString(), true); // force flush
- }
+ encoder.close(outputStream);
} catch (IOException ioe) {
this.started = false;
addStatus(new ErrorStatus("Failed to write footer for appender named ["
@@ -238,21 +216,19 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
* @param writer
* An already opened Writer.
*/
- public synchronized void setWriter(Writer writer) {
+ public synchronized void setWriter(OutputStream outputStream) {
// close any previously opened writer
closeWriter();
- this.writer = writer;
+ this.outputStream = outputStream;
writeHeader();
}
- protected void writerWrite(String s, boolean flush) throws IOException {
- this.writer.write(s);
- if (flush) {
- this.writer.flush();
- }
+
+ void writeOut(E event) throws IOException {
+ this.encoder.doEncode(event, outputStream);
}
-
+
/**
* Actual writing occurs here.
* <p>
@@ -266,10 +242,7 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
return;
}
try {
- String output = this.layout.doLayout(event);
- synchronized (this) {
- writerWrite(output, this.immediateFlush);
- }
+ writeOut(event);
} catch (IOException ioe) {
// as soon as an exception occurs, move to non-started state
// and add a single ErrorStatus to the SM.
@@ -277,4 +250,14 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
addStatus(new ErrorStatus("IO failure in appender", this, ioe));
}
}
+
+ public Encoder<E> getEncoder() {
+ return encoder;
+ }
+
+ public void setEncoder(Encoder<E> encoder) {
+ this.encoder = encoder;
+ }
+
+
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java
new file mode 100644
index 0000000..6d53222
--- /dev/null
+++ b/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java
@@ -0,0 +1,22 @@
+package ch.qos.logback.core.encoder;
+
+import ch.qos.logback.core.Encoder;
+import ch.qos.logback.core.spi.ContextAwareBase;
+
+abstract public class EncoderBase<E> extends ContextAwareBase implements Encoder<E> {
+
+ protected boolean started;
+
+
+ public boolean isStarted() {
+ return started;
+ }
+
+ public void start() {
+ started = true;
+ }
+
+ public void stop() {
+ started = false;
+ }
+}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/html/LayoutWrappingEncoder.java b/logback-core/src/main/java/ch/qos/logback/core/html/LayoutWrappingEncoder.java
new file mode 100644
index 0000000..8f99398
--- /dev/null
+++ b/logback-core/src/main/java/ch/qos/logback/core/html/LayoutWrappingEncoder.java
@@ -0,0 +1,44 @@
+package ch.qos.logback.core.html;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import ch.qos.logback.core.Encoder;
+import ch.qos.logback.core.Layout;
+import ch.qos.logback.core.spi.ContextAwareBase;
+
+public class LayoutWrappingEncoder<E> extends ContextAwareBase implements Encoder<E> {
+
+ boolean started;
+ protected Layout<E> layout;
+
+ public Layout<E> getLayout() {
+ return layout;
+ }
+
+ public void setLayout(Layout<E> layout) {
+ this.layout = layout;
+ }
+
+ public void close(OutputStream os) throws IOException {
+ }
+
+ public void doEncode(E event, OutputStream os) throws IOException {
+ String txt = layout.doLayout(event);
+ os.write(txt.getBytes());
+ os.flush();
+ }
+
+ public boolean isStarted() {
+ return false;
+ }
+
+ public void start() {
+ started = true;
+ }
+
+ public void stop() {
+ }
+
+
+}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java
index 37744f1..b2be4b5 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java
@@ -54,7 +54,9 @@ import ch.qos.logback.core.util.OptionHelper;
public abstract class SMTPAppenderBase<E> extends AppenderBase<E> {
protected Layout<E> subjectLayout;
-
+
+ protected Layout<E> layout;
+
private List<String> to = new ArrayList<String>();
private String from;
private String subjectStr = null;
@@ -435,4 +437,12 @@ public abstract class SMTPAppenderBase<E> extends AppenderBase<E> {
this.charsetEncoding = charsetEncoding;
}
+ public Layout<E> getLayout() {
+ return layout;
+ }
+
+ public void setLayout(Layout<E> layout) {
+ this.layout = layout;
+ }
+
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java
index 8c0d660..551de9e 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java
@@ -33,6 +33,7 @@ public abstract class SyslogAppenderBase<E> extends AppenderBase<E> {
final static String SYSLOG_LAYOUT_URL = CoreConstants.CODES_URL + "#syslog_layout";
final static int MSG_SIZE_LIMIT = 256*1024;
+ Layout<E> layout;
String facilityStr;
String syslogHost;
protected String suffixPattern;
@@ -206,12 +207,10 @@ public abstract class SyslogAppenderBase<E> extends AppenderBase<E> {
}
- @Override
public Layout<E> getLayout() {
return layout;
}
- @Override
public void setLayout(Layout<E> layout) {
addWarn("The layout of a SyslogAppender cannot be set directly. See also "+SYSLOG_LAYOUT_URL);
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternEncoderBase.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternEncoderBase.java
new file mode 100644
index 0000000..a3bfc16
--- /dev/null
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternEncoderBase.java
@@ -0,0 +1,45 @@
+package ch.qos.logback.core.pattern;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import ch.qos.logback.core.Encoder;
+import ch.qos.logback.core.spi.ContextAwareBase;
+
+public class PatternEncoderBase<E> extends ContextAwareBase implements Encoder<E> {
+
+ boolean started;
+ protected PatternLayoutBase<E> layout;
+ String pattern;
+
+ public void close(OutputStream os) throws IOException {
+ }
+
+ public void doEncode(E event, OutputStream os) throws IOException {
+ String txt = layout.doLayout(event);
+ os.write(txt.getBytes());
+ os.flush();
+ }
+
+ public boolean isStarted() {
+ return false;
+ }
+
+ public void start() {
+ started = true;
+ }
+
+ public void stop() {
+ }
+
+ public String getPattern() {
+ return pattern;
+ }
+
+ public void setPattern(String pattern) {
+ this.pattern = pattern;
+ }
+
+
+
+}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
index e58a758..e4216c2 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
@@ -14,7 +14,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.testUtil.Env;
import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.StatusPrinter;
@@ -60,7 +60,7 @@ public class FileAppenderResilienceTest {
+ "]");
fa.setName("FILE");
- fa.setLayout(new EchoLayout<Object>());
+ fa.setEncoder(new EchoEncoder<Object>());
fa.setFile(logfileStr);
fa.start();
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/WriterAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/WriterAppenderTest.java
index c560a27..e25d9d7 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/WriterAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/WriterAppenderTest.java
@@ -14,15 +14,15 @@
package ch.qos.logback.core;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertTrue;
-import java.io.StringWriter;
-import java.io.Writer;
+import java.io.ByteArrayOutputStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import ch.qos.logback.core.html.LayoutWrappingEncoder;
import ch.qos.logback.core.pattern.parser.SamplePatternLayout;
public class WriterAppenderTest {
@@ -85,7 +85,7 @@ public class WriterAppenderTest {
public void headerFooterCheck(String fileHeader, String presentationHeader, String presentationFooter, String fileFooter) {
WriterAppender<Object> wa = new WriterAppender<Object>();
wa.setContext(context);
- Writer sw = new StringWriter();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
SamplePatternLayout<Object> spl = new SamplePatternLayout<Object>();
spl.setContext(context);
@@ -96,13 +96,16 @@ public class WriterAppenderTest {
spl.setFileFooter(fileFooter);
spl.start();
+ LayoutWrappingEncoder<Object> encoder = new LayoutWrappingEncoder<Object>();
+ encoder.setLayout(spl);
+ encoder.setContext(context);
- wa.setLayout(spl);
- wa.setWriter(sw);
+ wa.setEncoder(encoder);
+ wa.setWriter(baos);
wa.start();
wa.stop();
- String result = sw.toString();
+ String result = baos.toString();
String expectedHeader = emtptyIfNull(fileHeader) + emtptyIfNull(presentationHeader);
assertTrue(result, result.startsWith(expectedHeader));
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
index e10888f..2f98da8 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java
@@ -25,8 +25,9 @@ import org.junit.Test;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.encoder.DummyEncoder;
+import ch.qos.logback.core.encoder.NopEncoder;
import ch.qos.logback.core.layout.DummyLayout;
-import ch.qos.logback.core.layout.NopLayout;
import ch.qos.logback.core.util.TeeOutputStream;
@@ -63,7 +64,7 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
protected Appender<Object> getConfiguredAppender() {
ConsoleAppender<Object> ca = new ConsoleAppender<Object>();
- ca.setLayout(new NopLayout<Object>());
+ ca.setEncoder(new NopEncoder<Object>());
ca.start();
return ca;
}
@@ -71,7 +72,7 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
@org.junit.Test
public void testBasic() {
ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
- ca.setLayout(new DummyLayout<Object>());
+ ca.setEncoder(new DummyEncoder<Object>());
ca.start();
ca.doAppend(new Object());
assertEquals(DummyLayout.DUMMY, tee.toString());
@@ -80,9 +81,9 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
@org.junit.Test
public void testOpen() {
ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
- DummyLayout<Object> dummyLayout = new DummyLayout<Object>();
- dummyLayout.setFileHeader("open");
- ca.setLayout(dummyLayout);
+ DummyEncoder<Object> dummyEncoder = new DummyEncoder<Object>();
+ dummyEncoder.setFileHeader("open");
+ ca.setEncoder(dummyEncoder);
ca.start();
ca.doAppend(new Object());
ca.stop();
@@ -92,9 +93,9 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
@Test
public void testClose() {
ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
- DummyLayout<Object> dummyLayout = new DummyLayout<Object>();
- dummyLayout.setFileFooter("CLOSED");
- ca.setLayout(dummyLayout);
+ DummyEncoder<Object> dummyEncoder = new DummyEncoder<Object>();
+ dummyEncoder.setFileFooter("CLOSED");
+ ca.setEncoder(dummyEncoder);
ca.start();
ca.doAppend(new Object());
ca.stop();
@@ -106,9 +107,10 @@ public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
@Test
public void testUTF16BE() throws UnsupportedEncodingException {
ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
- ca.setLayout(new DummyLayout<Object>());
+ DummyEncoder<Object> dummyEncoder = new DummyEncoder<Object>();
String encodingName = "UTF-16BE";
- ca.setEncoding(encodingName);
+ dummyEncoder.setEncodingName(encodingName);
+ ca.setEncoder(dummyEncoder);
ca.start();
ca.doAppend(new Object());
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
index 8e1d504..d2f0c82 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
@@ -13,14 +13,14 @@
*/
package ch.qos.logback.core.appender;
-import java.io.Writer;
+import java.io.OutputStream;
import ch.qos.logback.core.WriterAppender;
public class DummyAppender<E> extends WriterAppender<E> {
- DummyAppender(Writer writer) {
- this.setWriter(writer);
+ DummyAppender(OutputStream os) {
+ this.setWriter(os);
}
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java
index fafc4cf..b728166 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java
@@ -15,37 +15,37 @@ package ch.qos.logback.core.appender;
import static org.junit.Assert.assertEquals;
-import java.io.StringWriter;
+import java.io.ByteArrayOutputStream;
import org.junit.Test;
import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.encoder.DummyEncoder;
import ch.qos.logback.core.layout.DummyLayout;
-import ch.qos.logback.core.layout.NopLayout;
-public class DummyAppenderTest {
+public class DummyAppenderTest extends AbstractAppenderTest<Object> {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
protected Appender<Object> getAppender() {
- return new DummyAppender<Object>(new StringWriter());
+ return new DummyAppender<Object>(baos);
}
protected Appender<Object> getConfiguredAppender() {
- DummyAppender<Object> da = new DummyAppender<Object>(new StringWriter());
- da.setLayout(new NopLayout<Object>());
+ DummyAppender<Object> da = new DummyAppender<Object>(baos);
+ da.setEncoder(new DummyEncoder<Object>());
da.start();
return da;
}
@Test
public void testBasic() {
- StringWriter sw = new StringWriter();
- DummyAppender<Object> da = new DummyAppender<Object>(sw);
- da.setLayout(new DummyLayout<Object>());
+ DummyAppender<Object> da = new DummyAppender<Object>(baos);
+ da.setEncoder(new DummyEncoder<Object>());
da.start();
da.doAppend(new Object());
- assertEquals(DummyLayout.DUMMY, sw.getBuffer().toString());
+ assertEquals(DummyLayout.DUMMY, baos.toString());
}
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
index 38ef9dd..b0fcdcf 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
@@ -27,8 +27,8 @@ import ch.qos.logback.core.Appender;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.FileAppender;
-import ch.qos.logback.core.layout.DummyLayout;
-import ch.qos.logback.core.layout.NopLayout;
+import ch.qos.logback.core.encoder.DummyEncoder;
+import ch.qos.logback.core.encoder.NopEncoder;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusManager;
import ch.qos.logback.core.util.CoreTestConstants;
@@ -45,7 +45,7 @@ public class FileAppenderTest extends AbstractAppenderTest<Object> {
protected Appender<Object> getConfiguredAppender() {
FileAppender<Object> appender = new FileAppender<Object>();
- appender.setLayout(new NopLayout<Object>());
+ appender.setEncoder(new NopEncoder<Object>());
appender.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX+"temp.log");
appender.setName("test");
appender.setContext(context);
@@ -58,7 +58,7 @@ public class FileAppenderTest extends AbstractAppenderTest<Object> {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + "temp.log";
FileAppender<Object> appender = new FileAppender<Object>();
- appender.setLayout(new DummyLayout<Object>());
+ appender.setEncoder(new DummyEncoder<Object>());
appender.setAppend(false);
appender.setFile(filename);
appender.setName("smoke");
@@ -78,7 +78,7 @@ public class FileAppenderTest extends AbstractAppenderTest<Object> {
+ "/testing.txt";
File file = new File(filename);
FileAppender<Object> appender = new FileAppender<Object>();
- appender.setLayout(new DummyLayout<Object>());
+ appender.setEncoder(new DummyEncoder<Object>());
appender.setAppend(false);
appender.setFile(filename);
appender.setName("testCreateParentFolders");
@@ -100,7 +100,7 @@ public class FileAppenderTest extends AbstractAppenderTest<Object> {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "testing.txt";
File file = new File(filename);
FileAppender<Object> appender = new FileAppender<Object>();
- appender.setLayout(new DummyLayout<Object>());
+ appender.setEncoder(new DummyEncoder<Object>());
appender.setFile(filename);
appender.setName("testPrudentMode");
appender.setContext(context);
diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java
new file mode 100644
index 0000000..2e82951
--- /dev/null
+++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java
@@ -0,0 +1,79 @@
+/**
+ * Logback: the reliable, generic, fast and flexible logging framework.
+ * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
+ *
+ * This program and the accompanying materials are dual-licensed under
+ * either the terms of the Eclipse Public License v1.0 as published by
+ * the Eclipse Foundation
+ *
+ * or (per the licensee's choosing)
+ *
+ * under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation.
+ */
+package ch.qos.logback.core.encoder;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import ch.qos.logback.core.CoreConstants;
+
+public class DummyEncoder<E> extends EncoderBase<E> {
+
+ public static final String DUMMY = "dummy" + CoreConstants.LINE_SEPARATOR;
+ String val = DUMMY;
+ String fileHeader;
+ String fileFooter;
+ String encodingName;
+
+ public String getEncodingName() {
+ return encodingName;
+ }
+
+ public void setEncodingName(String encodingName) {
+ this.encodingName = encodingName;
+ }
+
+ public DummyEncoder() {
+ }
+
+ public DummyEncoder(String val) {
+ this.val = val;
+ }
+
+ public void doEncode(E event, OutputStream os) throws IOException {
+ if (encodingName == null) {
+ os.write(val.getBytes());
+ } else {
+ os.write(val.getBytes(encodingName));
+ }
+ }
+
+ public void close(OutputStream os) throws IOException {
+ if(fileFooter == null) {
+ return;
+ }
+ if (encodingName == null) {
+ os.write(fileFooter.getBytes());
+ } else {
+ os.write(fileFooter.getBytes(encodingName));
+ }
+ }
+
+ public String getFileHeader() {
+ return fileHeader;
+ }
+
+ public void setFileHeader(String fileHeader) {
+ this.fileHeader = fileHeader;
+ }
+
+ public String getFileFooter() {
+ return fileFooter;
+ }
+
+ public void setFileFooter(String fileFooter) {
+ this.fileFooter = fileFooter;
+ }
+
+}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/EchoEncoder.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/EchoEncoder.java
new file mode 100644
index 0000000..90c4b0c
--- /dev/null
+++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/EchoEncoder.java
@@ -0,0 +1,42 @@
+/**
+ * Logback: the reliable, generic, fast and flexible logging framework.
+ * Copyright (C) 1999-2009, QOS.ch. All rights reserved.
+ *
+ * This program and the accompanying materials are dual-licensed under
+ * either the terms of the Eclipse Public License v1.0 as published by
+ * the Eclipse Foundation
+ *
+ * or (per the licensee's choosing)
+ *
+ * under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation.
+ */
+package ch.qos.logback.core.encoder;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import ch.qos.logback.core.CoreConstants;
+
+public class EchoEncoder<E> extends EncoderBase<E> {
+
+ String fileHeader;
+ String fileFooter;
+
+ public EchoEncoder() {
+ }
+
+ public void doEncode(E event, OutputStream os) throws IOException {
+ String val = event + CoreConstants.LINE_SEPARATOR;
+ os.write(val.getBytes());
+ }
+
+ public void close(OutputStream os) throws IOException {
+ if (fileFooter == null) {
+ return;
+ }
+ os.write(fileFooter.getBytes());
+ }
+
+
+}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java
similarity index 62%
copy from logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
copy to logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java
index 8e1d504..8132f79 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppender.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java
@@ -11,16 +11,17 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package ch.qos.logback.core.appender;
+package ch.qos.logback.core.encoder;
-import java.io.Writer;
+import java.io.IOException;
+import java.io.OutputStream;
-import ch.qos.logback.core.WriterAppender;
-
-public class DummyAppender<E> extends WriterAppender<E> {
-
- DummyAppender(Writer writer) {
- this.setWriter(writer);
+public class NopEncoder<E> extends EncoderBase<E> {
+
+ public void close(OutputStream os) throws IOException {
}
+ public void doEncode(E event, OutputStream os) throws IOException {
+
+ }
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
index aa4a968..3a1d898 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
@@ -30,10 +30,10 @@ import org.junit.Test;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
-import ch.qos.logback.core.Layout;
+import ch.qos.logback.core.Encoder;
import ch.qos.logback.core.contention.MultiThreadedHarness;
import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.status.StatusChecker;
import ch.qos.logback.core.testUtil.Env;
import ch.qos.logback.core.testUtil.RandomUtil;
@@ -46,7 +46,7 @@ public class MultiThreadedRollingTest {
final static int TOTAL_DURATION = 2000;
RunnableWithCounterAndDone[] runnableArray;
- Layout<Object> layout;
+ Encoder<Object> encoder;
Context context = new ContextBase();
static String VERIFY_SH = "verify.sh";
@@ -62,7 +62,7 @@ public class MultiThreadedRollingTest {
@Before
public void setUp() throws Exception {
- layout = new EchoLayout<Object>();
+ encoder = new EchoEncoder<Object>();
File outputDir = new File(outputDirStr);
outputDir.mkdirs();
@@ -71,7 +71,7 @@ public class MultiThreadedRollingTest {
scriptOS = openScript();
rfa.setName("rolling");
- rfa.setLayout(layout);
+ rfa.setEncoder(encoder);
rfa.setContext(context);
rfa.setFile(outputDirStr + "output.log");
@@ -256,8 +256,8 @@ public class MultiThreadedRollingTest {
StatusChecker checker = new StatusChecker(context.getStatusManager());
if (!checker.isErrorFree()) {
- fail("errors reported");
StatusPrinter.print(context);
+ fail("errors reported");
}
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/RenamingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/RenamingTest.java
index 34660d4..b08df19 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/RenamingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/RenamingTest.java
@@ -24,8 +24,8 @@ import org.junit.Test;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
-import ch.qos.logback.core.Layout;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.Encoder;
+import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.util.Compare;
import ch.qos.logback.core.util.CoreTestConstants;
@@ -39,12 +39,12 @@ import ch.qos.logback.core.util.CoreTestConstants;
*/
public class RenamingTest {
- Layout<Object> layout;
+ Encoder<Object> encoder;
Context context = new ContextBase();
@Before
public void setUp() throws Exception {
- layout = new EchoLayout<Object>();
+ encoder = new EchoEncoder<Object>();
File target = new File(CoreTestConstants.OUTPUT_DIR_PREFIX + "test.log");
target.mkdirs();
@@ -55,7 +55,7 @@ public class RenamingTest {
public void testRename() throws Exception {
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
- rfa.setLayout(layout);
+ rfa.setEncoder(encoder);
rfa.setContext(context);
// rollover by the second
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/RollingFileAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/RollingFileAppenderTest.java
index 4b4cdf9..e4cbc01 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/RollingFileAppenderTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/RollingFileAppenderTest.java
@@ -26,7 +26,7 @@ import ch.qos.logback.core.Appender;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.appender.AbstractAppenderTest;
-import ch.qos.logback.core.layout.DummyLayout;
+import ch.qos.logback.core.encoder.DummyEncoder;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusChecker;
import ch.qos.logback.core.status.StatusManager;
@@ -48,7 +48,7 @@ public class RollingFileAppenderTest extends AbstractAppenderTest<Object> {
// noStartTest fails if the context is set in setUp
// rfa.setContext(context);
- rfa.setLayout(new DummyLayout<Object>());
+ rfa.setEncoder(new DummyEncoder<Object>());
rfa.setName("test");
tbrp.setContext(context);
tbrp.setParent(rfa);
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java
index 8b2fbca..633e1db 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java
@@ -29,7 +29,7 @@ import java.util.concurrent.TimeoutException;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.rolling.helper.FileFilterUtil;
import ch.qos.logback.core.testUtil.FileToBufferUtil;
import ch.qos.logback.core.testUtil.RandomUtil;
@@ -51,7 +51,7 @@ public class ScaffoldingForRollingTests {
int diff = RandomUtil.getPositiveInt();
protected String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff
+ "/";
- EchoLayout<Object> layout = new EchoLayout<Object>();
+ EchoEncoder<Object> encoder = new EchoEncoder<Object>();
Context context = new ContextBase();
protected List<String> expectedFilenameList = new ArrayList<String>();
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java
index cfc1841..5a0bffc 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java
@@ -43,7 +43,7 @@ public class SizeAndTimeBasedFNATP_Test extends
void initRFA(RollingFileAppender<Object> rfa, String filename) {
rfa.setContext(context);
- rfa.setLayout(layout);
+ rfa.setEncoder(encoder);
if (filename != null) {
rfa.setFile(filename);
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java
index 453123a..0653905 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java
@@ -23,9 +23,8 @@ import org.junit.Test;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
-import ch.qos.logback.core.Layout;
-import ch.qos.logback.core.layout.DummyLayout;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.DummyEncoder;
+import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.util.CoreTestConstants;
/**
@@ -69,9 +68,8 @@ public class SizeBasedRollingTest extends ScaffoldingForRollingTests {
// We purposefully use the \n as the line separator.
// This makes the regression test system independent.
Context context = new ContextBase();
- Layout<Object> layout = new DummyLayout<Object>();
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
- rfa.setLayout(layout);
+ rfa.setEncoder(new DummyEncoder<Object>());
rfa.setContext(new ContextBase());
FixedWindowRollingPolicy fwrp = new FixedWindowRollingPolicy();
@@ -99,10 +97,9 @@ public class SizeBasedRollingTest extends ScaffoldingForRollingTests {
public void smoke() throws Exception {
Context context = new ContextBase();
- EchoLayout<Object> layout = new EchoLayout<Object>();
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
rfa.setName("ROLLING");
- rfa.setLayout(layout);
+ rfa.setEncoder(new EchoEncoder<Object>());
rfa.setContext(context);
// make the .log show first
rfa.setFile(randomOutputDir + "a-sizeBased-smoke.log");
@@ -143,9 +140,8 @@ public class SizeBasedRollingTest extends ScaffoldingForRollingTests {
@Test
public void test3() throws Exception {
Context context = new ContextBase();
- EchoLayout<Object> layout = new EchoLayout<Object>();
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
- rfa.setLayout(layout);
+ rfa.setEncoder(new EchoEncoder<Object>());
rfa.setContext(context);
rfa.setFile(randomOutputDir + "a-sbr-test3.log");
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java
index 4c5b87b..f76cac4 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java
@@ -65,7 +65,7 @@ public class TimeBasedRollingTest extends ScaffoldingForRollingTests {
void initRFA(RollingFileAppender<Object> rfa, String filename) {
rfa.setContext(context);
- rfa.setLayout(layout);
+ rfa.setEncoder(encoder);
if (filename != null) {
rfa.setFile(filename);
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemovalTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemovalTest.java
index f433523..f034a3d 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemovalTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemovalTest.java
@@ -35,14 +35,14 @@ import org.junit.Test;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.CoreTestConstants;
public class TimeBasedRollingWithArchiveRemovalTest {
Context context = new ContextBase();
- EchoLayout<Object> layout = new EchoLayout<Object>();
+ EchoEncoder<Object> encoder = new EchoEncoder<Object>();
static final String MONTHLY_DATE_PATTERN = "yyyy-MM";
static final String MONTHLY_CROLOLOG_DATE_PATTERN = "yyyy/MM";
@@ -174,7 +174,7 @@ public class TimeBasedRollingWithArchiveRemovalTest {
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
rfa.setContext(context);
- rfa.setLayout(layout);
+ rfa.setEncoder(encoder);
// rfa.setFile(Constants.OUTPUT_DIR_PREFIX + "clean.txt");
TimeBasedRollingPolicy<Object> tbrp = new TimeBasedRollingPolicy<Object>();
tbrp.setContext(context);
diff --git a/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java b/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java
index dd822ed..300fedd 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java
@@ -14,10 +14,10 @@
package ch.qos.logback.core.spi;
-import static org.junit.Assert.*;
-import ch.qos.logback.core.appender.NOPAppender;
-import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.layout.NopLayout;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import java.util.Iterator;
@@ -25,6 +25,9 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.appender.NOPAppender;
+
/**
* This test case verifies all the methods of AppenderAttableImpl work properly.
*
@@ -49,12 +52,10 @@ public class AppenderAttachableImplTest {
public void testAddAppender() throws Exception {
TestEvent event = new TestEvent();
NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
- ta.setLayout(new NopLayout<TestEvent>());
ta.start();
aai.addAppender(ta);
ta = new NOPAppender<TestEvent>();
ta.setName("test");
- ta.setLayout(new NopLayout<TestEvent>());
ta.start();
aai.addAppender(ta);
int size = aai.appendLoopOnAppenders(event);
@@ -64,12 +65,10 @@ public class AppenderAttachableImplTest {
@Test
public void testIteratorForAppenders() throws Exception {
NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
- ta.setLayout(new NopLayout<TestEvent>());
ta.start();
aai.addAppender(ta);
NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
tab.setName("test");
- tab.setLayout(new NopLayout<TestEvent>());
tab.start();
aai.addAppender(tab);
Iterator<Appender<TestEvent>> iter = aai.iteratorForAppenders();
@@ -85,14 +84,12 @@ public class AppenderAttachableImplTest {
@Test
public void getGetAppender() throws Exception {
NOPAppender<TestEvent> test = new NOPAppender<TestEvent>();
- test.setLayout(new NopLayout<TestEvent>());
test.setName("test");
test.start();
aai.addAppender(test);
NOPAppender<TestEvent> testOther = new NOPAppender<TestEvent>();
testOther.setName("testOther");
- testOther.setLayout(new NopLayout<TestEvent>());
testOther.start();
aai.addAppender(testOther);
@@ -110,12 +107,10 @@ public class AppenderAttachableImplTest {
@Test
public void testIsAttached() throws Exception {
NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
- ta.setLayout(new NopLayout<TestEvent>());
ta.start();
aai.addAppender(ta);
NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
tab.setName("test");
- tab.setLayout(new NopLayout<TestEvent>());
tab.start();
aai.addAppender(tab);
assertTrue("Appender is not attached", aai.isAttached(ta));
@@ -125,12 +120,10 @@ public class AppenderAttachableImplTest {
@Test
public void testDetachAndStopAllAppenders() throws Exception {
NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
- ta.setLayout(new NopLayout<TestEvent>());
ta.start();
aai.addAppender(ta);
NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
tab.setName("test");
- tab.setLayout(new NopLayout<TestEvent>());
tab.start();
aai.addAppender(tab);
assertTrue("Appender was not started", tab.isStarted());
@@ -142,12 +135,10 @@ public class AppenderAttachableImplTest {
@Test
public void testDetachAppender() throws Exception {
NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
- ta.setLayout(new NopLayout<TestEvent>());
ta.start();
aai.addAppender(ta);
NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
tab.setName("test");
- tab.setLayout(new NopLayout<TestEvent>());
tab.start();
aai.addAppender(tab);
assertTrue("Appender not detached", aai.detachAppender(tab));
@@ -159,12 +150,10 @@ public class AppenderAttachableImplTest {
public void testDetachAppenderByName() throws Exception {
NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
ta.setName("test1");
- ta.setLayout(new NopLayout<TestEvent>());
ta.start();
aai.addAppender(ta);
NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
tab.setName("test");
- tab.setLayout(new NopLayout<TestEvent>());
tab.start();
aai.addAppender(tab);
diff --git a/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java b/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java
index bd51887..5d8420c 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java
@@ -47,12 +47,10 @@ public class StringListAppender<E> extends AppenderBase<E> {
strList.add(res);
}
- @Override
public Layout<E> getLayout() {
return layout;
}
- @Override
public void setLayout(Layout<E> layout) {
this.layout = layout;
}
diff --git a/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java b/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java
index 38616b4..9ddfab6 100644
--- a/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java
+++ b/logback-examples/src/main/java/chapter11/TrivialLogbackAppender.java
@@ -13,15 +13,28 @@
*/
package chapter11;
+import java.io.IOException;
+
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class TrivialLogbackAppender extends AppenderBase<ILoggingEvent> {
+ PatternEncoder encoder;
+
+ public PatternEncoder getEncoder() {
+ return encoder;
+ }
+
+ public void setEncoder(PatternEncoder encoder) {
+ this.encoder = encoder;
+ }
+
@Override
public void start() {
- if (this.layout == null) {
- addError("No layout set for the appender named [" + name + "].");
+ if (this.encoder == null) {
+ addError("No encoder set for the appender named [" + name + "].");
return;
}
super.start();
@@ -31,9 +44,13 @@ public class TrivialLogbackAppender extends AppenderBase<ILoggingEvent> {
protected void append(ILoggingEvent loggingevent) {
// note that AppenderBase.doAppend will invoke this method only if
// this appender was successfully started.
-
- String s = this.layout.doLayout(loggingevent);
- System.out.println(s);
+ try {
+ this.encoder.doEncode(loggingevent, System.out);
+ } catch (IOException e) {
+ // we can't do much with the exception except halting
+ super.stop();
+ addError("Failed to write to the console");
+ }
}
}
diff --git a/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java b/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java
index fd29e5d..1df11e9 100644
--- a/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java
+++ b/logback-examples/src/main/java/chapter4/CountingConsoleAppender.java
@@ -13,6 +13,9 @@
*/
package chapter4;
+import java.io.IOException;
+
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
@@ -22,6 +25,8 @@ public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
int counter = 0;
int limit = DEFAULT_LIMIT;
+ PatternEncoder encoder;
+
public CountingConsoleAppender() {
}
@@ -35,7 +40,7 @@ public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
@Override
public void start() {
- if (this.layout == null) {
+ if (this.encoder == null) {
addError("No layout set for the appender named ["+ name +"].");
return;
}
@@ -48,9 +53,22 @@ public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
return;
}
// output the events as formatted by our layout
- System.out.print(this.layout.doLayout(event));
+ try {
+ this.encoder.doEncode(event, System.out);
+ } catch (IOException e) {
+ }
// prepare for next event
counter++;
}
+
+ public PatternEncoder getEncoder() {
+ return encoder;
+ }
+
+ public void setEncoder(PatternEncoder encoder) {
+ this.encoder = encoder;
+ }
+
+
}
diff --git a/logback-examples/src/main/java/chapter4/ExitWoes1.java b/logback-examples/src/main/java/chapter4/ExitWoes1.java
index ebaf133..a265137 100644
--- a/logback-examples/src/main/java/chapter4/ExitWoes1.java
+++ b/logback-examples/src/main/java/chapter4/ExitWoes1.java
@@ -15,7 +15,6 @@ package chapter4;
import java.io.FileOutputStream;
import java.io.OutputStream;
-import java.io.OutputStreamWriter;
import org.slf4j.LoggerFactory;
@@ -23,7 +22,7 @@ import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.WriterAppender;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.EchoEncoder;
public class ExitWoes1 {
@@ -32,10 +31,10 @@ public class ExitWoes1 {
lc.reset(); // we want to override the default-config.
WriterAppender<ILoggingEvent> writerAppender = new WriterAppender<ILoggingEvent>();
writerAppender.setContext(lc);
- writerAppender.setLayout(new EchoLayout<ILoggingEvent>());
+ writerAppender.setEncoder(new EchoEncoder<ILoggingEvent>());
OutputStream os = new FileOutputStream("exitWoes1.log");
- writerAppender.setWriter(new OutputStreamWriter(os));
+ writerAppender.setWriter(os);
writerAppender.setImmediateFlush(false);
writerAppender.start();
Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
diff --git a/logback-examples/src/main/java/chapter4/ExitWoes2.java b/logback-examples/src/main/java/chapter4/ExitWoes2.java
index a03d0ab..ab2b89c 100644
--- a/logback-examples/src/main/java/chapter4/ExitWoes2.java
+++ b/logback-examples/src/main/java/chapter4/ExitWoes2.java
@@ -15,7 +15,6 @@ package chapter4;
import java.io.FileOutputStream;
import java.io.OutputStream;
-import java.io.OutputStreamWriter;
import org.slf4j.LoggerFactory;
@@ -23,7 +22,7 @@ import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.WriterAppender;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.util.StatusPrinter;
public class ExitWoes2 {
@@ -33,10 +32,10 @@ public class ExitWoes2 {
lc.reset();//this is to cancel default-config.
WriterAppender<ILoggingEvent> writerAppender = new WriterAppender<ILoggingEvent>();
writerAppender.setContext(lc);
- writerAppender.setLayout(new EchoLayout<ILoggingEvent>());
+ writerAppender.setEncoder(new EchoEncoder<ILoggingEvent>());
OutputStream os = new FileOutputStream("exitWoes2.log");
- writerAppender.setWriter(new OutputStreamWriter(os));
+ writerAppender.setWriter(os);
writerAppender.setImmediateFlush(false);
writerAppender.start();
Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
diff --git a/logback-examples/src/main/java/chapter4/IO.java b/logback-examples/src/main/java/chapter4/IO.java
index 9010f7e..015bbff 100644
--- a/logback-examples/src/main/java/chapter4/IO.java
+++ b/logback-examples/src/main/java/chapter4/IO.java
@@ -16,10 +16,10 @@ package chapter4;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
-import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.encoder.EchoEncoder;
public class IO extends Thread {
static String msgLong = "ABCDEGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrstuvwxyz1234567890";
@@ -47,11 +47,13 @@ public class IO extends Thread {
FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
if (longMessage) {
- PatternLayout pa = new PatternLayout();
+ PatternEncoder pa = new PatternEncoder();
pa.setPattern("%r %5p %c [%t] - %m%n");
- fa.setLayout(pa);
+ pa.setContext(context);
+ pa.start();
+ fa.setEncoder(pa);
} else {
- fa.setLayout(new EchoLayout<ILoggingEvent>());
+ fa.setEncoder(new EchoEncoder<ILoggingEvent>());
}
fa.setFile(getName() + ".log");
diff --git a/logback-examples/src/main/java/chapter5/PatternSample.java b/logback-examples/src/main/java/chapter5/PatternSample.java
index 6ae46b6..6c7ec82 100644
--- a/logback-examples/src/main/java/chapter5/PatternSample.java
+++ b/logback-examples/src/main/java/chapter5/PatternSample.java
@@ -16,7 +16,7 @@ package chapter5;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
@@ -25,13 +25,13 @@ public class PatternSample {
static public void main(String[] args) throws Exception {
Logger rootLogger = (Logger) LoggerFactory.getLogger("root");
- PatternLayout layout = new PatternLayout();
+ PatternEncoder layout = new PatternEncoder();
layout.setPattern("%-5level [%thread]: %message%n");
layout.start();
ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<ILoggingEvent>();
appender.setContext(rootLogger.getLoggerContext());
- appender.setLayout(layout);
+ appender.setEncoder(layout);
appender.start();
rootLogger.addAppender(appender);
diff --git a/logback-examples/src/main/java/chapter7/SimpleMDC.java b/logback-examples/src/main/java/chapter7/SimpleMDC.java
index 59a5684..304b7c3 100644
--- a/logback-examples/src/main/java/chapter7/SimpleMDC.java
+++ b/logback-examples/src/main/java/chapter7/SimpleMDC.java
@@ -20,7 +20,7 @@ import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.encoder.PatternEncoder;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
@@ -63,13 +63,13 @@ public class SimpleMDC {
LoggerContext loggerContext = (LoggerContext) LoggerFactory
.getILoggerFactory();
loggerContext.reset();
- PatternLayout layout = new PatternLayout();
+ PatternEncoder layout = new PatternEncoder();
layout.setContext(loggerContext);
layout.setPattern("%X{first} %X{last} - %m%n");
layout.start();
ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<ILoggingEvent>();
appender.setContext(loggerContext);
- appender.setLayout(layout);
+ appender.setEncoder(layout);
appender.start();
// cast root logger to c.q.logback.classic.Logger so that we can attach
// an appender to it
-----------------------------------------------------------------------
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-28-gabb7826
by git-noreply@pixie.qos.ch 17 Feb '10
by git-noreply@pixie.qos.ch 17 Feb '10
17 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via abb78264a93de36465e4716f24d75c40b4b583bd (commit)
from e19c774ef368f0412a73acbff7892f50707057ba (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=abb78264a93de36465e4716f…
http://github.com/ceki/logback/commit/abb78264a93de36465e4716f24d75c40b4b58…
commit abb78264a93de36465e4716f24d75c40b4b583bd
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Wed Feb 17 12:18:20 2010 +0100
- removed a deprecated method
diff --git a/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java b/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
index dd3fda6..2b915d2 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
@@ -81,13 +81,6 @@ public class FileAppender<E> extends WriterAppender<E> {
}
/**
- * @deprecated Use isAppend instead
- */
- public boolean getAppend() {
- return append;
- }
-
- /**
* Returns the value of the <b>Append</b> property.
*/
public boolean isAppend() {
-----------------------------------------------------------------------
Summary of changes:
.../java/ch/qos/logback/core/FileAppender.java | 7 -------
1 files changed, 0 insertions(+), 7 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
16 Feb '10
Default behaviour with no config
--------------------------------
Key: LBGENERAL-40
URL: http://jira.qos.ch/browse/LBGENERAL-40
Project: logback-general
Issue Type: Improvement
Affects Versions: 0.9.14
Reporter: Paul Murray
Assignee: Logback dev list
One of our developers put logback in our project and didn't add a config file. This has killed our prod server for a week - 2 gig of hibernate debug messages per day, until I worked out WTF.
Log4j handles this situation by emitting a single message and producing no more output. This is a pain in the butt in development - because you always have to put a log4j config somewhere while coding - but now I understand why: it's built to be usable safely in a production environment.
I think you should consider altering the logback default behaviour to do what log4j does. Without that, it's a nervous business staging it on an internet-facing server.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
3
4
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-27-ge19c774
by git-noreply@pixie.qos.ch 12 Feb '10
by git-noreply@pixie.qos.ch 12 Feb '10
12 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via e19c774ef368f0412a73acbff7892f50707057ba (commit)
via 209d9073b02eee8eb35aeb6b2b893374a93511cf (commit)
from 1b5bc6b3190a00aa9f137b445635e9dc9ced738e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=e19c774ef368f0412a73acbf…
http://github.com/ceki/logback/commit/e19c774ef368f0412a73acbff7892f5070705…
commit e19c774ef368f0412a73acbff7892f50707057ba
Merge: 209d907 1b5bc6b
Author: Ceki Gulcu <ceki(a)gimmel.(none)>
Date: Fri Feb 12 18:31:00 2010 +0100
Merge branch 'master' of git@git.qos.ch:/logback
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=209d9073b02eee8eb35aeb6b…
http://github.com/ceki/logback/commit/209d9073b02eee8eb35aeb6b2b893374a9351…
commit 209d9073b02eee8eb35aeb6b2b893374a93511cf
Author: Ceki Gulcu <ceki(a)gimmel.(none)>
Date: Fri Feb 12 18:28:10 2010 +0100
- limit running FileAppenderResilienceTest on the host named "gimmel"
which is specifically configured for this purpose.
On other machines, it might cause the os ehem.. to lock.
diff --git a/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
index 545489b..e58a758 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
@@ -1,6 +1,6 @@
package ch.qos.logback.core;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.File;
@@ -15,6 +15,7 @@ import org.junit.Before;
import org.junit.Test;
import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.testUtil.Env;
import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.StatusPrinter;
@@ -24,7 +25,7 @@ public class FileAppenderResilienceTest {
static String LONG_STR = " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
- static String PATH_LOOPFS_SCRIPT = "/home/ceki/logback/logback-core/src/test/loopfs.sh";
+ static String PATH_LOOPFS_SCRIPT = "/home/ceki/java/logback/logback-core/src/test/loopfs.sh";
enum LoopFSCommand {
@@ -38,8 +39,15 @@ public class FileAppenderResilienceTest {
FileAppender<Object> fa = new FileAppender<Object>();
+ static boolean isConformingHost() {
+ return Env.isLocalHostNameInList(new String[] {"gimmel"});
+ }
+
@Before
public void setUp() throws IOException, InterruptedException {
+ if(!isConformingHost()) {
+ return;
+ }
Process p = runLoopFSScript(LoopFSCommand.setup);
p.waitFor();
@@ -76,6 +84,9 @@ public class FileAppenderResilienceTest {
@After
public void tearDown() throws IOException, InterruptedException {
+ if(!isConformingHost()) {
+ return;
+ }
StatusPrinter.print(context);
fa.stop();
Process p = runLoopFSScript(LoopFSCommand.teardown);
@@ -89,6 +100,9 @@ public class FileAppenderResilienceTest {
@Test
public void go() throws IOException, InterruptedException {
+ if(!isConformingHost()) {
+ return;
+ }
Process p = runLoopFSScript(LoopFSCommand.shake);
for (int i = 0; i < NUM_STEPS; i++) {
fa.append(String.valueOf(i) + LONG_STR);
@@ -103,6 +117,11 @@ public class FileAppenderResilienceTest {
// it needs to be Unix, with sudo privileges granted to the script
Process runLoopFSScript(LoopFSCommand cmd) throws IOException,
InterruptedException {
+ // causing a NullPointerException is better than locking the whole
+ // machine which the next operation can and will do.
+ if(!isConformingHost()) {
+ return null;
+ }
ProcessBuilder pb = new ProcessBuilder();
pb.command("/usr/bin/sudo", PATH_LOOPFS_SCRIPT, cmd.toString());
Process process = pb.start();
-----------------------------------------------------------------------
Summary of changes:
.../logback/core/FileAppenderResilienceTest.java | 23 ++++++++++++++++++-
1 files changed, 21 insertions(+), 2 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-25-g1b5bc6b
by git-noreply@pixie.qos.ch 12 Feb '10
by git-noreply@pixie.qos.ch 12 Feb '10
12 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 1b5bc6b3190a00aa9f137b445635e9dc9ced738e (commit)
from 172744139d9062c5f0b3be00d2f31f01d988eafc (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=1b5bc6b3190a00aa9f137b44…
http://github.com/ceki/logback/commit/1b5bc6b3190a00aa9f137b445635e9dc9ced7…
commit 1b5bc6b3190a00aa9f137b445635e9dc9ced738e
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Fri Feb 12 18:09:16 2010 +0100
- minor clean up of allInOneSafeMode.sh script
- other minor/cosmetic changes
- removed multiThreadSanityCheck.sh whose contents are now run automatically
diff --git a/logback-classic/src/test/allInOneSafeMode.sh b/logback-classic/src/test/allInOneSafeMode.sh
index 29e8138..cf1aed1 100644
--- a/logback-classic/src/test/allInOneSafeMode.sh
+++ b/logback-classic/src/test/allInOneSafeMode.sh
@@ -1,6 +1,12 @@
# Use this script both generate and check the results. It only works
# if there is only one instance of this script
+if [ $# -lt 3 ]
+then
+ echo "Usage: allInOneSafeMode.sh filename runLen stamp0 ... stampN"
+ exit 1;
+fi
+
echo "File name $1"
echo "run length $2"
@@ -8,16 +14,17 @@ echo "run length $2"
#On windows
-#CLASSPATH="${CLASSPATH};./target/classes/"
-#CLASSPATH="${CLASSPATH};./target/test-classes/"
-#CLASSPATH="${CLASSPATH};../logback-core/target/classes"
-#CLASSPATH="${CLASSPATH};../logback-examples/lib/slf4j-api-1.5.5.jar"
+#CLASSPATH="${CLASSPATH}\;./target/classes/"
+#CLASSPATH="${CLASSPATH}\;./target/test-classes/"
+#CLASSPATH="${CLASSPATH}\;../logback-core/target/classes"
+#LASSPATH="${CLASSPATH}\;../logback-examples/lib/slf4j-api-1.5.10.jar"
+echo $CLASSPATH
# On Unix
#CLASSPATH="${CLASSPATH}:./target/classes/"
#CLASSPATH="${CLASSPATH}:./target/test-classes/"
#CLASSPATH="${CLASSPATH}:../logback-core/target/classes"
-#CLASSPATH="${CLASSPATH}:../logback-examples/lib/slf4j-api-1.5.5.jar"
+#CLASSPATH="${CLASSPATH}:../logback-examples/lib/slf4j-api-1.5.10.jar"
if [ -f $1 ]
then
@@ -25,11 +32,7 @@ then
rm $1;
fi
-if [ $# -lt 3 ]
-then
- echo "Usage: testSafeMode.sh filename runLen stamp0 ... stampN"
- exit 1;
-fi
+
FILENAME=$1
LEN=$2
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/Checker.java b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/Checker.java
index ed69d5a..0ce1a4a 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/Checker.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/Checker.java
@@ -28,7 +28,7 @@ public class Checker {
System.err
.println("Usage: java "
+ Checker.class.getName()
- + " runLength filename stamp0 stamp1 ..\n"
+ + " runLength filename stamp0 stamp1 ..stampN\n"
+ " runLength (integer) the number of logs to generate perthread\n"
+ " filename (string) the filename where to write\n"
+ " stamp0 JVM instance stamp0\n"
@@ -57,13 +57,11 @@ public class Checker {
String regExp = "^" + stamp + " DEBUG - " + LoggingThread.msgLong
+ " (\\d+)$";
- // System.out.println(regExp);
Pattern p = Pattern.compile(regExp);
String line;
int expected = 0;
while ((line = br.readLine()) != null) {
- // System.out.println(line);
Matcher m = p.matcher(line);
if (m.matches()) {
String g = m.group(1);
@@ -86,7 +84,5 @@ public class Checker {
}
fr.close();
br.close();
-
}
-
-}
+}
\ No newline at end of file
diff --git a/logback-core/src/test/build.xml b/logback-core/src/test/build.xml
deleted file mode 100644
index ff824ec..0000000
--- a/logback-core/src/test/build.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<project name="lbcore" default="usage" basedir=".">
-
- <property file="build.properties" />
-
- <!-- The base directory relative to which most targets are built -->
- <property name="base" value="." />
-
- <property name="target" value="../../target" />
-
- <!-- The directory where source files are stored. -->
-
- <property name="project.source.home" value="../src/main/java/" />
- <property name="project.classes.home" value="${target}/classes/" />
-
- <property name="tests.source.home" value="./java/" />
-
- <!-- The stem where most LB core source code is located. -->
- <property name="stem" value="com/logback/core" />
-
- <!-- Destination for compiled files -->
- <property name="javac.dest" value="${target}/test-classes/" />
-
-
- <path id="tests.classpath">
- <pathelement location="${project.source.home}" />
- <pathelement location="${project.classes.home}" />
- <pathelement location="${tests.source.home}" />
- <pathelement location="${javac.dest}" />
- <pathelement location="./resources" />
- <fileset dir="../../lib/">
- <include name="*.jar" />
- </fileset>
- </path>
-
-
- <!-- ================================================================= -->
- <!-- TARGETS -->
- <!-- ================================================================= -->
-
-
-
- <!-- ================================================================= -->
- <!-- Default target -->
- <!-- ================================================================= -->
-
- <target name="usage">
- <echo>
-
- These are the targets supported by this ANT build scpript:
-
- build - compile all project files, if a certain library is missing,
- then the compilation of its dependents are skipped.
-
- all - run all available tests
- </echo>
- </target>
-
- <target name="prepare">
- <mkdir dir="${javac.dest}" />
- <mkdir dir="./output" />
- </target>
-
- <!-- ================================================================= -->
- <!-- Check if prerequisites are available -->
- <!-- ================================================================= -->
-
- <target name="check" depends="junitCheck">
- </target>
-
- <target name="junitCheck">
- <available classname="junit.framework.Test" property="junit-present">
- <classpath refid="tests.classpath" />
- </available>
-
- <fail unless="junit-present">
- Could not find junit classes. Is the file junit.jar missing?
- See the documentation for the junit task in the Apache Ant Manual.
- </fail>
- </target>
-
- <!-- Clean the parent project -->
- <!-- ================================================================= -->
- <target name="parentClean">
- <ant dir=".." target="clean" inheritRefs="true" />
- </target>
-
-
-
- <!-- ================================================================= -->
- <!-- Build the parent project -->
- <!-- ================================================================= -->
- <target name="parentBuild">
- <ant dir="../.." target="build" inheritRefs="false" />
- </target>
-
- <!-- ================================================================= -->
- <!-- Compile test cases and related source files. -->
- <!-- ================================================================= -->
- <target name="build" depends="prepare">
- <property name="haltonfailure" value="yes" />
- <javac srcdir="${tests.source.home}" destdir="${javac.dest}" excludes="${stem}/xynz/toto.java" deprecation="${deprecation}" debug="on">
- <classpath refid="tests.classpath" />
- </javac>
- </target>
-
- <!-- ================================================================= -->
- <!-- Remove all generated files such as compiled class files and test -->
- <!-- case output. -->
- <!-- ================================================================= -->
- <target name="clean">
- <delete dir="${javac.dest}/" />
- <delete dir="./output/" />
- </target>
-
- <target name="cleanOutputDir">
- <delete>
- <fileset dir="./output/" includes="**" />
- </delete>
- </target>
-
- <!-- ================================================================= -->
- <!-- Run all tests -->
- <!-- ================================================================= -->
- <target name="all" depends="build, AllUnit, Compress, Renaming,
- TimeBasedRolling,
- SkipInInterpreter" />
-
-
- <target name="AllUnit" depends="check, build, cleanOutputDir">
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath refid="tests.classpath" />
- <formatter type="plain" usefile="false" />
- <test name="ch.qos.logback.core.AllTest" />
- </junit>
- </target>
-
- <target name="Compress" depends="check, build, cleanOutputDir">
- <!-- The input files are erased as a result of compression. We -->
- <!-- need to "create" them afresh for each test. -->
- <copy file="input/compress1.copy" toFile="input/compress1.txt" />
- <copy file="input/compress2.copy" toFile="input/compress2.txt" />
- <copy file="input/compress3.copy" toFile="input/compress3.txt" />
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath refid="tests.classpath" />
- <formatter type="plain" usefile="false" />
- <test name="ch.qos.logback.core.rolling.helper.CompressTest" />
- </junit>
- </target>
-
- <target name="Renaming" depends="check, build, cleanOutputDir">
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath refid="tests.classpath" />
- <formatter type="plain" usefile="false" />
- <test name="ch.qos.logback.core.rolling.RenamingTest" />
- </junit>
- </target>
-
- <target name="TimeBasedRolling" depends="check, build, cleanOutputDir">
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath refid="tests.classpath" />
- <formatter type="plain" usefile="false" />
- <test name="ch.qos.logback.core.rolling.TimeBasedRollingTest" />
- </junit>
- </target>
-
- <target name="SkipInInterpreter" depends="check, build, cleanOutputDir">
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath refid="tests.classpath"/>
- <formatter type="plain" usefile="false" />
- <test name="ch.qos.logback.core.joran.SkippingInInterpreterTest" />
- </junit>
- </target>
-
-
-</project>
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
index b41294d..aa4a968 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
@@ -66,7 +66,7 @@ public class MultiThreadedRollingTest {
File outputDir = new File(outputDirStr);
outputDir.mkdirs();
- System.out.println("MultiThreadedRollingTest output dir [" + outputDirStr + "]");
+ System.out.println("Output dir [" + outputDirStr + "]");
scriptOS = openScript();
@@ -134,7 +134,7 @@ public class MultiThreadedRollingTest {
FileOutputStream fos = new FileOutputStream(outputDirStr + VERIFY_SH);
return fos;
}
-
+
@Test
public void multiThreadedTimedBased() throws InterruptedException,
IOException {
@@ -161,7 +161,7 @@ public class MultiThreadedRollingTest {
void verify() throws IOException, InterruptedException {
close(scriptOS);
// no point in this test if we don't have bash
- if(pathToBash == null) {
+ if (pathToBash == null) {
return;
}
ProcessBuilder pb = new ProcessBuilder();
@@ -170,9 +170,11 @@ public class MultiThreadedRollingTest {
Process process = pb.start();
process.waitFor();
int exitCode = process.exitValue();
-
+
assertEquals(SUCCESSFUL_EXIT_CODE, exitCode);
- System.out.println("External script based verification returned with exit code "+exitCode);
+ System.out
+ .println("External script based verification returned with exit code "
+ + exitCode);
}
@Test
@@ -287,7 +289,5 @@ public class MultiThreadedRollingTest {
}
}
}
-
}
-
}
diff --git a/logback-core/src/test/multiThreadSanityCheck.sh b/logback-core/src/test/multiThreadSanityCheck.sh
deleted file mode 100755
index a9237c3..0000000
--- a/logback-core/src/test/multiThreadSanityCheck.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-end[0]=116723
-end[1]=113160
-end[2]=100117
-end[3]=118897
-end[4]=111249
-end[5]=119030
-end[6]=106358
-end[7]=107372
-end[8]=113765
-end[9]=110767
-
-
-for t in $(seq 0 1 9)
-do
- echo doing $t
- grep "$t " aggregated |cut -d ' ' -f 2 > $t-def
- for i in $(seq 1 1 ${end[$t]}); do echo $i; done > $t-wit
- echo "diffing thread $t"
- diff -q $t-def $t-wit
- res=$?
- if [ $res != "0" ]; then
- echo "FAILED for $t"
- exit 1;
- fi
-done
-
-echo SUCCESS
\ No newline at end of file
-----------------------------------------------------------------------
Summary of changes:
logback-classic/src/test/allInOneSafeMode.sh | 23 ++-
.../ch/qos/logback/classic/multiJVM/Checker.java | 8 +-
logback-core/src/test/build.xml | 175 --------------------
.../core/rolling/MultiThreadedRollingTest.java | 14 +-
logback-core/src/test/multiThreadSanityCheck.sh | 29 ----
5 files changed, 22 insertions(+), 227 deletions(-)
delete mode 100644 logback-core/src/test/build.xml
delete mode 100755 logback-core/src/test/multiThreadSanityCheck.sh
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-24-g1727441
by git-noreply@pixie.qos.ch 12 Feb '10
by git-noreply@pixie.qos.ch 12 Feb '10
12 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 172744139d9062c5f0b3be00d2f31f01d988eafc (commit)
from 3511d5fac561b6e34b8b3e615a87567e7ee1f51b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=172744139d9062c5f0b3be00…
http://github.com/ceki/logback/commit/172744139d9062c5f0b3be00d2f31f01d988e…
commit 172744139d9062c5f0b3be00d2f31f01d988eafc
Author: Ceki Gulcu <ceki(a)gimmel.(none)>
Date: Fri Feb 12 18:03:03 2010 +0100
- Ongoing work on the test bed for LBCORE-109. Unfortunately, due to the
tight dependence on the OS, this test runs only on Linux. Moreover,
root priviledges are required...
diff --git a/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
index ddf695c..545489b 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
@@ -24,6 +24,9 @@ public class FileAppenderResilienceTest {
static String LONG_STR = " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ static String PATH_LOOPFS_SCRIPT = "/home/ceki/logback/logback-core/src/test/loopfs.sh";
+
+
enum LoopFSCommand {
setup, shake, teardown;
}
@@ -96,10 +99,12 @@ public class FileAppenderResilienceTest {
System.out.println("Done go");
}
+ // the loopfs script is tightly coupled with the host machine
+ // it needs to be Unix, with sudo privileges granted to the script
Process runLoopFSScript(LoopFSCommand cmd) throws IOException,
InterruptedException {
ProcessBuilder pb = new ProcessBuilder();
- pb.command("/usr/bin/sudo", "/home/ceki/loopfs.sh", cmd.toString());
+ pb.command("/usr/bin/sudo", PATH_LOOPFS_SCRIPT, cmd.toString());
Process process = pb.start();
return process;
}
diff --git a/logback-core/src/test/loopfs.sh b/logback-core/src/test/loopfs.sh
new file mode 100755
index 0000000..81638a5
--- /dev/null
+++ b/logback-core/src/test/loopfs.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+IMG=/tmp/toto.img
+MNT_POINT=/mnt/loop
+LOOP_DEV=/dev/loop0
+BIG_FILE=$MNT_POINT/big
+
+SETUP_LOG=/tmp/loopfs.log
+LOG=/tmp/loopfs.log
+
+CMD=$1
+
+# ===================================
+setup() {
+ echo setup
+ if [ -e $IMG ]; then
+ rm $IMG
+ fi
+ if [ -e $LOG ]; then rm $LOG; fi
+ if [ -e $SETUP_LOG ]; then rm $SETUP_LOG; fi
+
+ dd if=/dev/zero of=$IMG count=1000 >> $SETUP_LOG 2>&1
+ losetup $LOOP_DEV $IMG >> $SETUP_LOG 2>&1
+ mkfs.ext2 $LOOP_DEV >> $SETUP_LOG 2>&1
+ mount $LOOP_DEV $MNT_POINT >> $SETUP_LOG 2>&1
+ chown -R ceki:ceki $MNT_POINT
+}
+
+shake() {
+ echo "shake"
+ declare -i i=0
+ while [ $i -lt 5 ]
+ do
+ i+=1;
+ sleep 0.5
+ dd if=/dev/zero of=$BIG_FILE count=1000 >> $LOG 2>&1
+ echo "dd `date`" >> $LOG
+ sleep 0.5;
+ rm $BIG_FILE >> $LOG 2>&1
+ echo "rm $BIG_FILE" >> $LOG
+ done
+}
+
+teardown() {
+ echo teardown
+ umount $MNT_POINT
+ losetup -d $LOOP_DEV
+}
+
+# ===========================================
+
+case $CMD in
+ setup)
+ setup
+ ;;
+ shake)
+ shake
+ ;;
+ teardown)
+ teardown
+ ;;
+esac
-----------------------------------------------------------------------
Summary of changes:
.../logback/core/FileAppenderResilienceTest.java | 7 ++-
logback-core/src/test/loopfs.sh | 62 ++++++++++++++++++++
2 files changed, 68 insertions(+), 1 deletions(-)
create mode 100755 logback-core/src/test/loopfs.sh
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-23-g3511d5f
by git-noreply@pixie.qos.ch 12 Feb '10
by git-noreply@pixie.qos.ch 12 Feb '10
12 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 3511d5fac561b6e34b8b3e615a87567e7ee1f51b (commit)
from 183395777e6e189e69198f24567d7d214d163f4e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=3511d5fac561b6e34b8b3e61…
http://github.com/ceki/logback/commit/3511d5fac561b6e34b8b3e615a87567e7ee1f…
commit 3511d5fac561b6e34b8b3e615a87567e7ee1f51b
Author: Ceki Gulcu <ceki(a)gimmel.(none)>
Date: Fri Feb 12 17:51:43 2010 +0100
- Preparing test bed for LBCORE-109. Unfortunately, due to the
tight dependence on the OS, this test runs only on
Linux. Moreover, root priviledges are required...
If anyone knows how to simulate a file system space overflow is
encouraged to share their knowledge.
diff --git a/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
new file mode 100644
index 0000000..ddf695c
--- /dev/null
+++ b/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
@@ -0,0 +1,141 @@
+package ch.qos.logback.core;
+
+import static org.junit.Assert.*;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.core.layout.EchoLayout;
+import ch.qos.logback.core.testUtil.RandomUtil;
+import ch.qos.logback.core.util.StatusPrinter;
+
+public class FileAppenderResilienceTest {
+
+ static String MOUNT_POINT = "/mnt/loop/";
+
+ static String LONG_STR = " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+
+ enum LoopFSCommand {
+ setup, shake, teardown;
+ }
+
+ Context context = new ContextBase();
+ int diff = RandomUtil.getPositiveInt();
+ String outputDirStr = MOUNT_POINT + "resilience-" + diff + "/";
+ String logfileStr = outputDirStr + "output.log";
+
+ FileAppender<Object> fa = new FileAppender<Object>();
+
+ @Before
+ public void setUp() throws IOException, InterruptedException {
+ Process p = runLoopFSScript(LoopFSCommand.setup);
+ p.waitFor();
+
+ dump("/tmp/loopfs.log");
+
+ fa.setContext(context);
+ File outputDir = new File(outputDirStr);
+ outputDir.mkdirs();
+ System.out.println("FileAppenderResilienceTest output dir [" + outputDirStr
+ + "]");
+
+ fa.setName("FILE");
+ fa.setLayout(new EchoLayout<Object>());
+ fa.setFile(logfileStr);
+ fa.start();
+ }
+
+ void dump(String file) throws IOException {
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(file);
+ int r;
+ while ((r = fis.read()) != -1) {
+ char c = (char) r;
+ System.out.print(c);
+ }
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
+ }
+
+
+ @After
+ public void tearDown() throws IOException, InterruptedException {
+ StatusPrinter.print(context);
+ fa.stop();
+ Process p = runLoopFSScript(LoopFSCommand.teardown);
+ p.waitFor();
+ System.out.println("Tearing down");
+ }
+
+ static int TOTAL_DURATION = 5000;
+ static int NUM_STEPS = 500;
+ static int DELAY = TOTAL_DURATION / NUM_STEPS;
+
+ @Test
+ public void go() throws IOException, InterruptedException {
+ Process p = runLoopFSScript(LoopFSCommand.shake);
+ for (int i = 0; i < NUM_STEPS; i++) {
+ fa.append(String.valueOf(i) + LONG_STR);
+ Thread.sleep(DELAY);
+ }
+ p.waitFor();
+ verify(logfileStr);
+ System.out.println("Done go");
+ }
+
+ Process runLoopFSScript(LoopFSCommand cmd) throws IOException,
+ InterruptedException {
+ ProcessBuilder pb = new ProcessBuilder();
+ pb.command("/usr/bin/sudo", "/home/ceki/loopfs.sh", cmd.toString());
+ Process process = pb.start();
+ return process;
+ }
+
+ void verify(String logfile) throws NumberFormatException, IOException {
+ FileReader fr = new FileReader(logfile);
+ BufferedReader br = new BufferedReader(fr);
+ String regExp = "^(\\d{1,3}) x*$";
+ Pattern p = Pattern.compile(regExp);
+ String line;
+
+ int totalLines = 0;
+ int oldNum = -1;
+ int gaps = 0;
+ while ((line = br.readLine()) != null) {
+ Matcher m = p.matcher(line);
+ if (m.matches()) {
+ totalLines++;
+ String g = m.group(1);
+ int num = Integer.parseInt(g);
+ if(num != oldNum+1) {
+ gaps++;
+ }
+ oldNum = num;
+ }
+ }
+ fr.close();
+ br.close();
+
+ // at least 40% of the logs should have been written
+ int lowerLimit = (int) (NUM_STEPS*0.4);
+ assertTrue("totalLines="+totalLines+" less than "+lowerLimit, totalLines > lowerLimit);
+
+ // we want some gaps which indicate recuperation
+ assertTrue("gaps="+gaps+" less than 3", gaps > 3);
+
+ }
+
+}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
index 4e33647..b41294d 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
@@ -66,7 +66,7 @@ public class MultiThreadedRollingTest {
File outputDir = new File(outputDirStr);
outputDir.mkdirs();
- System.out.println("Output dir [" + outputDirStr + "]");
+ System.out.println("MultiThreadedRollingTest output dir [" + outputDirStr + "]");
scriptOS = openScript();
-----------------------------------------------------------------------
Summary of changes:
.../logback/core/FileAppenderResilienceTest.java | 141 ++++++++++++++++++++
.../core/rolling/MultiThreadedRollingTest.java | 2 +-
2 files changed, 142 insertions(+), 1 deletions(-)
create mode 100644 logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-22-g1833957
by git-noreply@pixie.qos.ch 11 Feb '10
by git-noreply@pixie.qos.ch 11 Feb '10
11 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 183395777e6e189e69198f24567d7d214d163f4e (commit)
from 912a925ea5d92c45a8b6bafe7f2691fb9be155d7 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=183395777e6e189e69198f24…
http://github.com/ceki/logback/commit/183395777e6e189e69198f24567d7d214d163…
commit 183395777e6e189e69198f24567d7d214d163f4e
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Feb 11 20:24:57 2010 +0100
- increase induced delay so that
MultiThreadedRollingTest.multiThreadedSizeBased test passes on a fast machine
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
index bac049b..4e33647 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
@@ -279,7 +279,7 @@ public class MultiThreadedRollingTest {
while (!isDone()) {
counter++;
rfa.doAppend(id + " " + counter);
- if ((counter % 100 == 0) && withInducedDelay) {
+ if ((counter % 64 == 0) && withInducedDelay) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
-----------------------------------------------------------------------
Summary of changes:
.../core/rolling/MultiThreadedRollingTest.java | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0
[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, master, updated. v0.9.18-21-g912a925
by git-noreply@pixie.qos.ch 11 Feb '10
by git-noreply@pixie.qos.ch 11 Feb '10
11 Feb '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".
The branch, master has been updated
via 912a925ea5d92c45a8b6bafe7f2691fb9be155d7 (commit)
from aae40ddb853fa6535d0bf181d9b61435e8c1f984 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=912a925ea5d92c45a8b6bafe…
http://github.com/ceki/logback/commit/912a925ea5d92c45a8b6bafe7f2691fb9be15…
commit 912a925ea5d92c45a8b6bafe7f2691fb9be155d7
Author: Ceki Gulcu <ceki(a)gimmel.(none)>
Date: Thu Feb 11 19:48:18 2010 +0100
- have MultiThreadedRollingTest run consistently on a fast linux machine
diff --git a/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java b/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java
index 6c9b56e..f3f28b6 100644
--- a/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java
+++ b/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java
@@ -15,7 +15,6 @@ package ch.qos.logback.access.db;
import static org.junit.Assert.assertEquals;
-import java.net.InetAddress;
import java.util.Random;
import org.junit.After;
@@ -37,7 +36,7 @@ import ch.qos.logback.core.util.StatusPrinter;
public class DBAppenderIntegrationTest {
- static String LOCAL_HOST_NAME;
+ static String LOCAL_HOST_NAME = Env.getLocalHostName();
static String[] CONFORMING_HOST_LIST = new String[] { "Orion" };
int diff = new Random(System.nanoTime()).nextInt(10000);
@@ -45,8 +44,6 @@ public class DBAppenderIntegrationTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
- InetAddress localhostIA = InetAddress.getLocalHost();
- LOCAL_HOST_NAME = localhostIA.getHostName();
}
@AfterClass
@@ -85,12 +82,7 @@ public class DBAppenderIntegrationTest {
if(!Env.isJDK6OrHigher()) {
return false;
}
- for (String conformingHost : CONFORMING_HOST_LIST) {
- if (conformingHost.equalsIgnoreCase(LOCAL_HOST_NAME)) {
- return true;
- }
- }
- return false;
+ return Env.isLocalHostNameInList(CONFORMING_HOST_LIST);
}
@Test
diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
index e6ecc44..bac049b 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java
@@ -26,7 +26,6 @@ import java.io.OutputStream;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import ch.qos.logback.core.Context;
@@ -36,6 +35,7 @@ import ch.qos.logback.core.contention.MultiThreadedHarness;
import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
import ch.qos.logback.core.layout.EchoLayout;
import ch.qos.logback.core.status.StatusChecker;
+import ch.qos.logback.core.testUtil.Env;
import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.CoreTestConstants;
import ch.qos.logback.core.util.StatusPrinter;
@@ -50,13 +50,14 @@ public class MultiThreadedRollingTest {
Context context = new ContextBase();
static String VERIFY_SH = "verify.sh";
-
+
int diff = RandomUtil.getPositiveInt();
String outputDirStr = CoreTestConstants.OUTPUT_DIR_PREFIX + "multi-" + diff
+ "/";
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
+ String pathToBash = Env.getPathToBash();
OutputStream scriptOS;
@Before
@@ -65,8 +66,8 @@ public class MultiThreadedRollingTest {
File outputDir = new File(outputDirStr);
outputDir.mkdirs();
- System.out.println("Output dir ["+outputDirStr+"]");
-
+ System.out.println("Output dir [" + outputDirStr + "]");
+
scriptOS = openScript();
rfa.setName("rolling");
@@ -113,7 +114,7 @@ public class MultiThreadedRollingTest {
FixedWindowRollingPolicy fwrp = new FixedWindowRollingPolicy();
fwrp.setContext(context);
fwrp.setFileNamePattern(outputDirStr + "test-%i.log");
- fwrp.setMaxIndex(10);
+ fwrp.setMaxIndex(20);
fwrp.setMinIndex(0);
fwrp.setParent(rfa);
fwrp.start();
@@ -121,24 +122,24 @@ public class MultiThreadedRollingTest {
rfa.start();
}
- RunnableWithCounterAndDone[] buildRunnableArray() {
+ RunnableWithCounterAndDone[] buildRunnableArray(boolean withDelay) {
RunnableWithCounterAndDone[] runnableArray = new RunnableWithCounterAndDone[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
- runnableArray[i] = new RFARunnable(i, rfa);
+ runnableArray[i] = new RFARunnable(i, rfa, withDelay);
}
return runnableArray;
}
OutputStream openScript() throws IOException {
- FileOutputStream fos = new FileOutputStream(outputDirStr +VERIFY_SH);
+ FileOutputStream fos = new FileOutputStream(outputDirStr + VERIFY_SH);
return fos;
}
-
+
@Test
public void multiThreadedTimedBased() throws InterruptedException,
IOException {
setUpTimeBasedTriggeringPolicy(rfa);
- executeHarness();
+ executeHarness(TOTAL_DURATION, false);
printScriptForTimeBased();
verify();
}
@@ -147,30 +148,40 @@ public class MultiThreadedRollingTest {
File outputDir = new File(outputDirStr);
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
- if(name.matches("test-\\d{1,2}.log")) {
+ if (name.matches("test-\\d{1,2}.log")) {
return true;
- }
+ }
return false;
}
};
File[] files = outputDir.listFiles(filter);
return files.length;
}
-
+
void verify() throws IOException, InterruptedException {
close(scriptOS);
+ // no point in this test if we don't have bash
+ if(pathToBash == null) {
+ return;
+ }
ProcessBuilder pb = new ProcessBuilder();
- pb.command(CoreTestConstants.BASH_PATH, VERIFY_SH);
+ pb.command(pathToBash, VERIFY_SH);
pb.directory(new File(outputDirStr));
Process process = pb.start();
process.waitFor();
- assertEquals(SUCCESSFUL_EXIT_CODE, process.exitValue());
+ int exitCode = process.exitValue();
+
+ assertEquals(SUCCESSFUL_EXIT_CODE, exitCode);
+ System.out.println("External script based verification returned with exit code "+exitCode);
}
@Test
public void multiThreadedSizeBased() throws InterruptedException, IOException {
setUpSizeBasedTriggeringPolicy(rfa);
- executeHarness();
+ // on a fast machine with a fast hard disk, if the tests runs for too
+ // long the MAX_WINDOW_SIZE is reached, resulting in data loss which
+ // we cannot test for.
+ executeHarness(TOTAL_DURATION, true);
int numFiles = testFileCount();
printScriptForSizeBased(numFiles);
verify();
@@ -195,11 +206,11 @@ public class MultiThreadedRollingTest {
out(" res=$?");
out(" if [ $res != \"0\" ]; then");
out(" echo \"FAILED for $t\"");
- out(" exit "+FAILURE_EXIT_CODE);
+ out(" exit " + FAILURE_EXIT_CODE);
out(" fi");
out("done");
out("");
- out("exit "+SUCCESSFUL_EXIT_CODE);
+ out("exit " + SUCCESSFUL_EXIT_CODE);
}
private void printScriptForTimeBased() throws IOException {
@@ -222,7 +233,8 @@ public class MultiThreadedRollingTest {
}
out("");
out("rm aggregated");
- out("for i in $(seq " + numfiles+" -1 0); do cat test-$i.log >> aggregated; done");
+ out("for i in $(seq " + (numfiles - 1)
+ + " -1 0); do cat test-$i.log >> aggregated; done");
out("cat output.log >> aggregated");
out("");
printCommonScriptCore();
@@ -233,10 +245,11 @@ public class MultiThreadedRollingTest {
scriptOS.write("\n".getBytes());
}
- private void executeHarness() throws InterruptedException {
+ private void executeHarness(int duration, boolean withDelay)
+ throws InterruptedException {
MultiThreadedHarness multiThreadedHarness = new MultiThreadedHarness(
- TOTAL_DURATION);
- this.runnableArray = buildRunnableArray();
+ duration);
+ this.runnableArray = buildRunnableArray(withDelay);
multiThreadedHarness.execute(runnableArray);
StatusChecker checker = new StatusChecker(context.getStatusManager());
@@ -253,16 +266,25 @@ public class MultiThreadedRollingTest {
static class RFARunnable extends RunnableWithCounterAndDone {
RollingFileAppender<Object> rfa;
int id;
+ boolean withInducedDelay;
- RFARunnable(int id, RollingFileAppender<Object> rfa) {
+ RFARunnable(int id, RollingFileAppender<Object> rfa,
+ boolean withInducedDelay) {
this.id = id;
this.rfa = rfa;
+ this.withInducedDelay = withInducedDelay;
}
public void run() {
while (!isDone()) {
counter++;
rfa.doAppend(id + " " + counter);
+ if ((counter % 100 == 0) && withInducedDelay) {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ }
+ }
}
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/testUtil/Env.java b/logback-core/src/test/java/ch/qos/logback/core/testUtil/Env.java
index bc7f55e..e645064 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/testUtil/Env.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/testUtil/Env.java
@@ -13,6 +13,11 @@
*/
package ch.qos.logback.core.testUtil;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import ch.qos.logback.core.util.CoreTestConstants;
+
public class Env {
static public boolean isWindows() {
@@ -22,7 +27,7 @@ public class Env {
static public boolean isMac() {
return System.getProperty("os.name").indexOf("Mac") != -1;
}
-
+
static public boolean isLinux() {
return System.getProperty("os.name").indexOf("Linux") != -1;
}
@@ -39,4 +44,37 @@ public class Env {
}
}
+ static public String getLocalHostName() {
+ InetAddress localhostIA;
+ try {
+ localhostIA = InetAddress.getLocalHost();
+ return localhostIA.getHostName();
+ } catch (UnknownHostException e) {
+ return null;
+ }
+ }
+
+ static public boolean isLocalHostNameInList(String[] hostList) {
+ String localHostName = getLocalHostName();
+ if (localHostName == null) {
+ return false;
+ }
+ for (String host : hostList) {
+ if (host.equalsIgnoreCase(localHostName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ public static String getPathToBash() {
+ if(Env.isLinux()) {
+ return CoreTestConstants.BASH_PATH_ON_LINUX;
+ }
+ if(Env.isLocalHostNameInList(new String[] {"hetz"})) {
+ return CoreTestConstants.BASH_PATH_ON_CYGWIN;
+ }
+ return null;
+ }
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/util/CoreTestConstants.java b/logback-core/src/test/java/ch/qos/logback/core/util/CoreTestConstants.java
index 55f0761..29c180c 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/util/CoreTestConstants.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/util/CoreTestConstants.java
@@ -23,5 +23,6 @@ public class CoreTestConstants {
public static final int SUCCESSFUL_EXIT_CODE = 8;
public static final int FAILURE_EXIT_CODE = 1;
- public static final String BASH_PATH = "c:/cygwin/bin/bash";
+ public static final String BASH_PATH_ON_CYGWIN = "c:/cygwin/bin/bash";
+ public static final String BASH_PATH_ON_LINUX = "bash";
}
-----------------------------------------------------------------------
Summary of changes:
.../access/db/DBAppenderIntegrationTest.java | 12 +---
.../core/rolling/MultiThreadedRollingTest.java | 68 +++++++++++++-------
.../java/ch/qos/logback/core/testUtil/Env.java | 40 +++++++++++-
.../qos/logback/core/util/CoreTestConstants.java | 3 +-
4 files changed, 88 insertions(+), 35 deletions(-)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
1
0