You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2015/09/19 02:20:03 UTC
logging-log4j2 git commit: Change to update LoggerConfig if a new one
is created
Repository: logging-log4j2
Updated Branches:
refs/heads/LOG4J2-1121A [created] 3c8fc8c32
Change to update LoggerConfig if a new one is created
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3c8fc8c3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3c8fc8c3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3c8fc8c3
Branch: refs/heads/LOG4J2-1121A
Commit: 3c8fc8c321540951a31725fe6294b7e90b33650c
Parents: 3ecee80
Author: Ralph Goers <rg...@nextiva.com>
Authored: Fri Sep 18 17:19:24 2015 -0700
Committer: Ralph Goers <rg...@nextiva.com>
Committed: Fri Sep 18 17:19:24 2015 -0700
----------------------------------------------------------------------
.../logging/log4j/core/LoggerContext.java | 4 +++
.../core/config/AbstractConfiguration.java | 27 +++++++++++----
.../log4j/core/config/Configuration.java | 17 +++++++---
.../logging/log4j/core/config/LoggerConfig.java | 35 ++++++++++++++------
4 files changed, 62 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3c8fc8c3/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
index 0722323..d6ff89c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
@@ -163,6 +163,7 @@ public class LoggerContext extends AbstractLifeCycle implements org.apache.loggi
this.name = name;
this.externalContext = externalContext;
this.configLocation = configLocn;
+ this.config.setLoggerContext(this);
}
/**
@@ -176,6 +177,7 @@ public class LoggerContext extends AbstractLifeCycle implements org.apache.loggi
public LoggerContext(final String name, final Object externalContext, final String configLocn) {
this.name = name;
this.externalContext = externalContext;
+ this.config.setLoggerContext(this);
if (configLocn != null) {
URI uri;
try {
@@ -281,6 +283,7 @@ public class LoggerContext extends AbstractLifeCycle implements org.apache.loggi
}
final Configuration prev = config;
config = NULL_CONFIGURATION;
+ config.setLoggerContext(this);
updateLoggers();
prev.stop();
externalContext = null;
@@ -410,6 +413,7 @@ public class LoggerContext extends AbstractLifeCycle implements org.apache.loggi
try {
final Configuration prev = this.config;
config.addListener(this);
+ config.setLoggerContext(this);
final ConcurrentMap<String, String> map = config.getComponent(Configuration.CONTEXT_PROPERTIES);
try { // LOG4J2-719 network access may throw android.os.NetworkOnMainThreadException
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3c8fc8c3/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index 3614494..3c08cb3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -35,10 +35,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.*;
import org.apache.logging.log4j.core.appender.AsyncAppender;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.async.AsyncLoggerConfig;
@@ -108,6 +105,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
protected final List<String> pluginPackages = new ArrayList<>();
protected PluginManager pluginManager;
private final ConfigurationSource configurationSource;
+ private LoggerContext loggerContext = null;
/**
* Constructor.
@@ -135,6 +133,16 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
return properties;
}
+ @Override
+ public LoggerContext getLoggerContext() {
+ return loggerContext;
+ }
+
+ @Override
+ public void setLoggerContext(LoggerContext loggerContext) {
+ this.loggerContext = loggerContext;
+ }
+
/**
* Initialize the configuration.
*/
@@ -214,6 +222,8 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
// similarly, first stop AsyncLoggerConfig Disruptor thread(s)
final Set<LoggerConfig> alreadyStopped = new HashSet<>();
int asyncLoggerConfigCount = 0;
+ Configuration newConfiguration = loggerContext.getConfiguration();
+
for (final LoggerConfig logger : loggers.values()) {
if (logger instanceof AsyncLoggerConfig) {
// LOG4J2-520, LOG4J2-392:
@@ -221,12 +231,14 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
// have been stopped! Stopping the last AsyncLoggerConfig will
// shut down the disruptor and wait for all enqueued events to be processed.
// Only *after this* the appenders can be cleared or events will be lost.
+ logger.setNewConfig(newConfiguration.getLoggerConfig(logger.getName()));
logger.stop();
asyncLoggerConfigCount++;
alreadyStopped.add(logger);
}
}
if (root instanceof AsyncLoggerConfig & !alreadyStopped.contains(root)) { // LOG4J2-807
+ root.setNewConfig(newConfiguration.getRootLogger());
root.stop();
asyncLoggerConfigCount++;
alreadyStopped.add(root);
@@ -257,17 +269,17 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
int loggerCount = 0;
for (final LoggerConfig logger : loggers.values()) {
- // clear appenders, even if this logger is already stopped.
- logger.clearAppenders();
-
// AsyncLoggerConfigHelper decreases its ref count when an AsyncLoggerConfig is stopped.
// Stopping the same AsyncLoggerConfig twice results in an incorrect ref count and
// the shared Disruptor may be shut down prematurely, resulting in NPE or other errors.
if (alreadyStopped.contains(logger)) {
continue;
}
+ logger.setNewConfig(newConfiguration.getLoggerConfig(logger.getName()));
logger.stop();
loggerCount++;
+ // clear appenders, even if this logger is already stopped.
+ logger.clearAppenders();
}
LOGGER.trace("AbstractConfiguration stopped {} Loggers.", loggerCount);
@@ -275,6 +287,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
// Stopping the same AsyncLoggerConfig twice results in an incorrect ref count and
// the shared Disruptor may be shut down prematurely, resulting in NPE or other errors.
if (!alreadyStopped.contains(root)) {
+ root.setNewConfig(newConfiguration.getRootLogger());
root.stop();
}
super.stop();
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3c8fc8c3/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
index 4395069..56eae6c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
@@ -17,10 +17,7 @@
package org.apache.logging.log4j.core.config;
import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.*;
import org.apache.logging.log4j.core.filter.Filterable;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.net.Advertiser;
@@ -44,6 +41,18 @@ public interface Configuration extends Filterable {
String getName();
/**
+ * Returns the LoggerContext this configuration is associated with.
+ * @return The LoggerContext.
+ */
+ LoggerContext getLoggerContext();
+
+ /**
+ * Sets the LoggerContext for the Configuration.
+ * @param loggerContext The LoggerContext this configuration is owned by.
+ */
+ void setLoggerContext(LoggerContext loggerContext);
+
+ /**
* Locates the appropriate LoggerConfig for a Logger name. This will remove tokens from the package name as
* necessary or return the root LoggerConfig if no other matches were found.
*
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3c8fc8c3/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
index 6109c8f..7bf5a33 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
@@ -81,6 +81,7 @@ public class LoggerConfig extends AbstractFilterable {
private final Configuration config;
private final Lock shutdownLock = new ReentrantLock();
private final Condition noLogEvents = shutdownLock.newCondition(); // should only be used when shutdown == true
+ private LoggerConfig newConfig = null;
static {
final String factory = PropertiesUtil.getProperties().getStringProperty(Constants.LOG4J_LOG_EVENT_FACTORY);
@@ -152,6 +153,12 @@ public class LoggerConfig extends AbstractFilterable {
}
@Override
+ public void stop() {
+ waitForCompletion();
+ super.stop();
+ }
+
+ @Override
public Filter getFilter() {
return super.getFilter();
}
@@ -183,6 +190,10 @@ public class LoggerConfig extends AbstractFilterable {
return this.parent;
}
+ void setNewConfig(LoggerConfig loggerConfig) {
+ this.newConfig = loggerConfig;
+ }
+
/**
* Adds an Appender to the LoggerConfig.
*
@@ -228,7 +239,6 @@ public class LoggerConfig extends AbstractFilterable {
* Removes all Appenders.
*/
protected void clearAppenders() {
- waitForCompletion();
List<AppenderControl> copy = new ArrayList<AppenderControl>(appenders);
while (!copy.isEmpty()) {
appenders.removeAll(copy);
@@ -381,7 +391,7 @@ public class LoggerConfig extends AbstractFilterable {
try {
if (shutdown.compareAndSet(false, true)) {
int retries = 0;
- while (counter.get() > 0) {
+ while (counter.compareAndSet(0, Integer.MIN_VALUE)) {
try {
noLogEvents.await(retries + 1, TimeUnit.SECONDS);
} catch (final InterruptedException ie) {
@@ -402,18 +412,23 @@ public class LoggerConfig extends AbstractFilterable {
* @param event The log event.
*/
public void log(final LogEvent event) {
- beforeLogEvent();
- try {
- if (!isFiltered(event)) {
- processLogEvent(event);
+ if (beforeLogEvent()) {
+ try {
+ if (!isFiltered(event)) {
+ processLogEvent(event);
+ }
+ } finally {
+ afterLogEvent();
+ }
+ } else {
+ if (newConfig != null) {
+ newConfig.log(event);
}
- } finally {
- afterLogEvent();
}
}
- private void beforeLogEvent() {
- counter.incrementAndGet();
+ private boolean beforeLogEvent() {
+ return counter.incrementAndGet() > 0;
}
private void afterLogEvent() {