Index: log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlFileAppenderTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlFileAppenderTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlFileAppenderTest.java (revision )
@@ -16,19 +16,18 @@
*/
package org.apache.logging.log4j.core.appender;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
/**
* Tests a "complete" XML file a.k.a. a well-formed XML file.
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java (revision )
@@ -60,8 +60,8 @@
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
if (advertiser != null) {
advertiser.unadvertise(advertisement);
}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java (revision )
@@ -28,7 +28,6 @@
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
@@ -41,6 +40,8 @@
import org.apache.logging.log4j.core.helpers.Assert;
import org.apache.logging.log4j.core.helpers.NetUtils;
import org.apache.logging.log4j.core.jmx.Server;
+import org.apache.logging.log4j.core.state.LifeCycle;
+import org.apache.logging.log4j.core.state.Status;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.spi.AbstractLoggerProvider;
import org.apache.logging.log4j.status.StatusLogger;
@@ -78,24 +79,8 @@
*/
private Reference shutdownThread;
- /**
- * Status of the LoggerContext.
- */
- public enum Status {
- /** Initialized but not yet started. */
- INITIALIZED,
- /** In the process of starting. */
- STARTING,
- /** Is active. */
- STARTED,
- /** Shutdown is in progress. */
- STOPPING,
- /** Has shutdown. */
- STOPPED
- }
+ private volatile Status status = Status.RESOLVED;
- private volatile Status status = Status.INITIALIZED;
-
private final Lock configLock = new ReentrantLock();
/**
@@ -155,12 +140,17 @@
public void start() {
if (configLock.tryLock()) {
try {
- if (status == Status.INITIALIZED || status == Status.STOPPED) {
+ if (status == Status.RESOLVED) {
status = Status.STARTING;
+ try {
- reconfigure();
- setUpShutdownHook();
+ reconfigure();
+ setUpShutdownHook();
- status = Status.STARTED;
+ status = Status.ACTIVE;
+ } catch (final RuntimeException e) {
+ status = Status.RESOLVED;
+ throw e;
- }
+ }
+ }
} finally {
configLock.unlock();
}
@@ -174,9 +164,9 @@
public void start(final Configuration config) {
if (configLock.tryLock()) {
try {
- if (status == Status.INITIALIZED || status == Status.STOPPED) {
+ if (status == Status.RESOLVED) {
setUpShutdownHook();
- status = Status.STARTED;
+ status = Status.ACTIVE;
}
} finally {
configLock.unlock();
@@ -216,7 +206,7 @@
public void stop() {
configLock.lock();
try {
- if (status == Status.STOPPED) {
+ if (status == Status.RESOLVED) {
return;
}
status = Status.STOPPING;
@@ -227,7 +217,7 @@
prev.stop();
externalContext = null;
LogManager.getFactory().removeContext(this);
- status = Status.STOPPED;
+ status = Status.RESOLVED;
} finally {
configLock.unlock();
@@ -252,13 +242,13 @@
return name;
}
+ @Override
public Status getStatus() {
return status;
}
- @Override
public boolean isStarted() {
- return status == Status.STARTED;
+ return status == Status.ACTIVE;
}
/**
@@ -294,7 +284,7 @@
* Whether this collection is a copy of the underlying collection or not is undefined. Therefore, modify this collection at your own
* risk.
*
- *
+ *
* @return a collection of the current loggers.
*/
public Collection getLoggers() {
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java (revision )
@@ -60,8 +60,8 @@
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
if (advertiser != null) {
advertiser.unadvertise(advertisement);
}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java (revision )
@@ -71,7 +71,7 @@
@Override
- public void start() {
+ protected void preStart() {
final Map map = config.getAppenders();
int errors = 0;
if (map.containsKey(primaryRef)) {
@@ -87,13 +87,15 @@
LOGGER.error("Failover appender " + name + " is not configured");
}
}
- if (failoverAppenders.size() == 0) {
+ if (failoverAppenders.isEmpty()) {
LOGGER.error("No failover appenders are available");
++errors;
}
- if (errors == 0) {
- super.start();
+ if (errors > 0) {
+ // TODO: this is quite an interesting corner case...
+ throw new AppenderLoggingException("No appenders available to use");
}
+ super.preStart();
}
/**
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest2.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest2.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest2.java (revision )
@@ -16,20 +16,19 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
public class AsyncLoggerConfigTest2 {
@@ -43,7 +42,7 @@
"AsyncLoggerConfigTest2.xml");
final File f = new File("target", "AsyncLoggerConfigTest2.log");
assertTrue("Deleted old file before test", !f.exists() || f.delete());
-
+
final Logger log = LogManager.getLogger("com.foo.Bar");
final String msg = "Message before reconfig";
log.info(msg);
@@ -51,7 +50,7 @@
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
ctx.reconfigure();
-
+
final String msg2 = "Message after reconfig";
log.info(msg2);
((LifeCycle) LogManager.getContext()).stop(); // stop async thread
Index: log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java (revision )
@@ -124,8 +124,8 @@
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
final Layout extends Serializable> layout = getLayout();
if (layout != null) {
final byte[] bytes = layout.getFooter();
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/state/LifeCycle.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/state/LifeCycle.java (revision )
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/state/LifeCycle.java (revision )
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.logging.log4j.core.state;
+
+/**
+ * Common interface to all objects that follow the state life cycle.
+ */
+public interface LifeCycle {
+
+ /**
+ * Starts this object only if it is currently in the RESOLVED state.
+ */
+ void start();
+
+ /**
+ * Stops this object only if it is currently in the ACTIVE state.
+ */
+ void stop();
+
+ /**
+ * Returns the current state of this object.
+ *
+ * @return the current state.
+ */
+ Status getStatus();
+}
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestCachedThreadName.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestCachedThreadName.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestCachedThreadName.java (revision )
@@ -16,21 +16,20 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.helpers.Constants;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
public class AsyncLoggerTestCachedThreadName {
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java (revision )
@@ -16,21 +16,20 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.helpers.Constants;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
public class AsyncLoggerTest {
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java (revision )
@@ -17,7 +17,6 @@
package org.apache.logging.log4j.core.impl;
import java.net.URI;
-
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
@@ -25,6 +24,7 @@
import org.apache.logging.log4j.core.helpers.Loader;
import org.apache.logging.log4j.core.selector.ClassLoaderContextSelector;
import org.apache.logging.log4j.core.selector.ContextSelector;
+import org.apache.logging.log4j.core.state.Status;
import org.apache.logging.log4j.spi.LoggerContextFactory;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
@@ -72,7 +72,7 @@
final boolean currentContext) {
final LoggerContext ctx = selector.getContext(fqcn, loader, currentContext);
ctx.setExternalContext(externalContext);
- if (ctx.getStatus() == LoggerContext.Status.INITIALIZED) {
+ if (ctx.getStatus() == Status.RESOLVED) {
ctx.start();
}
return ctx;
@@ -94,7 +94,7 @@
if (externalContext != null && ctx.getExternalContext() == null) {
ctx.setExternalContext(externalContext);
}
- if (ctx.getStatus() == LoggerContext.Status.INITIALIZED) {
+ if (ctx.getStatus() == Status.RESOLVED) {
if (source != null) {
ContextAnchor.THREAD_CONTEXT.set(ctx);
final Configuration config = ConfigurationFactory.getInstance().getConfiguration(source);
@@ -124,7 +124,7 @@
if (externalContext != null && ctx.getExternalContext() == null) {
ctx.setExternalContext(externalContext);
}
- if (ctx.getStatus() == LoggerContext.Status.INITIALIZED) {
+ if (ctx.getStatus() == Status.RESOLVED) {
if (configLocation != null || name != null) {
ContextAnchor.THREAD_CONTEXT.set(ctx);
final Configuration config = ConfigurationFactory.getInstance().getConfiguration(name, configLocation);
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java (revision )
@@ -54,7 +54,7 @@
}
@Override
- public void start() {
+ protected void preStart() {
final Map map = config.getAppenders();
for (final AppenderRef ref : appenderRefs) {
final String name = ref.getRef();
@@ -67,12 +67,7 @@
LOGGER.error("Appender " + ref + " cannot be located. Reference ignored");
}
}
- super.start();
- }
-
- @Override
- public void stop() {
- super.stop();
+ super.preStart();
}
/**
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java (revision )
@@ -61,8 +61,8 @@
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
if (advertiser != null) {
advertiser.unadvertise(advertisement);
}
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompleteFileAppenderTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompleteFileAppenderTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompleteFileAppenderTest.java (revision )
@@ -16,19 +16,18 @@
*/
package org.apache.logging.log4j.core.appender;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
/**
* Tests a "complete" XML file a.k.a. a well-formed XML file.
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java (revision )
@@ -21,16 +21,16 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
+import org.apache.logging.log4j.core.state.Status;
import org.apache.logging.log4j.message.Message;
/**
@@ -42,7 +42,7 @@
private final List filters;
private final boolean hasFilters;
- private boolean isStarted;
+ private volatile Status status = Status.RESOLVED;
private CompositeFilter() {
this.filters = new ArrayList();
@@ -90,27 +90,47 @@
@Override
public void start() {
+ if (status == Status.RESOLVED) {
+ status = Status.STARTING;
+ try {
- for (final Filter filter : filters) {
- if (filter instanceof LifeCycle) {
- ((LifeCycle) filter).start();
- }
- }
+ for (final Filter filter : filters) {
+ if (filter instanceof LifeCycle) {
+ ((LifeCycle) filter).start();
+ }
+ }
- isStarted = true;
+ status = Status.ACTIVE;
+ } catch (final RuntimeException e) {
+ status = Status.RESOLVED;
+ throw e;
- }
+ }
+ }
+ }
@Override
public void stop() {
+ if (status == Status.ACTIVE) {
+ status = Status.STARTING;
+ try {
- for (final Filter filter : filters) {
- if (filter instanceof LifeCycle) {
- ((LifeCycle) filter).stop();
- }
- }
+ for (final Filter filter : filters) {
+ if (filter instanceof LifeCycle) {
+ ((LifeCycle) filter).stop();
+ }
+ }
- isStarted = false;
+ status = Status.ACTIVE;
+ } catch (final RuntimeException e) {
+ status = Status.RESOLVED;
+ throw e;
- }
+ }
+ }
+ }
@Override
+ public Status getStatus() {
+ return status;
+ }
+
public boolean isStarted() {
- return isStarted;
+ return status == Status.ACTIVE;
}
/**
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java (revision )
@@ -69,8 +69,8 @@
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
if (advertiser != null) {
advertiser.unadvertise(advertisement);
}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/web/Log4jWebInitializer.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/web/Log4jWebInitializer.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/web/Log4jWebInitializer.java (revision )
@@ -24,6 +24,7 @@
* The methods here are contained in a package-private sub-interface because general application code should not have
* access to them.
*/
+// TODO: replace with LifeCycle
interface Log4jWebInitializer extends Log4jWebSupport {
/**
* Starts up Log4j in the web application. Calls {@link #setLoggerContext()} after initialization is complete.
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlRandomAccessFileAppenderTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlRandomAccessFileAppenderTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlRandomAccessFileAppenderTest.java (revision )
@@ -16,20 +16,19 @@
*/
package org.apache.logging.log4j.core.appender;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
/**
* Tests a "complete" XML file a.k.a. a well-formed XML file.
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java (revision )
@@ -25,11 +25,12 @@
import org.apache.logging.log4j.core.filter.Filterable;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.net.Advertiser;
+import org.apache.logging.log4j.core.state.LifeCycle;
/**
* Interface that must be implemented to create a configuration.
*/
-public interface Configuration extends Filterable {
+public interface Configuration extends Filterable, LifeCycle {
/** Key for storing the Context properties. */
String CONTEXT_PROPERTIES = "ContextProperties";
@@ -69,10 +70,6 @@
void removeLogger(final String name);
Map getProperties();
-
- void start();
-
- void stop();
void addListener(ConfigurationListener listener);
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.java (revision )
@@ -16,19 +16,18 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
public class AsyncLoggerConfigTest {
@@ -42,7 +41,7 @@
public void testAdditivity() throws Exception {
final File f = new File("target", "AsyncLoggerConfigTest.log");
assertTrue("Deleted old file before test", !f.exists() || f.delete());
-
+
final Logger log = LogManager.getLogger("com.foo.Bar");
final String msg = "Additive logging: 2 for the price of 1!";
log.info(msg);
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java (revision )
@@ -80,7 +80,7 @@
}
@Override
- public void start() {
+ protected void preStart() {
final Map map = config.getAppenders();
final List appenders = new ArrayList();
for (final AppenderRef appenderRef : appenderRefs) {
@@ -106,12 +106,12 @@
}
thread.start();
- super.start();
+ super.preStart();
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
thread.shutdown();
try {
thread.join();
@@ -179,11 +179,11 @@
@PluginFactory
public static AsyncAppender createAppender(@PluginElement("AppenderRef") final AppenderRef[] appenderRefs,
@PluginAttribute("errorRef") @PluginAliases("error-ref") final String errorRef,
- @PluginAttribute("blocking") final String blocking,
+ @PluginAttribute("blocking") final String blocking,
@PluginAttribute("bufferSize") final String size,
@PluginAttribute("name") final String name,
@PluginAttribute("includeLocation") final String includeLocation,
- @PluginElement("Filter") final Filter filter,
+ @PluginElement("Filter") final Filter filter,
@PluginConfiguration final Configuration config,
@PluginAttribute("ignoreExceptions") final String ignore) {
if (name == null) {
@@ -265,7 +265,7 @@
* all registered {@code AppenderControl} objects, and returns {@code true}
* if at least one appender call was successful, {@code false} otherwise.
* Any exceptions are silently ignored.
- *
+ *
* @param event the event to forward to the registered appenders
* @return {@code true} if at least one appender call succeeded, {@code false} otherwise
*/
@@ -302,7 +302,7 @@
}
return result;
}
-
+
/**
* Returns {@code true} if this AsyncAppender will take a snapshot of the stack with
* every log event to determine the class and method where the logging call
@@ -312,7 +312,7 @@
public boolean isIncludeLocation() {
return includeLocation;
}
-
+
/**
* Returns {@code true} if this AsyncAppender will block when the queue is full,
* or {@code false} if events are dropped when the queue is full.
@@ -321,7 +321,7 @@
public boolean isBlocking() {
return blocking;
}
-
+
/**
* Returns the name of the appender that any errors are logged to or {@code null}.
* @return the name of the appender that any errors are logged to or {@code null}
@@ -329,11 +329,11 @@
public String getErrorRef() {
return errorRef;
}
-
+
public int getQueueCapacity() {
return queueSize;
}
-
+
public int getQueueRemainingCapacity() {
return queue.remainingCapacity();
}
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompactFileAsyncAppenderValidationTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompactFileAsyncAppenderValidationTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompactFileAsyncAppenderValidationTest.java (revision )
@@ -19,18 +19,16 @@
import java.io.File;
import java.io.IOException;
import java.net.URL;
-
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java (revision )
@@ -23,6 +23,7 @@
import org.apache.logging.log4j.core.appender.AppenderLoggingException;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.core.state.Status;
/**
* Wraps an {@link Appender} with details an appender implementation shouldn't need to know about.
@@ -80,7 +81,7 @@
try {
recursive.set(this);
- if (!appender.isStarted()) {
+ if (appender.getStatus() != Status.ACTIVE) {
appender.getHandler().error("Attempted to append to non-started appender " + appender.getName());
if (!appender.ignoreExceptions()) {
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java (revision )
@@ -78,19 +78,23 @@
}
@Override
- public final void start() {
+ protected void preStart() {
if (this.getManager() == null) {
LOGGER.error("No AbstractDatabaseManager set for the appender named [{}].", this.getName());
}
- super.start();
+ }
+
+ @Override
+ protected void postStart() {
+ super.postStart();
if (this.getManager() != null) {
this.getManager().startup();
}
}
@Override
- public final void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
if (this.getManager() != null) {
this.getManager().release();
}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/web/Log4jWebInitializerImpl.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/web/Log4jWebInitializerImpl.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/web/Log4jWebInitializerImpl.java (revision )
@@ -21,7 +21,6 @@
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletContext;
import javax.servlet.UnavailableException;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configurator;
@@ -33,11 +32,13 @@
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.selector.ContextSelector;
import org.apache.logging.log4j.core.selector.NamedContextSelector;
+import org.apache.logging.log4j.core.state.Status;
import org.apache.logging.log4j.spi.LoggerContextFactory;
/**
* This class initializes and deinitializes Log4j no matter how the initialization occurs.
*/
+// TODO: implements LifeCycle
final class Log4jWebInitializerImpl implements Log4jWebInitializer {
private static final Object MUTEX = new Object();
@@ -116,7 +117,7 @@
this.selector = (NamedContextSelector) selector;
loggerContext = this.selector.locateContext(this.name, this.servletContext, configLocation);
ContextAnchor.THREAD_CONTEXT.set(loggerContext);
- if (loggerContext.getStatus() == LoggerContext.Status.INITIALIZED) {
+ if (loggerContext.getStatus() == Status.RESOLVED) {
loggerContext.start();
}
ContextAnchor.THREAD_CONTEXT.remove();
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java (revision )
@@ -27,7 +27,7 @@
/**
* Appends log events as bytes to a byte output stream. The stream encoding is defined in the layout.
- *
+ *
* @param The kind of {@link OutputStreamManager} under management
*/
public abstract class AbstractOutputStreamAppender extends AbstractAppender {
@@ -67,7 +67,7 @@
/**
* Gets the manager.
- *
+ *
* @return the manager.
*/
public M getManager() {
@@ -88,19 +88,19 @@
}
@Override
- public void start() {
+ protected void preStart() {
if (getLayout() == null) {
- LOGGER.error("No layout set for the appender named [" + getName() + "].");
+ LOGGER.error("No layout set for the appender named [{}].", getName());
}
if (manager == null) {
- LOGGER.error("No OutputStreamManager set for the appender named [" + getName() + "].");
+ LOGGER.error("No OutputStreamManager set for the appender named [{}].", getName());
}
- super.start();
+ super.preStart();
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
manager.release();
}
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java (revision )
@@ -16,21 +16,20 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.helpers.Constants;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
public class AsyncLoggerLocationTest {
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/RunLog4j2.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/RunLog4j2.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/RunLog4j2.java (revision )
@@ -16,11 +16,10 @@
*/
package org.apache.logging.log4j.core.async.perftest;
+import com.lmax.disruptor.collections.Histogram;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
-
-import com.lmax.disruptor.collections.Histogram;
+import org.apache.logging.log4j.core.state.LifeCycle;
public class RunLog4j2 implements IPerfTestRunner {
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java (revision )
@@ -73,7 +73,7 @@
}
@Override
- public void start() {
+ protected void preStart() {
final Map map = config.getAppenders();
// Register all the static routes.
for (final Route route : routes.getRoutes()) {
@@ -87,12 +87,10 @@
}
}
}
- super.start();
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
final Map map = config.getAppenders();
for (final Map.Entry entry : appenders.entrySet()) {
final String name = entry.getValue().getAppender().getName();
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/state/Status.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/state/Status.java (revision )
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/state/Status.java (revision )
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.logging.log4j.core.state;
+
+/**
+ * Status in the life cycle an object may be in.
+ */
+public enum Status {
+ /**
+ * The default state of an object. Such an object can be started.
+ */
+ RESOLVED,
+ /**
+ * The state of an object during startup. Such an object can either become ACTIVE if successful, or RESOLVED if
+ * an exception occurs during start-up.
+ */
+ STARTING,
+ /**
+ * Indicates an object is currently ready to be used. This indicates no errors occurred during start-up. Such an
+ * object can be stopped.
+ */
+ ACTIVE,
+ /**
+ * The state of an object during shutdown. This will become RESOLVED afterward regardless of the success of the
+ * stop method.
+ */
+ STOPPING
+}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JSONConfiguration.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JSONConfiguration.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JSONConfiguration.java (revision )
@@ -116,11 +116,6 @@
}
@Override
- public void stop() {
- super.stop();
- }
-
- @Override
public void setup() {
final Iterator> iter = root.fields();
final List children = rootNode.getChildren();
Index: log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java (revision 1585589)
+++ log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java (revision )
@@ -104,8 +104,8 @@
}
@Override
- public void stop() {
- super.stop();
+ public void postStop() {
+ super.postStop();
manager.release();
}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java (revision )
@@ -17,11 +17,10 @@
package org.apache.logging.log4j.core.filter;
import java.util.Iterator;
-
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.apache.logging.log4j.status.StatusLogger;
/**
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/Appender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/Appender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/Appender.java (revision )
@@ -17,6 +17,7 @@
package org.apache.logging.log4j.core;
import java.io.Serializable;
+import org.apache.logging.log4j.core.state.LifeCycle;
/**
* Appends log events.
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java (revision )
@@ -25,6 +25,7 @@
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
import org.apache.logging.log4j.core.helpers.Integers;
+import org.apache.logging.log4j.core.state.Status;
/**
* Abstract base class for Appenders. Although Appenders do not have to extend this class, doing so
@@ -40,10 +41,7 @@
private final String name;
- /**
- * Appenders set this by calling super.start().
- */
- private boolean started = false;
+ private volatile Status status = Status.RESOLVED;
public static int parseInt(String s, int defaultValue) {
try {
@@ -149,11 +147,15 @@
* Returns true if the Appender is started, false otherwise.
* @return true if the Appender is started, false otherwise.
*/
- @Override
public boolean isStarted() {
- return started;
+ return status == Status.ACTIVE;
}
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
/**
* The handler must be set before the appender is started.
* @param handler The ErrorHandler to use.
@@ -174,18 +176,66 @@
* Start the Appender.
*/
@Override
- public void start() {
+ public final void start() {
+ if (status == Status.RESOLVED) {
+ status = Status.STARTING;
+ try {
+ preStart();
- startFilter();
+ startFilter();
- this.started = true;
+ postStart();
+ status = Status.ACTIVE;
+ } catch (final RuntimeException e) {
+ status = Status.RESOLVED;
+ throw e;
- }
+ }
+ }
+ }
/**
+ * Performs startup logic before the filters are started.
+ */
+ protected void preStart() {
+ // nothing by default
+ }
+
+ /**
+ * Performs startup logic after the filters are started.
+ */
+ protected void postStart() {
+ // nothing by default
+ }
+
+ /**
* Stop the Appender.
*/
@Override
- public void stop() {
- this.started = false;
+ public final void stop() {
+ if (status == Status.ACTIVE) {
+ status = Status.STOPPING;
+ try {
+ preStop();
- stopFilter();
+ stopFilter();
+ postStop();
+ status = Status.RESOLVED;
+ } catch (final RuntimeException e) {
+ status = Status.RESOLVED;
+ throw e;
+ }
+ }
+ }
+
+ /**
+ * Performs shutdown logic before the filters are stopped.
+ */
+ protected void preStop() {
+ // nothing by default
+ }
+
+ /**
+ * Performs shutdown logic after the filters are stopped.
+ */
+ protected void postStop() {
+ // nothing by default
}
@Override
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppenderRolloverTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppenderRolloverTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppenderRolloverTest.java (revision )
@@ -16,21 +16,18 @@
*/
package org.apache.logging.log4j.core.appender;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.*;
public class RollingRandomAccessFileAppenderRolloverTest {
@@ -71,7 +68,7 @@
log.warn(trigger);
((LifeCycle) LogManager.getContext()).stop(); // stop async thread
-
+
final int MAX_ATTEMPTS = 50;
int count = 0;
while (!after1.exists() && count++ < MAX_ATTEMPTS) {
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilter.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilter.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilter.java (revision )
@@ -19,9 +19,10 @@
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.state.LifeCycle;
+import org.apache.logging.log4j.core.state.Status;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.status.StatusLogger;
@@ -32,7 +33,7 @@
*
*/
public abstract class AbstractFilter implements Filter, LifeCycle {
-
+
/**
* Allow subclasses access to the status logger without creating another instance.
*/
@@ -48,7 +49,7 @@
*/
protected final Result onMismatch;
- private boolean started;
+ private volatile Status status = Status.RESOLVED;
/**
* The default constructor.
@@ -72,24 +73,36 @@
*/
@Override
public void start() {
- started = true;
+ if (status == Status.RESOLVED) {
+ status = Status.ACTIVE;
- }
+ }
+ }
/**
* Determine if the the Filter has started.
* @return true if the Filter is started, false otherwise.
*/
- @Override
public boolean isStarted() {
- return started;
+ return status == Status.ACTIVE;
}
/**
+ * Returns the state of this Filter.
+ * @return the state of this Filter.
+ */
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
* Mark the Filter as stopped.
*/
@Override
public void stop() {
- started = false;
+ if (status == Status.ACTIVE) {
+ status = Status.RESOLVED;
+ }
}
/**
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java (revision 1585589)
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-
-package org.apache.logging.log4j.core;
-
-/**
- *
- */
-public interface LifeCycle {
- void start();
-
- void stop();
-
- boolean isStarted();
-}
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompactFileAppenderTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompactFileAppenderTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/XmlCompactFileAppenderTest.java (revision )
@@ -16,19 +16,18 @@
*/
package org.apache.logging.log4j.core.appender;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
/**
* Tests a "compact" XML file, no extra spaces or end of lines.
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java (revision )
@@ -16,13 +16,13 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertTrue;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
public class AsyncLoggerContextTest {
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java (revision )
@@ -65,6 +65,7 @@
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.net.Advertiser;
import org.apache.logging.log4j.core.selector.ContextSelector;
+import org.apache.logging.log4j.core.state.Status;
import org.apache.logging.log4j.spi.LoggerContextFactory;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
@@ -127,6 +128,8 @@
private final boolean started = false;
+ private volatile Status status = Status.RESOLVED;
+
private final ConcurrentMap componentMap = new ConcurrentHashMap();
protected PluginManager pluginManager;
@@ -150,95 +153,114 @@
*/
@Override
public void start() {
+ if (status == Status.RESOLVED) {
+ status = Status.STARTING;
+ try {
- pluginManager.collectPlugins();
- PluginManager levelPlugins = new PluginManager("Level");
- levelPlugins.collectPlugins();
- Map> plugins = levelPlugins.getPlugins();
- if (plugins != null) {
- for (PluginType> type : plugins.values()) {
- try {
+ pluginManager.collectPlugins();
+ PluginManager levelPlugins = new PluginManager("Level");
+ levelPlugins.collectPlugins();
+ Map> plugins = levelPlugins.getPlugins();
+ if (plugins != null) {
+ for (PluginType> type : plugins.values()) {
+ try {
+ final Class> clazz = type.getPluginClass();
+ final ClassLoader cl = clazz.getClassLoader();
- // Cause the class to be initialized if it isn't already.
+ // Cause the class to be initialized if it isn't already.
- Class.forName(type.getPluginClass().getName(), true, type.getPluginClass().getClassLoader());
- } catch (Exception ex) {
+ cl.loadClass(clazz.getName());
+ } catch (final ClassNotFoundException ex) {
- LOGGER.error("Unable to initialize {} due to {}: {}", type.getPluginClass().getName(),
- ex.getClass().getSimpleName(), ex.getMessage());
- }
- }
- }
- setup();
- setupAdvertisement();
- doConfigure();
- for (final LoggerConfig logger : loggers.values()) {
- logger.startFilter();
- }
- for (final Appender appender : appenders.values()) {
- appender.start();
- }
- root.startFilter(); // LOG4J2-336
- startFilter();
+ LOGGER.error("Unable to initialize {} due to {}: {}", type.getPluginClass().getName(),
+ ex.getClass().getSimpleName(), ex.getMessage());
+ }
+ }
+ }
+ setup();
+ setupAdvertisement();
+ doConfigure();
+ for (final LoggerConfig logger : loggers.values()) {
+ logger.startFilter();
+ }
+ for (final Appender appender : appenders.values()) {
+ appender.start();
+ }
+ root.startFilter(); // LOG4J2-336
+ startFilter();
+ status = Status.ACTIVE;
+ } catch (final RuntimeException e) {
+ status = Status.RESOLVED;
+ throw e;
- }
+ }
+ }
+ }
/**
* Tear down the configuration.
*/
@Override
public void stop() {
-
+ if (status == Status.ACTIVE) {
+ status = Status.STOPPING;
- // LOG4J2-392 first stop AsyncLogger Disruptor thread
- final LoggerContextFactory factory = LogManager.getFactory();
- if (factory instanceof Log4jContextFactory) {
- ContextSelector selector = ((Log4jContextFactory) factory).getSelector();
- if (selector instanceof AsyncLoggerContextSelector) { // all loggers are async
- // TODO until LOG4J2-493 is fixed we can only stop AsyncLogger once!
- // but LoggerContext.setConfiguration will call config.stop()
- // every time the configuration changes...
- //
- // Uncomment the line below after LOG4J2-493 is fixed
- //AsyncLogger.stop();
- }
- }
- // similarly, first stop AsyncLoggerConfig Disruptor thread(s)
- Set alreadyStopped = new HashSet();
- for (final LoggerConfig logger : loggers.values()) {
- if (logger instanceof AsyncLoggerConfig) {
- logger.clearAppenders();
- logger.stopFilter();
- alreadyStopped.add(logger);
- }
- }
- if (root instanceof AsyncLoggerConfig) {
- root.stopFilter();
- alreadyStopped.add(root);
- }
+ // LOG4J2-392 first stop AsyncLogger Disruptor thread
+ final LoggerContextFactory factory = LogManager.getFactory();
+ if (factory instanceof Log4jContextFactory) {
+ ContextSelector selector = ((Log4jContextFactory) factory).getSelector();
+ if (selector instanceof AsyncLoggerContextSelector) { // all loggers are async
+ // TODO until LOG4J2-493 is fixed we can only stop AsyncLogger once!
+ // but LoggerContext.setConfiguration will call config.stop()
+ // every time the configuration changes...
+ //
+ // Uncomment the line below after LOG4J2-493 is fixed
+ //AsyncLogger.stop();
+ }
+ }
+ // similarly, first stop AsyncLoggerConfig Disruptor thread(s)
+ Set alreadyStopped = new HashSet();
+ for (final LoggerConfig logger : loggers.values()) {
+ if (logger instanceof AsyncLoggerConfig) {
+ logger.clearAppenders();
+ logger.stopFilter();
+ alreadyStopped.add(logger);
+ }
+ }
+ if (root instanceof AsyncLoggerConfig) {
+ root.stopFilter();
+ alreadyStopped.add(root);
+ }
- // Stop the appenders in reverse order in case they still have activity.
- final Appender[] array = appenders.values().toArray(new Appender[appenders.size()]);
+ // Stop the appenders in reverse order in case they still have activity.
+ final Appender[] array = appenders.values().toArray(new Appender[appenders.size()]);
- // LOG4J2-511, LOG4J2-392 stop AsyncAppenders first
- for (int i = array.length - 1; i >= 0; --i) {
- if (array[i] instanceof AsyncAppender) {
- array[i].stop();
- }
- }
- for (int i = array.length - 1; i >= 0; --i) {
+ // LOG4J2-511, LOG4J2-392 stop AsyncAppenders first
+ for (int i = array.length - 1; i >= 0; --i) {
+ if (array[i] instanceof AsyncAppender) {
+ array[i].stop();
+ }
+ }
+ for (int i = array.length - 1; i >= 0; --i) {
- if (array[i].isStarted()) { // then stop remaining Appenders
+ if (array[i].getStatus() == Status.ACTIVE) { // then stop remaining Appenders
- array[i].stop();
- }
- }
- for (final LoggerConfig logger : loggers.values()) {
- if (alreadyStopped.contains(logger)) {
- continue;
- }
- logger.clearAppenders();
- logger.stopFilter();
- }
- if (!alreadyStopped.contains(root)) {
- root.stopFilter();
- }
- stopFilter();
- if (advertiser != null && advertisement != null) {
- advertiser.unadvertise(advertisement);
- }
+ array[i].stop();
+ }
+ }
+ for (final LoggerConfig logger : loggers.values()) {
+ if (alreadyStopped.contains(logger)) {
+ continue;
+ }
+ logger.clearAppenders();
+ logger.stopFilter();
+ }
+ if (!alreadyStopped.contains(root)) {
+ root.stopFilter();
+ }
+ stopFilter();
+ if (advertiser != null && advertisement != null) {
+ advertiser.unadvertise(advertisement);
+ }
+ status = Status.RESOLVED;
+ }
+ }
+
+ @Override
+ public Status getStatus() {
+ return status;
}
@Override
Index: log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestUncachedThreadName.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestUncachedThreadName.java (revision 1585589)
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestUncachedThreadName.java (revision )
@@ -16,21 +16,20 @@
*/
package org.apache.logging.log4j.core.async;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.helpers.Constants;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
public class AsyncLoggerTestUncachedThreadName {
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java (revision )
@@ -67,8 +67,8 @@
}
@Override
- public void stop() {
- super.stop();
+ protected void postStop() {
+ super.postStop();
if (advertiser != null) {
advertiser.unadvertise(advertisement);
}
Index: log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java (revision 1585589)
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java (revision )
@@ -16,13 +16,22 @@
*/
package org.apache.logging.log4j.core.config;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector;
import org.apache.logging.log4j.core.config.plugins.Plugin;
@@ -38,20 +47,10 @@
import org.apache.logging.log4j.core.impl.DefaultLogEventFactory;
import org.apache.logging.log4j.core.impl.LogEventFactory;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
+import org.apache.logging.log4j.core.state.LifeCycle;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* Logger object that is created via configuration.