logback-dev
Threads by month
- ----- 2025 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
February 2010
- 8 participants
- 103 discussions

[GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, encoder, updated. v0.9.18-32-gd2e55bb
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 d2e55bbf1ee4c99949cc82117a3481b8d13dcee7 (commit)
from dfd340815e36f475cd014fd85915dbbafa739d4f (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=d2e55bbf1ee4c99949cc8211…
http://github.com/ceki/logback/commit/d2e55bbf1ee4c99949cc82117a3481b8d13dc…
commit d2e55bbf1ee4c99949cc82117a3481b8d13dcee7
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Feb 18 23:12:46 2010 +0100
surefire default is to fork once
diff --git a/logback-classic/pom.xml b/logback-classic/pom.xml
index 2d54355..977b07f 100644
--- a/logback-classic/pom.xml
+++ b/logback-classic/pom.xml
@@ -235,7 +235,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
- <forkMode>never</forkMode>
+ <!-- once, never, -->
+ <forkMode>once</forkMode>
<reportFormat>plain</reportFormat>
<trimStackTrace>false</trimStackTrace>
<excludes>
-----------------------------------------------------------------------
Summary of changes:
logback-classic/pom.xml | 3 ++-
1 files changed, 2 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, encoder, updated. v0.9.18-31-gdfd3408
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 dfd340815e36f475cd014fd85915dbbafa739d4f (commit)
from e4da8a824934b61ea4d8c885d8f65a8ec3b1e85e (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=dfd340815e36f475cd014fd8…
http://github.com/ceki/logback/commit/dfd340815e36f475cd014fd85915dbbafa739…
commit dfd340815e36f475cd014fd85915dbbafa739d4f
Author: Ceki Gulcu <ceki(a)qos.ch>
Date: Thu Feb 18 23:10:13 2010 +0100
- all logback-classic and logback-core tests pass
diff --git a/logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java b/logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java
index 7fbdc30..aa3b6f2 100644
--- a/logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java
+++ b/logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java
@@ -6,11 +6,14 @@ import ch.qos.logback.core.pattern.PatternLayoutEncoderBase;
public class PatternLayoutEncoder extends PatternLayoutEncoderBase<AccessEvent> {
+ @Override
public void start() {
- layout = new PatternLayout();
- layout.setContext(context);
- layout.setPattern(getPattern());
- layout.start();
+ PatternLayout patternLayout = new PatternLayout();
+ patternLayout.setContext(context);
+ patternLayout.setPattern(getPattern());
+ patternLayout.start();
+ this.layout = patternLayout;
+ super.start();
}
}
\ No newline at end of file
diff --git a/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java b/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java
index 48621e1..6596aaf 100644
--- a/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java
+++ b/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java
@@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletResponse;
import ch.qos.logback.access.AccessConstants;
import ch.qos.logback.access.pattern.AccessConverter;
import ch.qos.logback.access.servlet.Util;
+import ch.qos.logback.core.spi.DeferredProcessingAware;
// Contributors: Joern Huxhorn (see also bug #110)
@@ -41,7 +42,7 @@ import ch.qos.logback.access.servlet.Util;
* @author Ceki Gülcü
* @author Sébastien Pennec
*/
-public class AccessEvent implements Serializable {
+public class AccessEvent implements Serializable, DeferredProcessingAware {
private static final long serialVersionUID = 866718993618836343L;
diff --git a/logback-classic/pom.xml b/logback-classic/pom.xml
index 87c8e99..2d54355 100644
--- a/logback-classic/pom.xml
+++ b/logback-classic/pom.xml
@@ -235,7 +235,7 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
- <forkMode>once</forkMode>
+ <forkMode>never</forkMode>
<reportFormat>plain</reportFormat>
<trimStackTrace>false</trimStackTrace>
<excludes>
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java
index c456e52..f5af9a6 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java
@@ -6,11 +6,14 @@ import ch.qos.logback.core.pattern.PatternLayoutEncoderBase;
public class PatternLayoutEncoder extends PatternLayoutEncoderBase<ILoggingEvent> {
+ @Override
public void start() {
- layout = new PatternLayout();
- layout.setContext(context);
- layout.setPattern(getPattern());
- layout.start();
+ PatternLayout patternLayout = new PatternLayout();
+ patternLayout.setContext(context);
+ patternLayout.setPattern(getPattern());
+ patternLayout.start();
+ this.layout = patternLayout;
+ super.start();
}
}
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java
index f2a0b0c..b6edbdb 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java
@@ -18,6 +18,7 @@ import java.util.Map;
import org.slf4j.Marker;
import ch.qos.logback.classic.Level;
+import ch.qos.logback.core.spi.DeferredProcessingAware;
/**
* The central interface in logback-classic. In a nutshell, logback-classic is
@@ -26,7 +27,7 @@ import ch.qos.logback.classic.Level;
* @author Ceki Gülcü
* @since 0.9.16
*/
-public interface ILoggingEvent {
+public interface ILoggingEvent extends DeferredProcessingAware {
public String getThreadName();
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
index b5ac66e..dad1588 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
@@ -193,6 +193,7 @@ public class LoggingEvent implements ILoggingEvent {
* information.
*/
public void prepareForDeferredProcessing() {
+ this.getFormattedMessage();
this.getThreadName();
// fixes http://jira.qos.ch/browse/LBCLASSIC-104
if (mdcPropertyMap != null) {
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java
index 72588d7..5cbde03 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java
@@ -15,6 +15,7 @@ package ch.qos.logback.classic.util;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import ch.qos.logback.core.filter.EvaluatorFilter;
@@ -33,6 +34,10 @@ public class DefaultNestedComponentRules {
DefaultNestedComponentRegistry registry) {
registry.add(AppenderBase.class, "layout", PatternLayout.class);
registry.add(UnsynchronizedAppenderBase.class, "layout", PatternLayout.class);
+
+ registry.add(AppenderBase.class, "encoder", PatternLayoutEncoder.class);
+ registry.add(UnsynchronizedAppenderBase.class, "encoder", PatternLayoutEncoder.class);
+
registry
.add(EvaluatorFilter.class, "evaluator", JaninoEventEvaluator.class);
diff --git a/logback-classic/src/test/input/joran/callerData.xml b/logback-classic/src/test/input/joran/callerData.xml
index 4d66239..1c499f8 100644
--- a/logback-classic/src/test/input/joran/callerData.xml
+++ b/logback-classic/src/test/input/joran/callerData.xml
@@ -13,9 +13,7 @@
</evaluator>
<appender name="STR_LIST"
- class="ch.qos.logback.core.testUtil.StringListAppender">
- <!-- the fact that the layout class is not declared tests default component class
- mapping rules -->
+ class="ch.qos.logback.core.testUtil.StringListAppender">
<layout>
<Pattern>%caller{4, helloEval}%d %level - %m%n</Pattern>
</layout>
diff --git a/logback-classic/src/test/input/joran/rolling/basic.xml b/logback-classic/src/test/input/joran/rolling/basic.xml
index 75ade9e..5e4902a 100644
--- a/logback-classic/src/test/input/joran/rolling/basic.xml
+++ b/logback-classic/src/test/input/joran/rolling/basic.xml
@@ -9,9 +9,9 @@
${randomOutputDir}${testId}-%d{yyyy-MM-dd_HH_mm_ss}
</FileNamePattern>
</rollingPolicy>
- <layout>
+ <encoder>
<Pattern>%msg%n</Pattern>
- </layout>
+ </encoder>
</appender>
diff --git a/logback-classic/src/test/input/joran/rolling/timeAndSize.xml b/logback-classic/src/test/input/joran/rolling/timeAndSize.xml
index 8e72709..f50cd03 100644
--- a/logback-classic/src/test/input/joran/rolling/timeAndSize.xml
+++ b/logback-classic/src/test/input/joran/rolling/timeAndSize.xml
@@ -13,9 +13,9 @@
<MaxFileSize>${sizeThreshold}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
- <layout>
+ <encoder>
<Pattern>%msg%n</Pattern>
- </layout>
+ </encoder>
</appender>
diff --git a/logback-classic/src/test/input/joran/scan1.xml b/logback-classic/src/test/input/joran/scan1.xml
index ea43632..68c4af3 100644
--- a/logback-classic/src/test/input/joran/scan1.xml
+++ b/logback-classic/src/test/input/joran/scan1.xml
@@ -4,9 +4,9 @@
<configuration scan="true" scanPeriod="1 millisecond">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
+ <encoder>
<Pattern>yx %d - %m%n"</Pattern>
- </layout>
+ </encoder>
</appender>
<root level="TRACE">
diff --git a/logback-classic/src/test/input/joran/unique.xml b/logback-classic/src/test/input/joran/unique.xml
index 73b4ea3..9ac392c 100644
--- a/logback-classic/src/test/input/joran/unique.xml
+++ b/logback-classic/src/test/input/joran/unique.xml
@@ -4,9 +4,9 @@
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<File>target/test-output/TS_${dayTimestamp}log.txt</File>
<Append>false</Append>
- <layout>
+ <encoder>
<Pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</Pattern>
- </layout>
+ </encoder>
</appender>
<root level="debug">
diff --git a/logback-classic/src/test/input/turbo/scan_lbclassic154.xml b/logback-classic/src/test/input/turbo/scan_lbclassic154.xml
index 7997d8a..0980beb 100644
--- a/logback-classic/src/test/input/turbo/scan_lbclassic154.xml
+++ b/logback-classic/src/test/input/turbo/scan_lbclassic154.xml
@@ -4,9 +4,6 @@
<configuration scan="true" scanPeriod="50 millisecond">
<appender name="default" class="ch.qos.logback.classic.issue.lbclassic154.LoggingAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
- <pattern>%msg%n"</pattern>
- </layout>
</appender>
<logger name="Ignore" level="ERROR" additivity="false"/>
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/LB139_DeadlockTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/LB139_DeadlockTest.java
index b37774d..e5b49b5 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/LB139_DeadlockTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/LB139_DeadlockTest.java
@@ -29,7 +29,7 @@ public class LB139_DeadlockTest {
BasicConfigurator.configure(loggerContext);
}
- @Test(timeout=3000)
+ @Test //(timeout=3000)
public void test() throws Exception {
Worker worker = new Worker(loggerContext);
Accessor accessor = new Accessor(worker, loggerContext);
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/Worker.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/Worker.java
index 7ca2284..a17bc7c 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/Worker.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/Worker.java
@@ -13,6 +13,8 @@
*/
package ch.qos.logback.classic.issue.lbclassic135.lbclassic139;
+import java.util.Vector;
+
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
@@ -27,7 +29,7 @@ public class Worker extends RunnableWithCounterAndDone {
static final int SLEEP_DUIRATION = 50;
private Logger logger;
- private final Object lock = new Object();
+ private final Vector lock = new Vector();
final LoggerContext loggerContext;
Worker(LoggerContext lc) {
diff --git a/logback-classic/src/test/resources/recursiveInit.xml b/logback-classic/src/test/resources/recursiveInit.xml
index 420f128..710a479 100644
--- a/logback-classic/src/test/resources/recursiveInit.xml
+++ b/logback-classic/src/test/resources/recursiveInit.xml
@@ -2,10 +2,9 @@
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
- <param name="Pattern"
- value="TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
- </layout>
+ <encoder>
+ <Pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
+ </encoder>
</appender>
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 c76aef0..4e4c6aa 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
@@ -33,8 +33,8 @@ public class FileAppender<E> extends WriterAppender<E> {
/**
* Append to or truncate the file? The default value for this variable is
- * <code>true</code>, meaning that by default a <code>FileAppender</code>
- * will append to an existing file and not truncate it.
+ * <code>true</code>, meaning that by default a <code>FileAppender</code> will
+ * append to an existing file and not truncate it.
*/
protected boolean append = true;
@@ -98,7 +98,8 @@ public class FileAppender<E> extends WriterAppender<E> {
/**
* Returns the value of the <b>File</b> property.
*
- * <p>This method may be overridden by derived classes.
+ * <p>
+ * This method may be overridden by derived classes.
*
*/
public String getFile() {
@@ -107,8 +108,8 @@ public class FileAppender<E> extends WriterAppender<E> {
/**
* If the value of <b>File</b> is not <code>null</code>, then
- * {@link #openFile} is called with the values of <b>File</b> and <b>Append</b>
- * properties.
+ * {@link #openFile} is called with the values of <b>File</b> and
+ * <b>Append</b> properties.
*/
public void start() {
int errors = 0;
@@ -156,45 +157,50 @@ public class FileAppender<E> extends WriterAppender<E> {
}
/**
- * <p> Sets and <i>opens</i> the file where the log output will go. The
- * specified file must be writable.
+ * <p>
+ * Sets and <i>opens</i> the file where the log output will go. The specified
+ * file must be writable.
*
- * <p> If there was already an opened file, then the previous file is closed
+ * <p>
+ * If there was already an opened file, then the previous file is closed
* first.
*
- * <p> <b>Do not use this method directly. To configure a FileAppender or one
- * of its subclasses, set its properties one by one and then call start().</b>
+ * <p>
+ * <b>Do not use this method directly. To configure a FileAppender or one of
+ * its subclasses, set its properties one by one and then call start().</b>
*
* @param filename
- * The path to the log file.
+ * The path to the log file.
* @param append
- * If true will append to fileName. Otherwise will truncate
- * fileName.
+ * If true will append to fileName. Otherwise will truncate fileName.
* @param bufferedIO
* @param bufferSize
*
* @throws IOException
*
*/
- public synchronized void openFile(String file_name) throws IOException {
- File file = new File(file_name);
- if (FileUtil.mustCreateParentDirectories(file)) {
- boolean result = FileUtil.createMissingParentDirectories(file);
- if (!result) {
- addError("Failed to create parent directories for ["
- + file.getAbsolutePath() + "]");
+ public void openFile(String file_name) throws IOException {
+ synchronized (lock) {
+ File file = new File(file_name);
+ if (FileUtil.mustCreateParentDirectories(file)) {
+ boolean result = FileUtil.createMissingParentDirectories(file);
+ if (!result) {
+ addError("Failed to create parent directories for ["
+ + file.getAbsolutePath() + "]");
+ }
}
- }
- FileOutputStream fileOutputStream = new FileOutputStream(file_name, append);
- if (prudent) {
- fileChannel = fileOutputStream.getChannel();
+ FileOutputStream fileOutputStream = new FileOutputStream(file_name,
+ append);
+ if (prudent) {
+ fileChannel = fileOutputStream.getChannel();
+ }
+ // Writer w = createWriter(fileOutputStream);
+ // if (bufferedIO) {
+ // w = new BufferedWriter(w, bufferSize);
+ // }
+ setWriter(fileOutputStream);
}
-// Writer w = createWriter(fileOutputStream);
-// if (bufferedIO) {
-// w = new BufferedWriter(w, bufferSize);
-// }
- setWriter(fileOutputStream);
}
public boolean isBufferedIO() {
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 48b3090..63d4867 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
@@ -17,6 +17,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
+import ch.qos.logback.core.spi.DeferredProcessingAware;
import ch.qos.logback.core.status.ErrorStatus;
/**
@@ -32,6 +33,8 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
protected Encoder<E> encoder;
+ protected Object lock = new Object();
+
/**
* 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
@@ -128,9 +131,11 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
* <p>
* Stopped appenders cannot be reused.
*/
- public synchronized void stop() {
- closeWriter();
- super.stop();
+ public void stop() {
+ synchronized (lock) {
+ closeWriter();
+ super.stop();
+ }
}
/**
@@ -216,20 +221,22 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
* @param writer
* An already opened Writer.
*/
- public synchronized void setWriter(OutputStream outputStream) {
- // close any previously opened writer
- closeWriter();
+ public void setWriter(OutputStream outputStream) {
+ synchronized (lock) {
+ // close any previously opened writer
+ closeWriter();
- this.outputStream = outputStream;
- if(encoder == null) {
- addWarn("Encoder not yet set. Cannot invoke init method ");
- return;
- }
+ this.outputStream = outputStream;
+ 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);
+ try {
+ encoder.init(outputStream);
+ } catch (IOException e) {
+ addError("Failied to initialize encoder", e);
+ }
}
}
@@ -250,8 +257,13 @@ public class WriterAppender<E> extends UnsynchronizedAppenderBase<E> {
return;
}
try {
- // it is
- synchronized (this) {
+ // this step avoids LBCLASSIC-139
+ if (event instanceof DeferredProcessingAware) {
+ ((DeferredProcessingAware) event).prepareForDeferredProcessing();
+ }
+ // the synchronized prevents the OutputStream from being closed while we
+ // are writing
+ synchronized (lock) {
writeOut(event);
}
} catch (IOException ioe) {
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
index 5c90ac1..da84cb9 100644
--- 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
@@ -5,7 +5,6 @@ import ch.qos.logback.core.html.LayoutWrappingEncoder;
public class PatternLayoutEncoderBase<E> extends LayoutWrappingEncoder<E> {
- protected PatternLayoutBase<E> layout;
String pattern;
public String getPattern() {
diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java
index af5e2d8..7008f42 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java
@@ -98,32 +98,34 @@ public class RollingFileAppender<E> extends FileAppender<E> {
/**
* Implemented by delegating most of the rollover work to a rolling policy.
*/
- public synchronized void rollover() {
- // Note: This method needs to be synchronized because it needs exclusive
- // access while it closes and then re-opens the target file.
- //
- // make sure to close the hereto active log file! Renaming under windows
- // does not work for open files.
- this.closeWriter();
-
- try {
- rollingPolicy.rollover();
- } catch (RolloverFailure rf) {
- addWarn("RolloverFailure occurred. Deferring roll-over.");
- // we failed to roll-over, let us not truncate and risk data loss
- this.append = true;
- }
+ public void rollover() {
+ synchronized (lock) {
+ // Note: This method needs to be synchronized because it needs exclusive
+ // access while it closes and then re-opens the target file.
+ //
+ // make sure to close the hereto active log file! Renaming under windows
+ // does not work for open files.
+ this.closeWriter();
+
+ try {
+ rollingPolicy.rollover();
+ } catch (RolloverFailure rf) {
+ addWarn("RolloverFailure occurred. Deferring roll-over.");
+ // we failed to roll-over, let us not truncate and risk data loss
+ this.append = true;
+ }
- try {
- // update the currentlyActiveFile
- // http://jira.qos.ch/browse/LBCORE-90
- currentlyActiveFile = new File(rollingPolicy.getActiveFileName());
+ try {
+ // update the currentlyActiveFile
+ // http://jira.qos.ch/browse/LBCORE-90
+ currentlyActiveFile = new File(rollingPolicy.getActiveFileName());
- // This will also close the file. This is OK since multiple
- // close operations are safe.
- this.openFile(rollingPolicy.getActiveFileName());
- } catch (IOException e) {
- addError("setFile(" + fileName + ", false) call failed.", e);
+ // This will also close the file. This is OK since multiple
+ // close operations are safe.
+ this.openFile(rollingPolicy.getActiveFileName());
+ } catch (IOException e) {
+ addError("setFile(" + fileName + ", false) call failed.", e);
+ }
}
}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/spi/DeferredProcessingAware.java b/logback-core/src/main/java/ch/qos/logback/core/spi/DeferredProcessingAware.java
new file mode 100644
index 0000000..4034f58
--- /dev/null
+++ b/logback-core/src/main/java/ch/qos/logback/core/spi/DeferredProcessingAware.java
@@ -0,0 +1,6 @@
+package ch.qos.logback.core.spi;
+
+public interface DeferredProcessingAware {
+
+ public void prepareForDeferredProcessing();
+}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java
index c54ff3d..ef132f8 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java
@@ -17,7 +17,8 @@ import java.io.OutputStream;
import ch.qos.logback.core.WriterAppender;
-public class DummyWriterAppender<E> extends WriterAppender<E> {
+public class DummyWriterAppender<E> extends
+ WriterAppender<E> {
DummyWriterAppender(OutputStream os) {
this.setWriter(os);
-----------------------------------------------------------------------
Summary of changes:
.../qos/logback/access/PatternLayoutEncoder.java | 11 ++-
.../ch/qos/logback/access/spi/AccessEvent.java | 3 +-
logback-classic/pom.xml | 2 +-
.../classic/encoder/PatternLayoutEncoder.java | 11 ++-
.../ch/qos/logback/classic/spi/ILoggingEvent.java | 3 +-
.../ch/qos/logback/classic/spi/LoggingEvent.java | 1 +
.../classic/util/DefaultNestedComponentRules.java | 5 ++
.../src/test/input/joran/callerData.xml | 4 +-
.../src/test/input/joran/rolling/basic.xml | 4 +-
.../src/test/input/joran/rolling/timeAndSize.xml | 4 +-
logback-classic/src/test/input/joran/scan1.xml | 4 +-
logback-classic/src/test/input/joran/unique.xml | 4 +-
.../src/test/input/turbo/scan_lbclassic154.xml | 3 -
.../lbclassic139/LB139_DeadlockTest.java | 2 +-
.../issue/lbclassic135/lbclassic139/Worker.java | 4 +-
.../src/test/resources/recursiveInit.xml | 7 +-
.../java/ch/qos/logback/core/FileAppender.java | 64 +++++++++++---------
.../java/ch/qos/logback/core/WriterAppender.java | 46 +++++++++-----
.../core/pattern/PatternLayoutEncoderBase.java | 1 -
.../logback/core/rolling/RollingFileAppender.java | 50 ++++++++-------
.../logback/core/spi/DeferredProcessingAware.java | 6 ++
.../logback/core/appender/DummyWriterAppender.java | 3 +-
22 files changed, 139 insertions(+), 103 deletions(-)
create mode 100644 logback-core/src/main/java/ch/qos/logback/core/spi/DeferredProcessingAware.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, 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