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 2012/08/08 06:28:23 UTC
svn commit: r1370663 - in /logging/log4j/log4j2/trunk:
core/src/main/java/org/apache/logging/log4j/core/config/
core/src/main/java/org/apache/logging/log4j/core/lookup/
core/src/test/java/org/apache/logging/log4j/core/config/
core/src/test/resources/ s...
Author: rgoers
Date: Wed Aug 8 04:28:22 2012
New Revision: 1370663
URL: http://svn.apache.org/viewvc?rev=1370663&view=rev
Log:
Fix Log4j2-65
Added:
logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationPropsTest.java
- copied, changed from r1370375, logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
logging/log4j/log4j2/trunk/core/src/test/resources/log4j-props.xml
Modified:
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/JSONConfiguration.java
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
logging/log4j/log4j2/trunk/src/changes/changes.xml
Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java?rev=1370663&r1=1370662&r2=1370663&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java Wed Aug 8 04:28:22 2012
@@ -83,7 +83,9 @@ public class BaseConfiguration extends F
private ConcurrentMap<String, LoggerConfig> loggers = new ConcurrentHashMap<String, LoggerConfig>();
- private StrSubstitutor subst = new StrSubstitutor();
+ private StrLookup tempLookup = new Interpolator();
+
+ private StrSubstitutor subst = new StrSubstitutor(tempLookup);
private LoggerConfig root = new LoggerConfig();
@@ -150,13 +152,13 @@ public class BaseConfiguration extends F
continue;
}
if (child.getName().equalsIgnoreCase("properties")) {
- if (subst.getVariableResolver() == null) {
+ if (tempLookup == subst.getVariableResolver()) {
subst.setVariableResolver((StrLookup) child.getObject());
} else {
LOGGER.error("Properties declaration must be the first element in the configuration");
}
continue;
- } else if (subst.getVariableResolver() == null) {
+ } else if (tempLookup == subst.getVariableResolver()) {
subst.setVariableResolver(new Interpolator(null));
}
if (child.getName().equalsIgnoreCase("appenders")) {
Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/JSONConfiguration.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/JSONConfiguration.java?rev=1370663&r1=1370662&r2=1370663&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/JSONConfiguration.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/JSONConfiguration.java Wed Aug 8 04:28:22 2012
@@ -51,6 +51,8 @@ public class JSONConfiguration extends B
private JsonNode root;
+ private List<String> messages = new ArrayList<String>();
+
public JSONConfiguration(InputSource source, File configFile) {
byte[] buffer;
@@ -69,18 +71,22 @@ public class JSONConfiguration extends B
boolean verbose = false;
for (Map.Entry<String, String> entry : rootNode.getAttributes().entrySet()) {
if ("status".equalsIgnoreCase(entry.getKey())) {
- status = Level.toLevel(entry.getValue().toUpperCase(), Level.OFF);
+ status = Level.toLevel(getSubst().replace(entry.getValue()).toUpperCase(), null);
+ if (status == null) {
+ status = Level.ERROR;
+ messages.add("Invalid status specified: " + entry.getValue() + ". Defaulting to ERROR");
+ }
} else if ("verbose".equalsIgnoreCase(entry.getKey())) {
- verbose = Boolean.parseBoolean(entry.getValue());
+ verbose = Boolean.parseBoolean(getSubst().replace(entry.getValue()));
} else if ("packages".equalsIgnoreCase(entry.getKey())) {
- String[] packages = entry.getValue().split(",");
+ String[] packages = getSubst().replace(entry.getValue()).split(",");
for (String p : packages) {
PluginManager.addPackage(p);
}
} else if ("name".equalsIgnoreCase(entry.getKey())) {
- setName(entry.getValue());
+ setName(getSubst().replace(entry.getValue()));
} else if ("monitorInterval".equalsIgnoreCase(entry.getKey())) {
- int interval = Integer.parseInt(entry.getValue());
+ int interval = Integer.parseInt(getSubst().replace(entry.getValue()));
if (interval > 0 && configFile != null) {
monitor = new FileConfigurationMonitor(configFile, listeners, interval);
}
@@ -105,6 +111,9 @@ public class JSONConfiguration extends B
listener.setFilters(VERBOSE_CLASSES);
}
((StatusLogger) LOGGER).registerListener(listener);
+ for (String msg : messages) {
+ LOGGER.error(msg);
+ }
}
if (getName() == null) {
setName(source.getSystemId());
Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java?rev=1370663&r1=1370662&r2=1370663&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java Wed Aug 8 04:28:22 2012
@@ -360,7 +360,13 @@ public class LoggerConfig extends Filter
}
List<AppenderRef> appenderRefs = Arrays.asList(refs);
- Level level = loggerLevel == null ? Level.ERROR : Level.valueOf(loggerLevel.toUpperCase());
+ Level level;
+ try {
+ level = loggerLevel == null ? Level.ERROR : Level.valueOf(loggerLevel.toUpperCase());
+ } catch (Exception ex) {
+ LOGGER.error("Invalid Log level specified: {}. Defaulting to Error", loggerLevel);
+ level = Level.ERROR;
+ }
String name = loggerName.equals("root") ? "" : loggerName;
boolean additive = additivity == null ? true : Boolean.parseBoolean(additivity);
@@ -379,7 +385,13 @@ public class LoggerConfig extends Filter
@PluginElement("appender-ref") AppenderRef[] refs,
@PluginElement("filters") Filter filter) {
List<AppenderRef> appenderRefs = Arrays.asList(refs);
- Level level = loggerLevel == null ? Level.ERROR : Level.valueOf(loggerLevel.toUpperCase());
+ Level level;
+ try {
+ level = loggerLevel == null ? Level.ERROR : Level.valueOf(loggerLevel.toUpperCase());
+ } catch (Exception ex) {
+ LOGGER.error("Invalid Log level specified: {}. Defaulting to Error", loggerLevel);
+ level = Level.ERROR;
+ }
boolean additive = additivity == null ? true : Boolean.parseBoolean(additivity);
return new LoggerConfig(LogManager.ROOT_LOGGER_NAME, appenderRefs, filter, level, additive);
Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java?rev=1370663&r1=1370662&r2=1370663&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java Wed Aug 8 04:28:22 2012
@@ -72,6 +72,8 @@ public class XMLConfiguration extends Ba
private Validator validator;
+ private List<String> messages = new ArrayList<String>();
+
public XMLConfiguration(InputSource source, File configFile) {
byte[] buffer = null;
@@ -87,22 +89,26 @@ public class XMLConfiguration extends Ba
for (Map.Entry<String, String> entry : attrs.entrySet()) {
if ("status".equalsIgnoreCase(entry.getKey())) {
- status = Level.toLevel(entry.getValue().toUpperCase(), Level.OFF);
+ status = Level.toLevel(getSubst().replace(entry.getValue()).toUpperCase(), null);
+ if (status == null) {
+ status = Level.ERROR;
+ messages.add("Invalid status specified: " + entry.getValue() + ". Defaulting to ERROR");
+ }
} else if ("verbose".equalsIgnoreCase(entry.getKey())) {
- verbose = Boolean.parseBoolean(entry.getValue());
- } else if ("packages".equalsIgnoreCase(entry.getKey())) {
+ verbose = Boolean.parseBoolean(getSubst().replace(entry.getValue()));
+ } else if ("packages".equalsIgnoreCase(getSubst().replace(entry.getKey()))) {
String[] packages = entry.getValue().split(",");
for (String p : packages) {
PluginManager.addPackage(p);
}
} else if ("name".equalsIgnoreCase(entry.getKey())) {
- setName(entry.getValue());
+ setName(getSubst().replace(entry.getValue()));
} else if ("strict".equalsIgnoreCase(entry.getKey())) {
- strict = Boolean.parseBoolean(entry.getValue());
+ strict = Boolean.parseBoolean(getSubst().replace(entry.getValue()));
} else if ("schema".equalsIgnoreCase(entry.getKey())) {
- schema = entry.getValue();
+ schema = getSubst().replace(entry.getValue());
} else if ("monitorInterval".equalsIgnoreCase(entry.getKey())) {
- int interval = Integer.parseInt(entry.getValue());
+ int interval = Integer.parseInt(getSubst().replace(entry.getValue()));
if (interval > 0 && configFile != null) {
monitor = new FileConfigurationMonitor(configFile, listeners, interval);
}
@@ -126,6 +132,9 @@ public class XMLConfiguration extends Ba
listener.setFilters(VERBOSE_CLASSES);
}
((StatusLogger) LOGGER).registerListener(listener);
+ for (String msg : messages) {
+ LOGGER.error(msg);
+ }
}
} catch (SAXException domEx) {
Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java?rev=1370663&r1=1370662&r2=1370663&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java Wed Aug 8 04:28:22 2012
@@ -55,6 +55,11 @@ public class Interpolator implements Str
}
}
+ public Interpolator() {
+ this.defaultLookup= new MapLookup(new HashMap<String, String>());
+ lookups.put("sys", new SystemPropertiesLookup());
+ }
+
/**
* Resolves the specified variable. This implementation will try to extract
* a variable prefix from the given variable name (the first colon (':') is
Copied: logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationPropsTest.java (from r1370375, logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java)
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationPropsTest.java?p2=logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationPropsTest.java&p1=logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java&r1=1370375&r2=1370663&rev=1370663&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java (original)
+++ logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationPropsTest.java Wed Aug 8 04:28:22 2012
@@ -35,31 +35,18 @@ import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.Map;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
/**
*
*/
-public class XMLConfigurationTest {
+public class XMLConfigurationPropsTest {
- private static final String CONFIG = "log4j-test1.xml";
+ private static final String CONFIG = "log4j-props.xml";
private static final String LOGFILE = "target/test.log";
@BeforeClass
public static void setupClass() {
- System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
- LoggerContext ctx = (LoggerContext) LogManager.getContext();
- Configuration config = ctx.getConfiguration();
- if (config instanceof XMLConfiguration) {
- String name = ((XMLConfiguration) config).getName();
- if (name == null || !name.equals("XMLConfigTest")) {
- ctx.reconfigure();
- }
- } else {
- ctx.reconfigure();
- }
}
@AfterClass
@@ -71,48 +58,42 @@ public class XMLConfigurationTest {
}
@Test
- public void testLogger() {
- Logger logger = LogManager.getLogger("org.apache.logging.log4j.test1.Test");
- assertTrue(logger instanceof org.apache.logging.log4j.core.Logger);
- org.apache.logging.log4j.core.Logger l = (org.apache.logging.log4j.core.Logger) logger;
- assertEquals(Level.DEBUG, l.getLevel());
- int filterCount = l.filterCount();
- assertTrue("number of filters - " + filterCount, filterCount == 1);
- Iterator<Filter> iter = l.getFilters();
- Filter filter = iter.next();
- assertTrue(filter instanceof ThreadContextMapFilter);
- Map<String, Appender> appenders = l.getAppenders();
- assertNotNull(appenders);
- assertTrue("number of appenders = " + appenders.size(), appenders.size() == 1);
- Appender a = appenders.get("STDOUT");
- assertNotNull(a);
- assertEquals(a.getName(), "STDOUT");
- }
-
- public void testConfiguredAppenders() {
+ public void testNoProps() {
+ System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
LoggerContext ctx = (LoggerContext) LogManager.getContext();
- Configuration c = ctx.getConfiguration();
- Map<String, Appender> apps = c.getAppenders();
- assertNotNull(apps);
- assertEquals(apps.size(), 3);
+ ctx.reconfigure();
+ Configuration config = ctx.getConfiguration();
+ assertTrue("Configuration is not an XMLConfiguration", config instanceof XMLConfiguration);
}
@Test
- public void logToFile() throws Exception {
- FileOutputStream fos = new FileOutputStream(LOGFILE, false);
- fos.flush();
- fos.close();
- Logger logger = LogManager.getLogger("org.apache.logging.log4j.test2.Test");
- logger.debug("This is a test");
- DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(LOGFILE)));
- int count = 0;
- String str = "";
- while (is.available() != 0) {
- str = is.readLine();
- ++count;
+ public void testWithConfigProp() {
+ System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
+ System.setProperty("log4j.level", "debug");
+ try {
+ LoggerContext ctx = (LoggerContext) LogManager.getContext();
+ ctx.reconfigure();
+ Configuration config = ctx.getConfiguration();
+ assertTrue("Configuration is not an XMLConfiguration", config instanceof XMLConfiguration);
+ } finally {
+ System.clearProperty("log4j.level");
+
}
- assertTrue("Incorrect count " + count, count == 1);
- assertTrue("Bad data", str.endsWith("This is a test"));
}
+ @Test
+ public void testWithProps() {
+ System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
+ System.setProperty("log4j.level", "debug");
+ System.setProperty("log.level", "debug");
+ try {
+ LoggerContext ctx = (LoggerContext) LogManager.getContext();
+ ctx.reconfigure();
+ Configuration config = ctx.getConfiguration();
+ assertTrue("Configuration is not an XMLConfiguration", config instanceof XMLConfiguration);
+ } finally {
+ System.clearProperty("log4j.level");
+ System.clearProperty("log.level");
+ }
+ }
}
Added: logging/log4j/log4j2/trunk/core/src/test/resources/log4j-props.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/resources/log4j-props.xml?rev=1370663&view=auto
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/test/resources/log4j-props.xml (added)
+++ logging/log4j/log4j2/trunk/core/src/test/resources/log4j-props.xml Wed Aug 8 04:28:22 2012
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration status="${sys:log4j.level}" strict="false" name="DSI" packages="com.terradue.dsione">
+ <appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="[%-5level] %msg%n" />
+ </Console>
+ </appenders>
+
+ <loggers>
+ <root level="${sys:log.level}">
+ <appender-ref ref="Console" />
+ </root>
+ </loggers>
+</configuration>
\ No newline at end of file
Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1370663&r1=1370662&r2=1370663&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Wed Aug 8 04:28:22 2012
@@ -22,6 +22,11 @@
</properties>
<body>
+ <release version="2.0-alpha2" date="TBD" description="Bug fixes and minor enhancements">
+ <action issue="LOG4J2-65" dev="rgoers">
+ Allow variable substitution on the configuration attributes and on the root log level.
+ </action>
+ </release>
<release version="2.0-alpha1" date="2012-07-29" description="Rewrite of Log4j">
<action issue="LOG4J2-60" dev="rgoers" type="add" due-to="Shane Kelly">
Added ability to filter on the appender-ref by adding either a level or a filter.