diff --git a/.travis.yml b/.travis.yml
index e341a389efbaec9f73634f1a0b4a6a3ce89fb917..74f2ed9ae5850dfba4c52c8b000f6a6c24cc664b 100755
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,4 @@
language: java
notifications:
email:
- - logback-dev@qos.ch
+ - notification@qos.ch
diff --git a/logback-access/src/main/java/ch/qos/logback/access/pattern/EnsureLineSeparation.java b/logback-access/src/main/java/ch/qos/logback/access/pattern/EnsureLineSeparation.java
index e6e964b50ec56e84a2f6f5b1e83e16a353ac567a..9fd694e8df3647a6dbc039d17e442b853dd33e81 100644
--- a/logback-access/src/main/java/ch/qos/logback/access/pattern/EnsureLineSeparation.java
+++ b/logback-access/src/main/java/ch/qos/logback/access/pattern/EnsureLineSeparation.java
@@ -14,6 +14,7 @@
package ch.qos.logback.access.pattern;
import ch.qos.logback.access.spi.IAccessEvent;
+import ch.qos.logback.core.Context;
import ch.qos.logback.core.pattern.Converter;
import ch.qos.logback.core.pattern.ConverterUtil;
import ch.qos.logback.core.pattern.PostCompileProcessor;
@@ -25,7 +26,7 @@ public class EnsureLineSeparation implements PostCompileProcessor
* line.
*/
@Override
- public void process(Converter head) {
+ public void process(Context context, Converter head) {
if(head == null)
throw new IllegalArgumentException("Empty converter chain");
diff --git a/logback-access/src/test/java/ch/qos/logback/access/servlet/TeeHttpServletResponseTest.java b/logback-access/src/test/java/ch/qos/logback/access/servlet/TeeHttpServletResponseTest.java
index 1bdecf279fee3edc2d24e74c354d1d9234b83fcb..3fb079ffd47092b26cd589fd64dda0c100c2db5f 100644
--- a/logback-access/src/test/java/ch/qos/logback/access/servlet/TeeHttpServletResponseTest.java
+++ b/logback-access/src/test/java/ch/qos/logback/access/servlet/TeeHttpServletResponseTest.java
@@ -41,7 +41,7 @@ public class TeeHttpServletResponseTest {
}
@Parameterized.Parameters
- public static Collection inputValues() {
+ public static Collection> inputValues() {
return Arrays.asList(new Object[][]{
{ "utf-8", "Gülcü", new byte[] { (byte) 0x47, (byte) 0xC3, (byte) 0xBC, (byte) 0x6C, (byte) 0x63, (byte) 0xC3, (byte) 0xBC }},
{ "iso-8859-1", "Gülcü", new byte[] { (byte) 0x47, (byte) 0xFC, (byte) 0x6C, (byte) 0x63, (byte) 0xFC }}
diff --git a/logback-classic/pom.xml b/logback-classic/pom.xml
index 2f1d97b33f368837b9f934d25a6278976af5a807..ade77b94be5d90b69de1813a4b73eed75d37567a 100755
--- a/logback-classic/pom.xml
+++ b/logback-classic/pom.xml
@@ -260,7 +260,9 @@
maven-surefire-plugin
- once
+
+ 1
+ true
plain
false
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java b/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
index 098231bb6097d4ad5a9f82a054f3c9d44c62df0c..cdac5531aafa535acd2d3127f92051e4d173c7d2 100755
--- a/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
@@ -45,8 +45,8 @@ import ch.qos.logback.core.status.WarnStatus;
public class LoggerContext extends ContextBase implements ILoggerFactory,
LifeCycle {
- /** Default setting of stacktrace packaging detail */
- public static final boolean DEFAULT_PACKAGING_STATE = false;
+ /** Default setting of packaging data in stack traces */
+ public static final boolean DEFAULT_PACKAGING_DATA = false;
final Logger root;
private int size;
@@ -57,7 +57,7 @@ public class LoggerContext extends ContextBase implements ILoggerFactory,
private LoggerContextVO loggerContextRemoteView;
private final TurboFilterList turboFilterList = new TurboFilterList();
- private boolean packagingDataEnabled = DEFAULT_PACKAGING_STATE;
+ private boolean packagingDataEnabled = DEFAULT_PACKAGING_DATA;
private int maxCallerDataDepth = ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH;
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java b/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
index 78188677cafee0ad91c54b1923e8aa1e96fbe233..94a66fa579e37053186adb38aacc0d339018d331 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
@@ -15,6 +15,7 @@ package ch.qos.logback.classic.joran;
import ch.qos.logback.classic.joran.action.*;
import ch.qos.logback.classic.sift.SiftAction;
+import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.PlatformInfo;
import ch.qos.logback.classic.util.DefaultNestedComponentRules;
import ch.qos.logback.core.joran.JoranConfiguratorBase;
@@ -59,9 +60,9 @@ public class JoranConfigurator extends JoranConfiguratorBase {
rs.addRule(new ElementSelector("configuration/root"), new RootLoggerAction());
rs.addRule(new ElementSelector("configuration/root/level"), new LevelAction());
rs.addRule(new ElementSelector("configuration/logger/appender-ref"),
- new AppenderRefAction());
+ new AppenderRefAction());
rs.addRule(new ElementSelector("configuration/root/appender-ref"),
- new AppenderRefAction());
+ new AppenderRefAction());
// add if-then-else support
rs.addRule(new ElementSelector("*/if"), new IfAction());
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConfigurationAction.java b/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConfigurationAction.java
index fa9369a42b55610953f5d5b90539c878cfe73897..87b9960812311d1684e88b2b42100d2e34e0276a 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConfigurationAction.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConfigurationAction.java
@@ -27,7 +27,7 @@ import ch.qos.logback.core.util.OptionHelper;
public class ConfigurationAction extends Action {
static final String INTERNAL_DEBUG_ATTR = "debug";
- static final String PACKAGING_INFO_ATTR = "packageTrace";
+ static final String PACKAGING_DATA_ATTR = "packagingData";
static final String SCAN_ATTR = "scan";
static final String SCAN_PERIOD_ATTR = "scanPeriod";
static final String DEBUG_SYSTEM_PROPERTY_KEY = "logback.debug";
@@ -58,10 +58,10 @@ public class ConfigurationAction extends Action {
contextUtil.addHostNameAsProperty();
LoggerContext lc = (LoggerContext) context;
- boolean packageTraceEnabled = OptionHelper.toBoolean(
- ic.subst(attributes.getValue(PACKAGING_INFO_ATTR)),
- LoggerContext.DEFAULT_PACKAGING_STATE);
- lc.setPackagingDataEnabled(packageTraceEnabled);
+ boolean packagingData = OptionHelper.toBoolean(
+ ic.subst(attributes.getValue(PACKAGING_DATA_ATTR)),
+ LoggerContext.DEFAULT_PACKAGING_DATA);
+ lc.setPackagingDataEnabled(packagingData);
if (EnvUtil.isGroovyAvailable()) {
contextUtil.addGroovyPackages(lc.getFrameworkPackages());
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java b/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
index 08c0c533398256e6f0638f001df85c8bc1594da2..a867105e27ccb3180525751eb15023364f529cae 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
@@ -13,7 +13,9 @@
*/
package ch.qos.logback.classic.pattern;
+import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Context;
import ch.qos.logback.core.pattern.Converter;
import ch.qos.logback.core.pattern.ConverterUtil;
import ch.qos.logback.core.pattern.PostCompileProcessor;
@@ -36,14 +38,20 @@ public class EnsureExceptionHandling implements
*
*
*/
- public void process(Converter head) {
+ public void process(Context context, Converter head) {
if(head == null) {
// this should never happen
throw new IllegalArgumentException("cannot process empty chain");
}
if (!chainHandlesThrowable(head)) {
Converter tail = ConverterUtil.findTail(head);
- Converter exConverter = new ThrowableProxyConverter();
+ Converter exConverter = null;
+ LoggerContext loggerContext = (LoggerContext) context;
+ if(loggerContext.isPackagingDataEnabled()) {
+ exConverter = new ExtendedThrowableProxyConverter();
+ } else {
+ exConverter = new ThrowableProxyConverter();
+ }
tail.setNext(exConverter);
}
}
@@ -56,8 +64,8 @@ public class EnsureExceptionHandling implements
* The first element of the chain
* @return true if can handle throwables contained in logging events
*/
- public boolean chainHandlesThrowable(Converter head) {
- Converter c = head;
+ public boolean chainHandlesThrowable(Converter head) {
+ Converter c = head;
while (c != null) {
if (c instanceof ThrowableHandlingConverter) {
return true;
diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java b/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java
index aa1fb6ef8c34a55723c96fa3a2ac78f9fcad581f..9861646b00f89987c9e4307fc8d08671c18df179 100644
--- a/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java
+++ b/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java
@@ -65,14 +65,14 @@ public class ThrowableProxyConverter extends ThrowableHandlingConverter {
}
}
- final List optionList = getOptionList();
+ final List optionList = getOptionList();
if (optionList != null && optionList.size() > 1) {
final int optionListSize = optionList.size();
for (int i = 1; i < optionListSize; i++) {
String evaluatorOrIgnoredStackTraceLine = (String) optionList.get(i);
Context context = getContext();
- Map evaluatorMap = (Map) context.getObject(CoreConstants.EVALUATOR_MAP);
+ Map> evaluatorMap = (Map>) context.getObject(CoreConstants.EVALUATOR_MAP);
EventEvaluator ee = (EventEvaluator) evaluatorMap
.get(evaluatorOrIgnoredStackTraceLine);
if (ee != null) {
diff --git a/logback-classic/src/test/input/joran/packageDataEnabled.xml b/logback-classic/src/test/input/joran/packagingDataDisabled.xml
similarity index 88%
rename from logback-classic/src/test/input/joran/packageDataEnabled.xml
rename to logback-classic/src/test/input/joran/packagingDataDisabled.xml
index 9fb95b3a0e548b5d65b98e2e820797e13e05518c..ce441473468244492ebc9faaa9dd13349823a6c9 100644
--- a/logback-classic/src/test/input/joran/packageDataEnabled.xml
+++ b/logback-classic/src/test/input/joran/packagingDataDisabled.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/logback-classic/src/test/input/joran/packageDataDisabled.xml b/logback-classic/src/test/input/joran/packagingDataEnabled.xml
similarity index 87%
rename from logback-classic/src/test/input/joran/packageDataDisabled.xml
rename to logback-classic/src/test/input/joran/packagingDataEnabled.xml
index bb0dde55f5fac1e27f4fbc143928fa742780e12d..c7218b3294e3c74c652af9e804bef25af943a15f 100644
--- a/logback-classic/src/test/input/joran/packageDataDisabled.xml
+++ b/logback-classic/src/test/input/joran/packagingDataEnabled.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/logback-classic/src/test/input/joran/sift/lbclassic203.xml b/logback-classic/src/test/input/joran/sift/logback_416.xml
similarity index 85%
rename from logback-classic/src/test/input/joran/sift/lbclassic203.xml
rename to logback-classic/src/test/input/joran/sift/logback_416.xml
index 646d6a2441d20cfe3e1eef09ab77d180fbd9863b..868ad8e7a31993a8b1dd19068656999f9ef5b796 100644
--- a/logback-classic/src/test/input/joran/sift/lbclassic203.xml
+++ b/logback-classic/src/test/input/joran/sift/logback_416.xml
@@ -14,7 +14,7 @@
+ class="ch.qos.logback.classic.issue.logback416.InstanceCountingAppender" />
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/PackageTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/PackageTest.java
index eb92d873064f60f5cbe15118acb5967aafa108ab..b30305d4028ec2dd338ac249bfd4def17034fff5 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/PackageTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/PackageTest.java
@@ -21,7 +21,6 @@ import ch.qos.logback.classic.issue.lbclassic135.lbclassic139.LB139_DeadlockTest
@RunWith(Suite.class)
@SuiteClasses({LB139_DeadlockTest.class,
- ch.qos.logback.classic.issue.lbclassic135.lbclassic139.PackageTest.class,
- ch.qos.logback.classic.issue.lbclassic203.PackageTest.class})
+ ch.qos.logback.classic.issue.logback416.PackageTest.class})
public class PackageTest {
}
\ No newline at end of file
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 e99078ddae386554b96cb517ac9f4b86670839e2..51ee72f73fe95d40e12b038b4f393f18a394cef9 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
@@ -32,7 +32,7 @@ public class LB139_DeadlockTest {
@Test //(timeout=3000)
public void test() throws Exception {
Worker worker = new Worker(loggerContext);
- Accessor accessor = new Accessor(worker, loggerContext);
+ Accessor accessor = new Accessor(worker, loggerContext);
Thread workerThread = new Thread(worker, "WorkerThread");
Thread accessorThread = new Thread(accessor, "AccessorThread");
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/PackageTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/PackageTest.java
deleted file mode 100644
index 75e3dd8655c727beb90d6f9ab6947d4db8ca540e..0000000000000000000000000000000000000000
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/PackageTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Logback: the reliable, generic, fast and flexible logging framework.
- * Copyright (C) 1999-2015, 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.classic.issue.lbclassic135.lbclassic139;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-import org.junit.runners.Suite.SuiteClasses;
-
-@RunWith(Suite.class)
-@SuiteClasses(LB139_DeadlockTest.class)
-public class PackageTest {
-}
\ No newline at end of file
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/ConcurrentSiftingTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/ConcurrentSiftingTest.java
similarity index 89%
rename from logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/ConcurrentSiftingTest.java
rename to logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/ConcurrentSiftingTest.java
index 6d5f355975ca460d203ea318054aec3a8e2410dc..cbbd506f4edacc51e534ef85b252e22c7c4c4626 100755
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/ConcurrentSiftingTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/ConcurrentSiftingTest.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.classic.issue.lbclassic203;
+package ch.qos.logback.classic.issue.logback416;
import ch.qos.logback.classic.ClassicTestConstants;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.issue.lbclassic135.LoggingRunnable;
+import ch.qos.logback.classic.issue.logback416.InstanceCountingAppender;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.contention.MultiThreadedHarness;
import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
import ch.qos.logback.core.joran.spi.JoranException;
+
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@@ -54,8 +56,8 @@ public class ConcurrentSiftingTest {
@Test
public void concurrentAccess() throws JoranException, InterruptedException {
- configure(FOLDER_PREFIX + "lbclassic203.xml");
+ configure(FOLDER_PREFIX + "logback_416.xml");
harness.execute(runnableArray);
- assertEquals(1, InstanceCountingAppender.INSTANCE_COUNT);
+ assertEquals(1, InstanceCountingAppender.INSTANCE_COUNT.get());
}
}
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/InstanceCountingAppender.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/InstanceCountingAppender.java
similarity index 78%
rename from logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/InstanceCountingAppender.java
rename to logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/InstanceCountingAppender.java
index d3d0aba0db8b2741b64f2dfda38e21c44950f5df..dba9022c23dc8a4df551f3242172dc64178e3803 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/InstanceCountingAppender.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/InstanceCountingAppender.java
@@ -11,17 +11,19 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package ch.qos.logback.classic.issue.lbclassic203;
+package ch.qos.logback.classic.issue.logback416;
+
+import java.util.concurrent.atomic.AtomicInteger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class InstanceCountingAppender extends AppenderBase {
- static public volatile int INSTANCE_COUNT = 0;
+ static public AtomicInteger INSTANCE_COUNT = new AtomicInteger(0);
public InstanceCountingAppender() {
- INSTANCE_COUNT++;
+ INSTANCE_COUNT.getAndIncrement();
}
protected void append(ILoggingEvent e) {
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/PackageTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/PackageTest.java
similarity index 92%
rename from logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/PackageTest.java
rename to logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/PackageTest.java
index 80bc94f1cf5dc854e41973f0f88030aa78725245..8c932c4b7964b9e10653b11efaf2a2ff19d50fc1 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/PackageTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback416/PackageTest.java
@@ -11,7 +11,7 @@
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
-package ch.qos.logback.classic.issue.lbclassic203;
+package ch.qos.logback.classic.issue.logback416;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/joran/EvaluatorJoranTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/joran/EvaluatorJoranTest.java
index 1e11bfa3f0e92ca7db4232b70c19afa15ae850f0..5c2d0e5ca0c240949096f7dedde5951fae0282fd 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/joran/EvaluatorJoranTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/joran/EvaluatorJoranTest.java
@@ -32,6 +32,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.boolex.EvaluationException;
+import ch.qos.logback.core.boolex.EventEvaluator;
import ch.qos.logback.core.joran.spi.JoranException;
@@ -45,7 +46,7 @@ public class EvaluatorJoranTest {
jc.doConfigure(ClassicTestConstants.JORAN_INPUT_PREFIX + "simpleEvaluator.xml");
- Map evalMap = (Map) loggerContext.getObject(CoreConstants.EVALUATOR_MAP);
+ Map> evalMap = (Map>) loggerContext.getObject(CoreConstants.EVALUATOR_MAP);
assertNotNull(evalMap);
JaninoEventEvaluator evaluator = (JaninoEventEvaluator) evalMap.get("msgEval");
assertNotNull(evaluator);
@@ -65,7 +66,7 @@ public class EvaluatorJoranTest {
jc.setContext(loggerContext);
jc.doConfigure(ClassicTestConstants.JORAN_INPUT_PREFIX + "ignore.xml");
- Map evalMap = (Map) loggerContext.getObject(CoreConstants.EVALUATOR_MAP);
+ Map> evalMap = (Map>) loggerContext.getObject(CoreConstants.EVALUATOR_MAP);
assertNotNull(evalMap);
Logger logger = loggerContext.getLogger("xx");
diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java
index 13e8c610c7d748ff7121fedf1ce411d33460c579..c6ca21f9bd23e0d433483209778ec1ba001b324d 100755
--- a/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java
@@ -45,7 +45,6 @@ import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.status.StatusChecker;
import ch.qos.logback.core.testUtil.StringListAppender;
-
import static org.junit.Assert.*;
public class JoranConfiguratorTest {
@@ -69,7 +68,8 @@ public class JoranConfiguratorTest {
Logger logger = loggerContext.getLogger(this.getClass().getName());
Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
- ListAppender listAppender = (ListAppender) root.getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertEquals(0, listAppender.list.size());
String msg = "hello world";
logger.debug(msg);
@@ -81,7 +81,8 @@ public class JoranConfiguratorTest {
@Test
public void level() throws JoranException {
configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "simpleLevel.xml");
- ListAppender listAppender = (ListAppender) root.getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertEquals(0, listAppender.list.size());
String msg = "hello world";
logger.debug(msg);
@@ -101,9 +102,10 @@ public class JoranConfiguratorTest {
System.setProperty(propertyName, "INFO");
configure(ClassicTestConstants.JORAN_INPUT_PREFIX
- + "rootLevelByProperty.xml");
+ + "rootLevelByProperty.xml");
// StatusPrinter.print(loggerContext);
- ListAppender listAppender = (ListAppender) root.getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertEquals(0, listAppender.list.size());
String msg = "hello world";
logger.debug(msg);
@@ -116,9 +118,10 @@ public class JoranConfiguratorTest {
String propertyName = "logback.level";
System.setProperty(propertyName, "DEBUG");
configure(ClassicTestConstants.JORAN_INPUT_PREFIX
- + "loggerLevelByProperty.xml");
+ + "loggerLevelByProperty.xml");
// StatusPrinter.print(loggerContext);
- ListAppender listAppender = (ListAppender) root.getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertEquals(0, listAppender.list.size());
String msg = "hello world";
logger.debug(msg);
@@ -131,10 +134,11 @@ public class JoranConfiguratorTest {
final String propertyName = "logback.appenderRef";
System.setProperty(propertyName, "A");
configure(ClassicTestConstants.JORAN_INPUT_PREFIX
- + "appenderRefByProperty.xml");
+ + "appenderRefByProperty.xml");
final Logger logger = loggerContext
- .getLogger("ch.qos.logback.classic.joran");
- final ListAppender listAppender = (ListAppender) logger.getAppender("A");
+ .getLogger("ch.qos.logback.classic.joran");
+ final ListAppender listAppender = (ListAppender) logger
+ .getAppender("A");
assertEquals(0, listAppender.list.size());
final String msg = "hello world";
logger.info(msg);
@@ -163,7 +167,7 @@ public class JoranConfiguratorTest {
logger.debug(msg);
StringListAppender slAppender = (StringListAppender) loggerContext
- .getLogger("root").getAppender("STR_LIST");
+ .getLogger("root").getAppender("STR_LIST");
assertNotNull(slAppender);
assertEquals(2, slAppender.strList.size());
assertTrue(slAppender.strList.get(0).contains(" DEBUG - toto"));
@@ -209,9 +213,8 @@ public class JoranConfiguratorTest {
logger.warn("hello");
logger.error("to be ignored");
- @SuppressWarnings("unchecked")
- ListAppender listAppender = (ListAppender) root
- .getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertNotNull(listAppender);
assertEquals(1, listAppender.list.size());
@@ -229,9 +232,8 @@ public class JoranConfiguratorTest {
logger.warn("hello");
logger.error("to be ignored");
- @SuppressWarnings("unchecked")
- ListAppender listAppender = (ListAppender) root
- .getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertNotNull(listAppender);
assertEquals(1, listAppender.list.size());
@@ -243,9 +245,10 @@ public class JoranConfiguratorTest {
@Test
public void testTurboDynamicThreshold() throws JoranException {
configure(ClassicTestConstants.JORAN_INPUT_PREFIX
- + "turboDynamicThreshold.xml");
+ + "turboDynamicThreshold.xml");
- ListAppender listAppender = (ListAppender) root.getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertEquals(0, listAppender.list.size());
// this one should be denied
@@ -263,9 +266,10 @@ public class JoranConfiguratorTest {
@Test
public void testTurboDynamicThreshold2() throws JoranException {
configure(ClassicTestConstants.JORAN_INPUT_PREFIX
- + "turboDynamicThreshold2.xml");
+ + "turboDynamicThreshold2.xml");
- ListAppender listAppender = (ListAppender) root.getAppender("LIST");
+ ListAppender listAppender = (ListAppender) root
+ .getAppender("LIST");
assertEquals(0, listAppender.list.size());
// this one should log
@@ -290,7 +294,7 @@ public class JoranConfiguratorTest {
public void autoscanShouldReconfigureOnFileChange() throws Exception {
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "scan1.xml";
+ + "scan1.xml";
configure(configFileAsStr);
File file = new File(configFileAsStr);
@@ -303,7 +307,8 @@ public class JoranConfiguratorTest {
}
loggerContext.getExecutorService().shutdown();
- loggerContext.getExecutorService().awaitTermination(1000, TimeUnit.MILLISECONDS);
+ loggerContext.getExecutorService().awaitTermination(1000,
+ TimeUnit.MILLISECONDS);
StatusChecker checker = new StatusChecker(loggerContext);
checker.assertIsErrorFree();
@@ -312,10 +317,10 @@ public class JoranConfiguratorTest {
@Test
public void timestamp() throws JoranException, IOException,
- InterruptedException {
+ InterruptedException {
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "timestamp-context.xml";
+ + "timestamp-context.xml";
configure(configFileAsStr);
String r = loggerContext.getProperty("testTimestamp");
@@ -327,13 +332,13 @@ public class JoranConfiguratorTest {
@Test
public void timestampLocal() throws JoranException, IOException,
- InterruptedException {
+ InterruptedException {
String sysProp = "ch.qos.logback.classic.joran.JoranConfiguratorTest.timestampLocal";
System.setProperty(sysProp, "");
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "timestamp-local.xml";
+ + "timestamp-local.xml";
configure(configFileAsStr);
// It's hard to test the local variable has been set, as it's not
@@ -344,22 +349,25 @@ public class JoranConfiguratorTest {
String r = loggerContext.getProperty("testTimestamp");
assertNull(r);
- String expected = "today is " + new SimpleDateFormat("yyyy-MM").format(new Date());
+ String expected = "today is "
+ + new SimpleDateFormat("yyyy-MM").format(new Date());
String sysPropValue = System.getProperty(sysProp);
assertEquals(expected, sysPropValue);
}
@Test
public void encoderCharset() throws JoranException, IOException,
- InterruptedException {
+ InterruptedException {
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "encoderCharset.xml";
+ + "encoderCharset.xml";
configure(configFileAsStr);
- ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CONSOLE");
+ ConsoleAppender consoleAppender = (ConsoleAppender) root
+ .getAppender("CONSOLE");
assertNotNull(consoleAppender);
- LayoutWrappingEncoder encoder = (LayoutWrappingEncoder) consoleAppender.getEncoder();
+ LayoutWrappingEncoder encoder = (LayoutWrappingEncoder) consoleAppender
+ .getEncoder();
assertEquals("UTF-8", encoder.getCharset().displayName());
@@ -377,16 +385,16 @@ public class JoranConfiguratorTest {
assertEquals(JULHelper.asJULLevel(expectedLevel), julLevel);
}
-
}
@Test
public void levelChangePropagator0() throws JoranException, IOException,
- InterruptedException {
+ InterruptedException {
String loggerName = "changePropagator0" + diff;
- java.util.logging.Logger.getLogger(loggerName).setLevel(java.util.logging.Level.INFO);
+ java.util.logging.Logger.getLogger(loggerName).setLevel(
+ java.util.logging.Level.INFO);
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "/jul/levelChangePropagator0.xml";
+ + "/jul/levelChangePropagator0.xml";
configure(configFileAsStr);
StatusChecker checker = new StatusChecker(loggerContext);
checker.assertIsErrorFree();
@@ -397,12 +405,13 @@ public class JoranConfiguratorTest {
@Test
public void levelChangePropagator1() throws JoranException, IOException,
- InterruptedException {
+ InterruptedException {
String loggerName = "changePropagator1" + diff;
- java.util.logging.Logger.getLogger(loggerName).setLevel(java.util.logging.Level.INFO);
+ java.util.logging.Logger.getLogger(loggerName).setLevel(
+ java.util.logging.Level.INFO);
verifyJULLevel(loggerName, Level.INFO);
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "/jul/levelChangePropagator1.xml";
+ + "/jul/levelChangePropagator1.xml";
configure(configFileAsStr);
StatusChecker checker = new StatusChecker(loggerContext);
checker.assertIsErrorFree();
@@ -413,9 +422,10 @@ public class JoranConfiguratorTest {
@Test
@Ignore
- public void onConsoleRetro() throws JoranException, IOException, InterruptedException {
+ public void onConsoleRetro() throws JoranException, IOException,
+ InterruptedException {
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "/onConsoleRetro.xml";
+ + "/onConsoleRetro.xml";
configure(configFileAsStr);
System.out.println("xxxxxxxxxxxxx");
Thread.sleep(400);
@@ -426,18 +436,20 @@ public class JoranConfiguratorTest {
@Test
public void lbcore193() throws JoranException {
- String configFileAsStr = ClassicTestConstants.ISSUES_PREFIX + "lbcore193.xml";
+ String configFileAsStr = ClassicTestConstants.ISSUES_PREFIX
+ + "lbcore193.xml";
configure(configFileAsStr);
checker.asssertContainsException(ScanException.class);
- checker.assertContainsMatch(Status.ERROR, "Expecting RIGHT_PARENTHESIS token but got null");
- checker.assertContainsMatch(Status.ERROR, "See also " + Parser.MISSING_RIGHT_PARENTHESIS);
+ checker.assertContainsMatch(Status.ERROR,
+ "Expecting RIGHT_PARENTHESIS token but got null");
+ checker.assertContainsMatch(Status.ERROR, "See also "
+ + Parser.MISSING_RIGHT_PARENTHESIS);
}
-
@Test
public void properties() throws JoranException {
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "properties.xml";
+ + "properties.xml";
assertNull(loggerContext.getProperty(CoreConstants.HOSTNAME_KEY));
assertNull(System.getProperty("sys"));
@@ -451,14 +463,15 @@ public class JoranConfiguratorTest {
checker.assertIsErrorFree();
}
-
// see also http://jira.qos.ch/browse/LBCORE-254
@Test
public void sysProps() throws JoranException {
- System.setProperty("k.lbcore254", ClassicTestConstants.ISSUES_PREFIX + "lbcore254");
+ System.setProperty("k.lbcore254", ClassicTestConstants.ISSUES_PREFIX
+ + "lbcore254");
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
- configurator.doConfigure(ClassicTestConstants.ISSUES_PREFIX + "lbcore254.xml");
+ configurator.doConfigure(ClassicTestConstants.ISSUES_PREFIX
+ + "lbcore254.xml");
checker.assertIsErrorFree();
}
@@ -466,7 +479,7 @@ public class JoranConfiguratorTest {
@Test
public void packageDataDisabledByConfigAttribute() throws JoranException {
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "packageDataDisabled.xml";
+ + "packagingDataDisabled.xml";
configure(configFileAsStr);
assertFalse(loggerContext.isPackagingDataEnabled());
}
@@ -474,7 +487,7 @@ public class JoranConfiguratorTest {
@Test
public void packageDataEnabledByConfigAttribute() throws JoranException {
String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
- + "packageDataEnabled.xml";
+ + "packagingDataEnabled.xml";
configure(configFileAsStr);
assertTrue(loggerContext.isPackagingDataEnabled());
}
diff --git a/logback-core/pom.xml b/logback-core/pom.xml
index 9f0e61e3b0f18f7d9635215c1929e5440406a16b..5a6b7483683297823ab25ff22cb7cddc93b16707 100755
--- a/logback-core/pom.xml
+++ b/logback-core/pom.xml
@@ -59,9 +59,10 @@
org.apache.maven.plugins
maven-surefire-plugin
- once
+ 1
+ true
+
plain
-
false
**/All*Test.java
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java
index 2686210b9a89c27596dcea81f5639c6e4202bc04..63499dee400783c5e314f7aed341281eeaddfe5a 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java
@@ -85,7 +85,7 @@ abstract public class PatternLayoutBase extends LayoutBase {
Node t = p.parse();
this.head = p.compile(t, getEffectiveConverterMap());
if (postCompileProcessor != null) {
- postCompileProcessor.process(head);
+ postCompileProcessor.process(context, head);
}
ConverterUtil.setContextForConverters(getContext(), head);
ConverterUtil.startConverters(this.head);
diff --git a/logback-core/src/main/java/ch/qos/logback/core/pattern/PostCompileProcessor.java b/logback-core/src/main/java/ch/qos/logback/core/pattern/PostCompileProcessor.java
index 519d2fd59178a3652bc8e6894c2f11ce74cd61cb..4683d1f53ef1f45088486556d4e2bc42e40cf6ba 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/pattern/PostCompileProcessor.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/pattern/PostCompileProcessor.java
@@ -13,6 +13,8 @@
*/
package ch.qos.logback.core.pattern;
+import ch.qos.logback.core.Context;
+
/**
* Implements this to perform post compile processing for a PatternLayout.
@@ -30,5 +32,5 @@ public interface PostCompileProcessor {
* @param head
* The first converter in the chain
*/
- void process(Converter head);
+ void process(Context context, Converter head);
}
diff --git a/logback-site/src/site/pages/manual/configuration.html b/logback-site/src/site/pages/manual/configuration.html
index ad69b626231d8c9bd5857196f0c9fd5bdc1817fb..7755028815f7bc17f08354c9cd44c5ce289d6f9e 100755
--- a/logback-site/src/site/pages/manual/configuration.html
+++ b/logback-site/src/site/pages/manual/configuration.html
@@ -271,51 +271,6 @@ public class Foo {
directory accessible from the class path. Running the MyApp1
application should give identical results to its previous run.
- Enabling packaging
- detail in stacktraces
-
- logback can include packaging data in stacktraces to help track
- down the culprit JAR(s) of an exception, as shown in the following
- example:
-
- 14:28:48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 is not a valid value
-java.lang.Exception: 99 is invalid
- at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
- at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
- at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
- at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
- at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
- at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
- at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
- at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
- at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
- at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]
-
- While stacktrace packaging detail can be helpful in
- many situations, it is rather expensive to compute, especially for
- deep stacktraces. Consider avoiding this option in performance-critical
- code.
-
- To enable this lookup programmatically, set the context's
-
- setPackagingDataEnabled(boolean)
:
-
-
-public static void main(String[] args) {
- LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- // enable packaging detail for stacktraces
- lc.setPackagingDataEnabled(true);
- ...
-}
-
- This can also be enabled from logback.xml
with:
-
-
-<configuration packageTrace="true">
- ...
-</configuration>
-
Automatic
printing of status messages in case of warning or errors
@@ -547,6 +502,55 @@ public static void main(String[] args) {
+ Enabling packaging data in stack traces
+
+ While useful, packaging data is expensive to
+ compute, especially in applications with frequent exceptions.
+
+ NOTE As of version 1.1.4,
+ packaging data is disabled by default.
+
+ If instructed to do so, logback can include packaging data for
+ each line of the stack trace lines it outputs. Packaging data
+ consists of the name and version of the jar file whence the class
+ of the stack trace line originated. Packaging data can be very
+ useful in identifying software versioning issues. However, it is
+ rather expensive to compute, especially in application where
+ exceptions are thrown frequently. Here is a sample output:
+
+ 14:28:48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 is not a valid value
+java.lang.Exception: 99 is invalid
+ at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
+ at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
+ at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
+ at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
+ at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
+ at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
+ at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
+ at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
+ at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
+ at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
+ at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]
+
+
+ Packaging data is disabled by default but can be enabled by
+ configuration:
+
+
+<configuration packagingData="true">
+ ...
+</configuration>
+
+ Alternatively, packaging data can be enabled/disabled
+ programmatically by invoking the setPackagingDataEnabled(boolean)
+ method in LoggerContext
, as shown next:
+
+
+
+ LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
+ lc.setPackagingDataEnabled(true);
+
Invoking
JoranConfigurator
directly
diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html
index e87df5a156b8658a151452a8881fe3255e62ba82..3270c127ee28996863cb45b00584fc6bec871b2c 100755
--- a/logback-site/src/site/pages/news.html
+++ b/logback-site/src/site/pages/news.html
@@ -29,26 +29,29 @@
-
-
As of version 1.1.3, all logback modules require JDK 1.6
- instead of previously JDK 1.5. This change was put to
- consultation on the logback mailing lists with no objections
- raised.
-
-
2015, Release of version 1.1.4
- PackageDataCalculation is
-
+
+
+
Packaging data (as output in stack traces) is now disabled
+ by default. It has to be enabled explicitly.
+
+
In case an application throws lots of exceptions, then
computing packaging data can be very costly and will cause the
application to run slower. Making bad worse. To alleviate this
- problem, PatternLayout now adds exception tracing without
- packaging data. It other words, in the absence of a converter
- handling exceptions, PatternLayout in logback-classic will add %ex
- as a suffix of instead of %xEx earlier version. This fixes LOGBACK-966.
+ problem, packaging data is no longer computed by default. It has
+ to be enabled
+ explicitly. In the absence of explicit instructions, i.e the
+ user has not specified a converter handling exceptions,
+ PatternLayout
in logback-classic will follow the
+ settings defining for the logging environment. If packaging data
+ is disabled, then it add %ex as a suffix in the pattern, and if
+ packaging data is enabled then %xEx will be added. These changes
+ fix LOGBACK-730 and
+ LOGBACK-966.
Fixed a bug in TimeBasedFileNamingAndTriggeringPolicyBase
@@ -67,6 +70,15 @@
24th of March 2015, Release of version 1.1.3
+
+
+
As of version 1.1.3, all logback modules require JDK 1.6
+ instead of previously JDK 1.5. This change was put to
+ consultation on the logback mailing lists with no objections
+ raised.
+
+
+
Fixed FileAppender
's prudent mode so that it properly recovers
from IO Errors
(LOGBACK-1046)
diff --git a/logback-site/src/site/pages/setup.html b/logback-site/src/site/pages/setup.html
index 83745cf14782617da58dadbe08fb2ccb2ab7df2d..218d99ea9ea0203287a40ee321a1157910e7368f 100755
--- a/logback-site/src/site/pages/setup.html
+++ b/logback-site/src/site/pages/setup.html
@@ -291,7 +291,7 @@
The above listed procedure has been last tested by the author
- using Eclipse Luna on March 5th 2015.
+ using Eclipse Luna on February 10th, 2016.
diff --git a/logback-site/src/site/pages/templates/footer.js b/logback-site/src/site/pages/templates/footer.js
index 6020d840b2e515b07b386a5e54bff591c82b0194..25f256ed87989875bda99f7ea1f51a17bccb98b5 100755
--- a/logback-site/src/site/pages/templates/footer.js
+++ b/logback-site/src/site/pages/templates/footer.js
@@ -3,7 +3,7 @@ document.write('