LOG4J2-1349: merged branch LOG4J2-1010&LOG4J2-1447 into branch LOG4J2-1349
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/7994789d Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/7994789d Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7994789d Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext Commit: 7994789d2d2cf85dcbb6518d36693d18082961f1 Parents: 5edcfe8 25148ca Author: rpopma <rpo...@apache.org> Authored: Mon Aug 29 00:11:12 2016 +0900 Committer: rpopma <rpo...@apache.org> Committed: Mon Aug 29 00:11:12 2016 +0900 ---------------------------------------------------------------------- log4j-api-scala_2.10/.gitignore | 3 + log4j-api-scala_2.10/pom.xml | 150 +++++ .../org/apache/logging/log4j/scala/Logger.scala | 592 +++++++++++++++++++ .../logging/log4j/scala/LoggerMacro.scala | 425 +++++++++++++ .../apache/logging/log4j/scala/Logging.scala | 30 + .../apache/logging/log4j/scala/LoggerTest.scala | 550 +++++++++++++++++ log4j-api-scala_2.11/.gitignore | 3 + log4j-api-scala_2.11/pom.xml | 150 +++++ .../org/apache/logging/log4j/scala/Logger.scala | 592 +++++++++++++++++++ .../logging/log4j/scala/LoggerMacro.scala | 425 +++++++++++++ .../apache/logging/log4j/scala/Logging.scala | 30 + .../apache/logging/log4j/scala/LoggerTest.scala | 550 +++++++++++++++++ log4j-bom/pom.xml | 12 + .../core/filter/DynamicThresholdFilter.java | 8 +- .../core/filter/ThreadContextMapFilter.java | 8 +- .../log4j/core/impl/ContextDataInjector.java | 28 +- .../core/impl/ContextDataInjectorFactory.java | 6 + .../core/impl/ThreadContextDataInjector.java | 22 + .../log4j/core/jackson/Initializers.java | 10 +- .../log4j/core/jackson/Log4jJsonModule.java | 9 +- .../core/jackson/Log4jJsonObjectMapper.java | 6 +- .../log4j/core/jackson/Log4jXmlModule.java | 6 +- .../core/jackson/Log4jXmlObjectMapper.java | 9 +- .../log4j/core/jackson/Log4jYamlModule.java | 9 +- .../core/jackson/Log4jYamlObjectMapper.java | 6 +- .../ThrowableProxyWithoutStacktraceMixIn.java | 77 +++ .../log4j/core/layout/JacksonFactory.java | 22 +- .../logging/log4j/core/layout/JsonLayout.java | 14 +- .../logging/log4j/core/layout/XmlLayout.java | 15 +- .../logging/log4j/core/layout/YamlLayout.java | 13 +- .../log4j/core/lookup/ContextMapLookup.java | 8 +- .../server/JsonInputStreamLogEventBridge.java | 2 +- .../logging/log4j/MarkerMixInXmlTest.java | 2 +- .../log4j/core/jackson/LevelMixInJsonTest.java | 2 +- .../jackson/StackTraceElementMixInTest.java | 2 +- .../log4j/core/layout/JsonLayoutTest.java | 59 +- .../log4j/core/layout/LogEventFixtures.java | 6 +- .../log4j/core/layout/XmlLayoutTest.java | 59 +- .../log4j/core/layout/YamlLayoutTest.java | 55 +- .../net/server/AbstractSocketServerTest.java | 4 +- log4j-samples/pom.xml | 1 + log4j-samples/scala-api/pom.xml | 65 ++ .../scala-api/src/main/resources/log4j2.xml | 32 + .../logging/log4j/scalasample/LoggingApp.scala | 31 + pom.xml | 12 + src/changes/changes.xml | 6 + src/site/site.xml | 1 + src/site/xdoc/manual/layouts.xml.vm | 15 + src/site/xdoc/manual/scala-api.xml | 91 +++ src/site/xdoc/maven-artifacts.xml.vm | 28 + src/site/xdoc/runtime-dependencies.xml | 7 + 51 files changed, 4140 insertions(+), 128 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7994789d/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7994789d/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7994789d/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjector.java ---------------------------------------------------------------------- diff --cc log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjector.java index 30d099e,7fe4c53..e26616d --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjector.java @@@ -18,9 -18,8 +18,10 @@@ package org.apache.logging.log4j.core.i import java.util.List; + import org.apache.logging.log4j.core.ContextData; import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.spi.ContextData; +import org.apache.logging.log4j.spi.MutableContextData; /** * Responsible for initializing the ContextData of LogEvents. Context data is data that is set by the application to be @@@ -30,12 -29,17 +31,17 @@@ * </p><p> * In some asynchronous models, work may be delegated to several threads, while conceptually this work shares the same * context. In such models, storing context data in {@code ThreadLocal} variables is not convenient or desirable. - * By specifying a custom {@code ContextDataInjectorFactory}, users can initialize log events with context data from - * any arbitrary context. + * Users can configure the {@code ContextDataInjectorFactory} to provide custom {@code ContextDataInjector} objects, + * in order to initialize log events with context data from any arbitrary context. + * </p><p> + * When providing a custom {@code ContextDataInjector}, be aware that the {@code ContextDataFactory} may be invoked + * multiple times by the various components in Log4j that need access to context data. + * This includes the object(s) that populate log events, but also various lookups and filters that look at + * context data to determine whether an event should be logged. * </p> * + * @see ContextData * @see ContextDataInjectorFactory - * @see org.apache.logging.log4j.core.ContextData * @see org.apache.logging.log4j.ThreadContext * @see ThreadContextDataInjector * @since 2.7 http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7994789d/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7994789d/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java ---------------------------------------------------------------------- diff --cc log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java index eeaaf4c,1e81f1d..0e31a9a --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java @@@ -106,11 -111,19 +114,18 @@@ public class ThreadContextDataInjecto // modified. copyProperties(props, reusable); - // TODO LOG4J2-1349 -// final MutableContextData immutableCopy = ((AbstractGarbageFreeMutableThreadContext) -// ThreadContext.getThreadContextMap()).getContextData(); -// reusable.putAll(immutableCopy); + final ContextData immutableCopy = ((MutableContextDataSupplier) ThreadContextAccess.getThreadContextMap()) + .getMutableContextData(); + reusable.putAll(immutableCopy); return reusable; } + + @Override + public ContextData rawContextData() { + // TODO LOG4J2-1349 + //return ((AbstractGarbageFreeMutableThreadContext) ThreadContext.getThreadContextMap()).getContextData(); + return null; + } } /** @@@ -133,19 -146,28 +148,26 @@@ */ @Override public MutableContextData injectContextData(final List<Property> props, final MutableContextData reusable) { - // TODO LOG4J2-1349 - -// // If there are no configuration properties we want to just return the ThreadContext's MutableContextData: -// // it is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy. -// final MutableContextData immutableCopy = ((AbstractCopyOnWriteMutableThreadContext) -// ThreadContext.getThreadContextMap()).getContextData(); -// if (props == null || props.isEmpty()) { -// return immutableCopy; -// } -// // However, if the list of Properties is non-empty we need to combine the properties and the ThreadContext -// // data. In that case we will copy the key-value pairs into the specified reusable MutableContextData. -// copyProperties(props, reusable); -// reusable.putAll(immutableCopy); + // If there are no configuration properties we want to just return the ThreadContext's MutableContextData: + // it is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy. + final MutableContextData immutableCopy = + ((MutableContextDataSupplier) ThreadContextAccess.getThreadContextMap()).getMutableContextData(); + if (props == null || props.isEmpty()) { + return immutableCopy; + } + // However, if the list of Properties is non-empty we need to combine the properties and the ThreadContext + // data. In that case we will copy the key-value pairs into the specified reusable MutableContextData. + copyProperties(props, reusable); + reusable.putAll(immutableCopy); return reusable; } + + @Override + public ContextData rawContextData() { + // TODO LOG4J2-1349 + //return ((AbstractCopyOnWriteMutableThreadContext) ThreadContext.getThreadContextMap()).getContextData(); + return null; + } } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7994789d/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java ---------------------------------------------------------------------- diff --cc log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java index eec5ad3,bfbc5ea..6bffb2b --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java @@@ -17,13 -17,11 +17,12 @@@ package org.apache.logging.log4j.core.lookup; import org.apache.logging.log4j.ThreadContext; -import org.apache.logging.log4j.core.ContextData; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; - import org.apache.logging.log4j.core.impl.ContextDataFactory; import org.apache.logging.log4j.core.impl.ContextDataInjector; import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory; +import org.apache.logging.log4j.spi.ContextData; +import org.apache.logging.log4j.spi.MutableContextData; /** * Looks up keys from the context. By default this is the {@link ThreadContext}, but users may