Author: rgoers
Date: Sat Jan 4 18:25:20 2014
New Revision: 1555400
URL: http://svn.apache.org/r1555400
Log:
LOG4J2-459 - Set external context when constructing the LoggerContext
Added:
logging/log4j/log4j2/trunk/log4j-core/src/test/resources/log4j-webvar.xml
Modified:
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContextFactory.java
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggerContextFactory.java
logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/TestLoggerContextFactory.java
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/web/WebLookupTest.java
logging/log4j/log4j2/trunk/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java
logging/log4j/log4j2/trunk/src/changes/changes.xml
Modified:
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
Sat Jan 4 18:25:20 2014
@@ -139,7 +139,7 @@ public class LogManager {
* @return The current LoggerContext.
*/
public static LoggerContext getContext() {
- return factory.getContext(LogManager.class.getName(), null, true);
+ return factory.getContext(LogManager.class.getName(), null, null,
true);
}
/**
@@ -152,7 +152,7 @@ public class LogManager {
* @return a LoggerContext.
*/
public static LoggerContext getContext(final boolean currentContext) {
- return factory.getContext(LogManager.class.getName(), null,
currentContext);
+ return factory.getContext(LogManager.class.getName(), null, null,
currentContext, null);
}
/**
@@ -167,7 +167,24 @@ public class LogManager {
* @return a LoggerContext.
*/
public static LoggerContext getContext(final ClassLoader loader, final
boolean currentContext) {
- return factory.getContext(LogManager.class.getName(), loader,
currentContext);
+ return factory.getContext(LogManager.class.getName(), loader, null,
currentContext);
+ }
+
+ /**
+ * Returns a LoggerContext.
+ *
+ * @param loader The ClassLoader for the context. If null the context will
attempt to determine the appropriate
+ * ClassLoader.
+ * @param currentContext if false the LoggerContext appropriate for the
caller of this method is returned. For
+ * example, in a web application if the caller is a class in WEB-INF/lib
then one LoggerContext may be
+ * returned and if the caller is a class in the container's classpath then
a different LoggerContext may be
+ * returned. If true then only a single LoggerContext will be returned.
+ * @param externalContext An external context (such as a ServletContext)
to be associated with the LoggerContext.
+ * @return a LoggerContext.
+ */
+ public static LoggerContext getContext(final ClassLoader loader, final
boolean currentContext,
+ final Object externalContext) {
+ return factory.getContext(LogManager.class.getName(), loader,
externalContext, currentContext);
}
/**
@@ -184,7 +201,25 @@ public class LogManager {
*/
public static LoggerContext getContext(final ClassLoader loader, final
boolean currentContext,
final URI configLocation) {
- return factory.getContext(LogManager.class.getName(), loader,
currentContext, configLocation);
+ return factory.getContext(LogManager.class.getName(), loader, null,
currentContext, configLocation);
+ }
+
+
+ /**
+ * Returns a LoggerContext.
+ *
+ * @param loader The ClassLoader for the context. If null the context will
attempt to determine the appropriate
+ * ClassLoader.
+ * @param currentContext if false the LoggerContext appropriate for the
caller of this method is returned. For
+ * example, in a web application if the caller is a class in WEB-INF/lib
then one LoggerContext may be
+ * returned and if the caller is a class in the container's classpath then
a different LoggerContext may be
+ * returned. If true then only a single LoggerContext will be returned.
+ * @param configLocation The URI for the configuration to use.
+ * @return a LoggerContext.
+ */
+ public static LoggerContext getContext(final ClassLoader loader, final
boolean currentContext,
+ final Object externalContext, final
URI configLocation) {
+ return factory.getContext(LogManager.class.getName(), loader,
externalContext, currentContext, configLocation);
}
/**
@@ -197,7 +232,7 @@ public class LogManager {
* @return a LoggerContext.
*/
protected static LoggerContext getContext(final String fqcn, final boolean
currentContext) {
- return factory.getContext(fqcn, null, currentContext);
+ return factory.getContext(fqcn, null, null, currentContext);
}
/**
@@ -213,7 +248,7 @@ public class LogManager {
*/
protected static LoggerContext getContext(final String fqcn, final
ClassLoader loader,
final boolean currentContext) {
- return factory.getContext(fqcn, loader, currentContext);
+ return factory.getContext(fqcn, loader, null, currentContext);
}
/**
@@ -384,7 +419,7 @@ public class LogManager {
*/
public static Logger getLogger(final String name) {
final String actualName = name != null ? name : getClassName(2);
- return factory.getContext(LogManager.class.getName(), null,
false).getLogger(actualName);
+ return factory.getContext(LogManager.class.getName(), null, null,
false).getLogger(actualName);
}
/**
@@ -397,7 +432,7 @@ public class LogManager {
*/
public static Logger getLogger(final String name, final MessageFactory
messageFactory) {
final String actualName = name != null ? name : getClassName(2);
- return factory.getContext(LogManager.class.getName(), null,
false).getLogger(actualName, messageFactory);
+ return factory.getContext(LogManager.class.getName(), null, null,
false).getLogger(actualName, messageFactory);
}
/**
@@ -408,7 +443,7 @@ public class LogManager {
* @return The Logger.
*/
protected static Logger getLogger(final String fqcn, final String name) {
- return factory.getContext(fqcn, null, false).getLogger(name);
+ return factory.getContext(fqcn, null, null, false).getLogger(name);
}
/**
Modified:
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContextFactory.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContextFactory.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContextFactory.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContextFactory.java
Sat Jan 4 18:25:20 2014
@@ -29,13 +29,14 @@ public class SimpleLoggerContextFactory
private static LoggerContext context = new SimpleLoggerContext();
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext) {
return context;
}
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext,
- final URI configLocation) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext, final URI
configLocation) {
return context;
}
Modified:
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggerContextFactory.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggerContextFactory.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggerContextFactory.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggerContextFactory.java
Sat Jan 4 18:25:20 2014
@@ -30,9 +30,10 @@ public interface LoggerContextFactory {
* @param loader The ClassLoader to use or null.
* @param currentContext If true returns the current Context, if false
returns the Context appropriate
* for the caller if a more appropriate Context can be determined.
+ * @param externalContext An external context (such as a ServletContext)
to be associated with the LoggerContext.
* @return The LoggerContext.
*/
- LoggerContext getContext(String fqcn, ClassLoader loader, boolean
currentContext);
+ LoggerContext getContext(String fqcn, ClassLoader loader, Object
externalContext, boolean currentContext);
/**
* Creates a {@link LoggerContext}.
@@ -42,9 +43,11 @@ public interface LoggerContextFactory {
* @param currentContext If true returns the current Context, if false
returns the Context appropriate
* for the caller if a more appropriate Context can be determined.
* @param configLocation The location of the configuration for the
LoggerContext.
+ * @param externalContext An external context (such as a ServletContext)
to be associated with the LoggerContext.
* @return The LoggerContext.
*/
- LoggerContext getContext(String fqcn, ClassLoader loader, boolean
currentContext, URI configLocation);
+ LoggerContext getContext(String fqcn, ClassLoader loader, Object
externalContext, boolean currentContext,
+ URI configLocation);
/**
* Removes knowledge of a LoggerContext.
Modified:
logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/TestLoggerContextFactory.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/TestLoggerContextFactory.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/TestLoggerContextFactory.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/TestLoggerContextFactory.java
Sat Jan 4 18:25:20 2014
@@ -29,13 +29,14 @@ public class TestLoggerContextFactory im
private static LoggerContext context = new TestLoggerContext();
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext) {
return context;
}
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext,
- final URI configLocation) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext, final URI
configLocation) {
return context;
}
Modified:
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
Sat Jan 4 18:25:20 2014
@@ -100,13 +100,11 @@ public final class Configurator {
final Object externalContext) {
try {
- final org.apache.logging.log4j.spi.LoggerContext context =
LogManager.getContext(loader, false, configLocation);
+ final org.apache.logging.log4j.spi.LoggerContext context =
LogManager.getContext(loader, false,
+ externalContext, configLocation);
if (context instanceof LoggerContext) {
final LoggerContext ctx = (LoggerContext) context;
ContextAnchor.THREAD_CONTEXT.set(ctx);
- if (externalContext != null) {
- ctx.setExternalContext(externalContext);
- }
final Configuration config =
ConfigurationFactory.getInstance().getConfiguration(name, configLocation);
ctx.start(config);
ContextAnchor.THREAD_CONTEXT.remove();
@@ -129,6 +127,21 @@ public final class Configurator {
*/
public static LoggerContext initialize(final ClassLoader loader,
final
ConfigurationFactory.ConfigurationSource source) {
+ return initialize(loader, source, null);
+ }
+
+ /**
+ * Initializes the Logging Context.
+ * @param loader The ClassLoader for the Context (or null).
+ * @param source The InputSource for the configuration.
+ * @param externalContext The external context to be attached to the
LoggerContext.
+ * @return The LoggerContext.
+ */
+
+ public static LoggerContext initialize(final ClassLoader loader,
+ final
ConfigurationFactory.ConfigurationSource source,
+ final Object externalContext)
+ {
try {
URI configLocation = null;
@@ -137,7 +150,8 @@ public final class Configurator {
} catch (final Exception ex) {
// Invalid source location.
}
- final org.apache.logging.log4j.spi.LoggerContext context =
LogManager.getContext(loader, false, configLocation);
+ final org.apache.logging.log4j.spi.LoggerContext context =
LogManager.getContext(loader, false,
+ externalContext, configLocation);
if (context instanceof LoggerContext) {
final LoggerContext ctx = (LoggerContext) context;
ContextAnchor.THREAD_CONTEXT.set(ctx);
Modified:
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
Sat Jan 4 18:25:20 2014
@@ -76,11 +76,14 @@ public class Log4jContextFactory impleme
* @param loader The ClassLoader to use or null.
* @param currentContext If true returns the current Context, if false
returns the Context appropriate
* for the caller if a more appropriate Context can be determined.
+ * @param externalContext An external context (such as a ServletContext)
to be associated with the LoggerContext.
* @return The LoggerContext.
*/
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext) {
final LoggerContext ctx = selector.getContext(fqcn, loader,
currentContext);
+ ctx.setExternalContext(externalContext);
if (ctx.getStatus() == LoggerContext.Status.INITIALIZED) {
ctx.start();
}
@@ -91,15 +94,19 @@ public class Log4jContextFactory impleme
* Load the LoggerContext using the ContextSelector.
* @param fqcn The fully qualified class name of the caller.
* @param loader The ClassLoader to use or null.
+ * @param externalContext An external context (such as a ServletContext)
to be associated with the LoggerContext.
* @param currentContext If true returns the current Context, if false
returns the Context appropriate
* for the caller if a more appropriate Context can be determined.
* @param configLocation The location of the configuration for the
LoggerContext.
* @return The LoggerContext.
*/
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext,
- final URI configLocation) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext, final URI
configLocation) {
final LoggerContext ctx = selector.getContext(fqcn, loader,
currentContext, configLocation);
+ if (externalContext != null && ctx.getExternalContext() == null) {
+ ctx.setExternalContext(externalContext);
+ }
if (ctx.getStatus() == LoggerContext.Status.INITIALIZED) {
ctx.start();
}
Modified:
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/web/WebLookupTest.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/web/WebLookupTest.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/web/WebLookupTest.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/web/WebLookupTest.java
Sat Jan 4 18:25:20 2014
@@ -16,7 +16,9 @@
*/
package org.apache.logging.log4j.core.web;
+import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.FileAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.impl.ContextAnchor;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
@@ -29,12 +31,15 @@ import javax.servlet.UnavailableExceptio
import org.springframework.mock.web.MockServletContext;
+import java.util.Map;
+
import static org.junit.Assert.*;
public class WebLookupTest {
@Test
public void testLookup() throws Exception {
+ ContextAnchor.THREAD_CONTEXT.remove();
ServletContext servletContext = new MockServletContext();
servletContext.setAttribute("TestAttr", "AttrValue");
servletContext.setInitParameter("TestParam", "ParamValue");
@@ -46,6 +51,7 @@ public class WebLookupTest {
initializer.setLoggerContext();
LoggerContext ctx = ContextAnchor.THREAD_CONTEXT.get();
assertNotNull("No LoggerContext", ctx);
+ assertNotNull("No ServletContext", ctx.getExternalContext());
Configuration config = ctx.getConfiguration();
assertNotNull("No Configuration", config);
StrSubstitutor substitutor = config.getStrSubstitutor();
@@ -65,6 +71,36 @@ public class WebLookupTest {
} catch (final UnavailableException e) {
fail("Failed to initialize Log4j properly." + e.getMessage());
}
+ initializer.deinitialize();
+ ContextAnchor.THREAD_CONTEXT.remove();
+ }
+
+ @Test
+ public void testLookup2() throws Exception {
+ ContextAnchor.THREAD_CONTEXT.remove();
+ ServletContext servletContext = new MockServletContext();
+ servletContext.setAttribute("TestAttr", "AttrValue");
+ servletContext.setInitParameter("myapp.logdir", "target");
+ servletContext.setAttribute("Name1", "Ben");
+ servletContext.setInitParameter("Name2", "Jerry");
+ servletContext.setInitParameter("log4jConfiguration",
"log4j-webvar.xml");
+ Log4jWebInitializer initializer =
Log4jWebInitializerImpl.getLog4jWebInitializer(servletContext);
+ initializer.initialize();
+ initializer.setLoggerContext();
+ LoggerContext ctx = ContextAnchor.THREAD_CONTEXT.get();
+ assertNotNull("No LoggerContext", ctx);
+ assertNotNull("No ServletContext", ctx.getExternalContext());
+ Configuration config = ctx.getConfiguration();
+ assertNotNull("No Configuration", config);
+ Map<String, Appender> appenders = config.getAppenders();
+ for (Map.Entry<String, Appender> entry : appenders.entrySet()) {
+ if (entry.getKey().equals("file")) {
+ FileAppender fa = (FileAppender) entry.getValue();
+ assertTrue("target/myapp.log".equals(fa.getFileName()));
+ }
+ }
+ initializer.deinitialize();
+ ContextAnchor.THREAD_CONTEXT.remove();
}
}
Added: logging/log4j/log4j2/trunk/log4j-core/src/test/resources/log4j-webvar.xml
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/resources/log4j-webvar.xml?rev=1555400&view=auto
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/test/resources/log4j-webvar.xml
(added)
+++ logging/log4j/log4j2/trunk/log4j-core/src/test/resources/log4j-webvar.xml
Sat Jan 4 18:25:20 2014
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN">
+ <Appenders>
+ <File name="file" fileName="${web:initParam.myapp.logdir}/myapp.log"
append="true">
+ <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+ </File>
+ </Appenders>
+ <Loggers>
+ <Root level="warn">
+ <AppenderRef ref="file"/>
+ </Root>
+ </Loggers>
+</Configuration>
\ No newline at end of file
Modified:
logging/log4j/log4j2/trunk/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java
Sat Jan 4 18:25:20 2014
@@ -43,13 +43,14 @@ public class SLF4JLoggerContextFactory i
}
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext) {
return context;
}
@Override
- public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final boolean currentContext,
- final URI configLocation) {
+ public LoggerContext getContext(final String fqcn, final ClassLoader
loader, final Object externalContext,
+ final boolean currentContext, final URI
configLocation) {
return context;
}
Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1555400&r1=1555399&r2=1555400&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Sat Jan 4 18:25:20 2014
@@ -21,6 +21,9 @@
</properties>
<body>
<release version="2.0-RC1" date="2013-MM-DD" description="Bug fixes and
enhancements">
+ <action issue="LOG4J2-459" dev="rgoers" type="fix">
+ Set external context when constructing the LoggerContext.
+ </action>
<action issue="LOG4J2-466" dev="rpopma" type="fix" due-to="Jan Tepke">
Cannot load log4j2 config file if path contains plus '+' characters.
</action>