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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java (revision ) @@ -29,6 +29,7 @@ /** * Interface that must be implemented to create a configuration. */ +// TODO: extends LifeCycle public interface Configuration extends Filterable { /** Key for storing the Context properties. */ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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-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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ log4j-core/src/main/java/org/apache/logging/log4j/core/LifeCycle.java (revision 1585155) @@ -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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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; @@ -221,7 +222,7 @@ } } 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(); } } 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 1585155) +++ 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 1585155) +++ 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 1585155) +++ 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.