From b706c31ecc75891663ac96615b0f4517bb9f6653 Mon Sep 17 00:00:00 2001
From: Ralph Goers
Date: Mon, 6 Feb 2012 23:55:13 +0000
Subject: [PATCH 01/84] Make new home for Log4j2
git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/log4j2/trunk@1241269 13f79535-47bb-0310-9956-ffa450edef68
From 00ff9c311ce52aeb7ae0e4ca0775c7bfc2bd52f3 Mon Sep 17 00:00:00 2001
From: ggregory
Date: Wed, 9 Mar 2016 00:20:15 -0800
Subject: [PATCH 02/84] [LOG4J2-63] Support configuration from version 1.x
log4j.properties. A start, with the ConsoleAppender.
---
.../config/Log4j1ConfigurationFactory.java | 296 ++++++++++++++++++
1 file changed, 296 insertions(+)
create mode 100644 log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
new file mode 100644
index 00000000..470a3fe1
--- /dev/null
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -0,0 +1,296 @@
+/*
+ * 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.log4j.config;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.config.ConfigurationSource;
+import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
+import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.status.StatusLogger;
+
+/**
+ * Experimental ConfigurationFactory for Log4j 1.2 properties files.
+ *
+ * Currently supports:
+ *
+ *
+ * log4j.debug
+ * log4j.rootLogger
+ * log4j.logger
+ * log4j.appender
+ * org.apache.log4j.ConsoleAppender
+ * org.apache.log4j.PatternLayout
+ *
+ * Follow
+ * Target
+ * layout = org.apache.log4j.PatternLayout
+ * layout = org.apache.log4j.SimpleLayout
+ * layout.ConversionPattern
+ *
+ *
+ */
+// TODO
+// @Plugin(name = "Log4j1ConfigurationFactory", category = ConfigurationFactory.CATEGORY)
+//
+// Best Value?
+// @Order(50)
+public class Log4j1ConfigurationFactory extends ConfigurationFactory {
+
+ private Map buildClassToPropertyPrefixMap(final Properties properties,
+ final String[] sortedAppenderNames) {
+ final String prefix = "log4j.appender.";
+ final int preLength = prefix.length();
+ final Map map = new HashMap<>(sortedAppenderNames.length);
+ for (final Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ if (key.indexOf('.', preLength) < 0) {
+ final String name = key.substring(preLength);
+ if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
+ final Object value = entry.getValue();
+ if (value != null) {
+ map.put(name, value.toString());
+ }
+ }
+ }
+ }
+ }
+ }
+ return map;
+ }
+
+ private void buildConsoleAppender(final Properties properties, final String name,
+ final ConfigurationBuilder builder) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "CONSOLE");
+ buildConsoleAppenderTarget(properties, name, builder, appenderBuilder);
+ buildConsoleAppenderLayout(properties, name, builder, appenderBuilder);
+ buildConsoleAppenderFollow(properties, name, builder, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
+
+ private void buildConsoleAppenderLayout(final Properties properties, final String name,
+ final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
+ final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
+ if (layoutValue != null) {
+ final String cpValue = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
+ switch (layoutValue) {
+ case "org.apache.log4j.PatternLayout": {
+ final LayoutComponentBuilder layoutBuilder = newPatternLayout(builder, cpValue);
+ appenderBuilder.add(layoutBuilder);
+ break;
+ }
+ case "org.apache.log4j.SimpleLayout": {
+ final LayoutComponentBuilder layoutBuilder = newPatternLayout(builder, "%level - %m%n");
+ appenderBuilder.add(layoutBuilder);
+ break;
+ }
+ default:
+ reportWarning("Unsupported value for console appender layout: " + layoutValue);
+ }
+ }
+ }
+
+ private LayoutComponentBuilder newPatternLayout(final ConfigurationBuilder builder,
+ final String pattern) {
+ final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
+ if (pattern != null) {
+ layoutBuilder.addAttribute("pattern", pattern);
+ }
+ return layoutBuilder;
+ }
+
+ private void buildConsoleAppenderTarget(final Properties properties, final String name,
+ final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
+ final String value = getLog4jAppenderValue(properties, name, "Target", "System.out");
+ if (value != null) {
+ final Target target;
+ switch (value) {
+ case "System.out":
+ target = ConsoleAppender.Target.SYSTEM_OUT;
+ break;
+ case "System.err":
+ target = ConsoleAppender.Target.SYSTEM_ERR;
+ break;
+ default:
+ reportWarning("Unknow value for console Target: " + value);
+ target = null;
+ }
+ if (target != null) {
+ appenderBuilder.addAttribute("target", target);
+ }
+ }
+ }
+
+ private void buildConsoleAppenderFollow(final Properties properties, final String name,
+ final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
+ final String value = getLog4jAppenderValue(properties, name, "Follow", "false");
+ if (value != null) {
+ appenderBuilder.addAttribute("follow", Boolean.valueOf(value).booleanValue());
+ }
+ }
+
+ Configuration createConfiguration(final String configName, final URI configLocation,
+ final ConfigurationBuilder builder) throws IOException {
+ builder.setConfigurationName(configName);
+ final Properties properties = load(configLocation);
+ if (properties == null) {
+ return null;
+ }
+ // DEBUG
+ final String debugValue = getLog4jValue(properties, "debug");
+ if (Boolean.valueOf(debugValue)) {
+ builder.setStatusLevel(Level.DEBUG);
+ }
+ // Root
+ final String[] sortedAppenderNamesC = buildRootLogger(builder, getRootCategoryValue(properties));
+ final String[] sortedAppenderNamesL = buildRootLogger(builder, getRootLoggerValue(properties));
+ final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
+ : sortedAppenderNamesC;
+ // Appenders
+ final Map classNameToProperty = buildClassToPropertyPrefixMap(properties, sortedAppenderNames);
+ for (final Entry entry : classNameToProperty.entrySet()) {
+ final String appenderName = entry.getKey();
+ switch (entry.getValue()) {
+ case "org.apache.log4j.ConsoleAppender":
+ buildConsoleAppender(properties, appenderName, builder);
+ break;
+ default:
+ reportWarning("Ignoring appender " + appenderName
+ + "; consider porting your configuration file to the current Log4j format.");
+ }
+ }
+ // Loggers
+ buildLoggers(properties, "log4j.category.", builder);
+ buildLoggers(properties, "log4j.logger.", builder);
+ return builder.build();
+ }
+
+ private String[] buildRootLogger(final ConfigurationBuilder builder,
+ final String rootLoggerValue) {
+ if (rootLoggerValue == null) {
+ return new String[0];
+ }
+ final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
+ final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
+ builder.add(builder.newRootLogger(rootLoggerLevel));
+ final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
+ Arrays.sort(sortedAppenderNames);
+ return sortedAppenderNames;
+ }
+
+ private void buildLoggers(final Properties properties, final String prefix,
+ final ConfigurationBuilder builder) {
+ final int preLength = prefix.length();
+ for (final Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ final String name = key.substring(preLength);
+ final Object value = entry.getValue();
+ if (value != null) {
+ builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
+ }
+ }
+ }
+ }
+
+ }
+
+ @Override
+ public Configuration getConfiguration(final ConfigurationSource source) {
+ return getConfiguration(source.toString(), null);
+ }
+
+ @Override
+ public Configuration getConfiguration(final String name, final URI configLocation) {
+ try {
+ return createConfiguration(name, configLocation, newConfigurationBuilder());
+ } catch (final IOException e) {
+ StatusLogger.getLogger().error(e);
+ return null;
+ }
+ }
+
+ private String getLog4jAppenderValue(final Properties properties, final String appenderName,
+ final String attributeName, final String defaultValue) {
+ return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
+ }
+
+ private String getLog4jValue(final Properties properties, final String key) {
+ return properties.getProperty("log4j." + key);
+ }
+
+ private String getRootCategoryValue(final Properties properties) {
+ return getLog4jValue(properties, "rootCategory");
+ }
+
+ private String getRootLoggerValue(final Properties properties) {
+ return getLog4jValue(properties, "rootLogger");
+ }
+
+ @Override
+ protected String[] getSupportedTypes() {
+ return new String[] { "*.properties", ".xml" };
+ }
+
+ private Properties load(final URI uri) throws IOException {
+ final Properties properties = toProperties(uri);
+ final String rootCategoryValue = getRootCategoryValue(properties);
+ final String rootLoggerValue = getRootLoggerValue(properties);
+ if (rootCategoryValue == null && rootLoggerValue == null) {
+ // This is not a Log4j 1 properties file.
+ return null;
+ }
+ return properties;
+ }
+
+ private void reportWarning(final String msg) {
+ StatusLogger.getLogger().warn("Log4j version 1 to 2 configuration bridge: " + msg);
+
+ }
+
+ private Properties toProperties(final URI uri) throws IOException {
+ final Properties properties;
+ try (InputStream in = uri.toURL().openStream()) {
+ properties = new Properties();
+ if (uri.toString().endsWith(".xml")) {
+ properties.loadFromXML(in);
+ } else {
+ properties.load(in);
+ }
+ }
+ return properties;
+ }
+}
From 7993d6b6af10203931c4db1c52490a263494cb1c Mon Sep 17 00:00:00 2001
From: ggregory
Date: Wed, 9 Mar 2016 00:42:41 -0800
Subject: [PATCH 03/84] [LOG4J2-63] Support configuration from version 1.x
log4j.properties. Partial support for XML and HTML layouts (defaults only).
---
.../config/Log4j1ConfigurationFactory.java | 20 +++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 470a3fe1..0e5d8d61 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -54,6 +54,8 @@
* Target
* layout = org.apache.log4j.PatternLayout
* layout = org.apache.log4j.SimpleLayout
+ * layout = org.apache.log4j.HtmlLayout (partial)
+ * layout = org.apache.log4j.XmlLayout (partial)
* layout.ConversionPattern
*
*
@@ -94,25 +96,31 @@ private void buildConsoleAppender(final Properties properties, final String name
final ConfigurationBuilder builder) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "CONSOLE");
buildConsoleAppenderTarget(properties, name, builder, appenderBuilder);
- buildConsoleAppenderLayout(properties, name, builder, appenderBuilder);
+ buildAppenderLayout(properties, name, builder, appenderBuilder);
buildConsoleAppenderFollow(properties, name, builder, appenderBuilder);
builder.add(appenderBuilder);
}
- private void buildConsoleAppenderLayout(final Properties properties, final String name,
+ private void buildAppenderLayout(final Properties properties, final String name,
final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
if (layoutValue != null) {
final String cpValue = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
switch (layoutValue) {
case "org.apache.log4j.PatternLayout": {
- final LayoutComponentBuilder layoutBuilder = newPatternLayout(builder, cpValue);
- appenderBuilder.add(layoutBuilder);
+ appenderBuilder.add(newPatternLayout(builder, cpValue));
break;
}
case "org.apache.log4j.SimpleLayout": {
- final LayoutComponentBuilder layoutBuilder = newPatternLayout(builder, "%level - %m%n");
- appenderBuilder.add(layoutBuilder);
+ appenderBuilder.add(newPatternLayout(builder, "%level - %m%n"));
+ break;
+ }
+ case "org.apache.log4j.HTMLLayout": {
+ appenderBuilder.add(builder.newLayout("HtmlLayout"));
+ break;
+ }
+ case "org.apache.log4j.XMLLayout": {
+ appenderBuilder.add(builder.newLayout("XmlLayout"));
break;
}
default:
From 31de8a21d53bc0c83a85a2a23d10441e9576bae3 Mon Sep 17 00:00:00 2001
From: ggregory
Date: Wed, 9 Mar 2016 00:48:48 -0800
Subject: [PATCH 04/84] [LOG4J2-63] Support configuration from version 1.x
log4j.properties. Partial support for TTCC layout (defaults only).
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 0e5d8d61..4dcad77b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -54,6 +54,7 @@
* Target
* layout = org.apache.log4j.PatternLayout
* layout = org.apache.log4j.SimpleLayout
+ * layout = org.apache.log4j.TTCCLayout (partial)
* layout = org.apache.log4j.HtmlLayout (partial)
* layout = org.apache.log4j.XmlLayout (partial)
* layout.ConversionPattern
@@ -115,6 +116,11 @@ private void buildAppenderLayout(final Properties properties, final String name,
appenderBuilder.add(newPatternLayout(builder, "%level - %m%n"));
break;
}
+ case "org.apache.log4j.TTCCLayout": {
+ // TODO We do not have a %d for the time since the start of the app?
+ appenderBuilder.add(newPatternLayout(builder, "%d{UNIX_MILLIS} [%threadName] %level %logger - %m%n"));
+ break;
+ }
case "org.apache.log4j.HTMLLayout": {
appenderBuilder.add(builder.newLayout("HtmlLayout"));
break;
From 49c625ea75ef349b2ff15bf6e1220c3ccbc8aa9b Mon Sep 17 00:00:00 2001
From: ggregory
Date: Wed, 9 Mar 2016 00:57:46 -0800
Subject: [PATCH 05/84] [LOG4J2-63] Support configuration from version 1.x
log4j.properties. Partial support for EnhancedPatternLayout (defaults only).
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 4dcad77b..fc07c1c4 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -112,6 +112,10 @@ private void buildAppenderLayout(final Properties properties, final String name,
appenderBuilder.add(newPatternLayout(builder, cpValue));
break;
}
+ case "org.apache.log4j.EnhancedPatternLayout": {
+ appenderBuilder.add(newPatternLayout(builder, cpValue));
+ break;
+ }
case "org.apache.log4j.SimpleLayout": {
appenderBuilder.add(newPatternLayout(builder, "%level - %m%n"));
break;
From 46e65547156f6fce1b2c89f4f374104254a79841 Mon Sep 17 00:00:00 2001
From: ggregory
Date: Wed, 9 Mar 2016 09:50:00 -0800
Subject: [PATCH 06/84] [LOG4J2-63] Support configuration from version 1.x
log4j.properties. Complete TTCC layout.
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index fc07c1c4..578b2ab7 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -122,7 +122,7 @@ private void buildAppenderLayout(final Properties properties, final String name,
}
case "org.apache.log4j.TTCCLayout": {
// TODO We do not have a %d for the time since the start of the app?
- appenderBuilder.add(newPatternLayout(builder, "%d{UNIX_MILLIS} [%threadName] %level %logger - %m%n"));
+ appenderBuilder.add(newPatternLayout(builder, "%relative [%threadName] %level %logger - %m%n"));
break;
}
case "org.apache.log4j.HTMLLayout": {
From d32aee181d318a14f1dbc44959dd47c0529457b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sat, 13 Aug 2016 19:13:00 +0200
Subject: [PATCH 07/84] Add TODO
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 578b2ab7..fd509e09 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -122,6 +122,10 @@ private void buildAppenderLayout(final Properties properties, final String name,
}
case "org.apache.log4j.TTCCLayout": {
// TODO We do not have a %d for the time since the start of the app?
+
+ // TODO We miss the NDC here, and the Log4j 2's PatternLayout's %NDC is not compatible with Log4j 1's
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
appenderBuilder.add(newPatternLayout(builder, "%relative [%threadName] %level %logger - %m%n"));
break;
}
From 68bae4657801d64f160582425d0263de2b656530 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sat, 13 Aug 2016 19:23:18 +0200
Subject: [PATCH 08/84] Fix Layouts
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index fd509e09..fc49c2bb 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -53,10 +53,11 @@
* Follow
* Target
* layout = org.apache.log4j.PatternLayout
+ * layout = org.apache.log4j.EnhancedPatternLayout (partial?)
* layout = org.apache.log4j.SimpleLayout
* layout = org.apache.log4j.TTCCLayout (partial)
- * layout = org.apache.log4j.HtmlLayout (partial)
- * layout = org.apache.log4j.XmlLayout (partial)
+ * layout = org.apache.log4j.HTMLLayout (partial)
+ * layout = org.apache.log4j.xml.XMLLayout (partial)
* layout.ConversionPattern
*
*
@@ -133,7 +134,7 @@ private void buildAppenderLayout(final Properties properties, final String name,
appenderBuilder.add(builder.newLayout("HtmlLayout"));
break;
}
- case "org.apache.log4j.XMLLayout": {
+ case "org.apache.log4j.xml.XMLLayout": {
appenderBuilder.add(builder.newLayout("XmlLayout"));
break;
}
From 2f49b548a34609f0fe3f60586e450dd30d6c7973 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sat, 13 Aug 2016 21:24:33 +0200
Subject: [PATCH 09/84] TTCCLayout for Log4j 1.x compatibility
---
.../log4j/config/Log4j1ConfigurationFactory.java | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index fc49c2bb..5438d3b1 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -55,7 +55,7 @@
* layout = org.apache.log4j.PatternLayout
* layout = org.apache.log4j.EnhancedPatternLayout (partial?)
* layout = org.apache.log4j.SimpleLayout
- * layout = org.apache.log4j.TTCCLayout (partial)
+ * layout = org.apache.log4j.TTCCLayout
* layout = org.apache.log4j.HTMLLayout (partial)
* layout = org.apache.log4j.xml.XMLLayout (partial)
* layout.ConversionPattern
@@ -110,6 +110,11 @@ private void buildAppenderLayout(final Properties properties, final String name,
final String cpValue = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
switch (layoutValue) {
case "org.apache.log4j.PatternLayout": {
+ // TODO We do not have a %d for the time since the start of the app?
+
+ // TODO Log4j 2's PatternLayout's %NDC is not compatible with Log4j 1's
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
appenderBuilder.add(newPatternLayout(builder, cpValue));
break;
}
@@ -122,12 +127,7 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.TTCCLayout": {
- // TODO We do not have a %d for the time since the start of the app?
-
- // TODO We miss the NDC here, and the Log4j 2's PatternLayout's %NDC is not compatible with Log4j 1's
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- appenderBuilder.add(newPatternLayout(builder, "%relative [%threadName] %level %logger - %m%n"));
+ appenderBuilder.add(builder.newLayout("TTCCLayout"));
break;
}
case "org.apache.log4j.HTMLLayout": {
From c28ad40d088d36681114e146523ad57820a6c014 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sat, 13 Aug 2016 22:07:36 +0200
Subject: [PATCH 10/84] Add TODOs
---
.../config/Log4j1ConfigurationFactory.java | 27 ++++++++++++-------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 5438d3b1..020da5e2 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -52,10 +52,10 @@
*
* Follow
* Target
- * layout = org.apache.log4j.PatternLayout
- * layout = org.apache.log4j.EnhancedPatternLayout (partial?)
- * layout = org.apache.log4j.SimpleLayout
- * layout = org.apache.log4j.TTCCLayout
+ * layout = org.apache.log4j.PatternLayout (partial)
+ * layout = org.apache.log4j.EnhancedPatternLayout (partial)
+ * layout = org.apache.log4j.SimpleLayout (complete)
+ * layout = org.apache.log4j.TTCCLayout (complete)
* layout = org.apache.log4j.HTMLLayout (partial)
* layout = org.apache.log4j.xml.XMLLayout (partial)
* layout.ConversionPattern
@@ -110,15 +110,24 @@ private void buildAppenderLayout(final Properties properties, final String name,
final String cpValue = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
switch (layoutValue) {
case "org.apache.log4j.PatternLayout": {
- // TODO We do not have a %d for the time since the start of the app?
-
- // TODO Log4j 2's PatternLayout's %NDC is not compatible with Log4j 1's
+ // TODO Log4j 2's PatternLayout's %x (NDC) is not compatible with Log4j 1's %x
// Log4j 1: "foo bar baz"
// Log4j 2: "[foo, bar, baz]"
+ // TODO Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
+ // Log4j 1: "{{foo,bar},{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
appenderBuilder.add(newPatternLayout(builder, cpValue));
break;
}
case "org.apache.log4j.EnhancedPatternLayout": {
+ // TODO missing %ndc as alias for %NDC
+ // TODO missing %properties as alias for %MDC
+ // TODO Log4j 2's PatternLayout's %x (NDC) is not compatible with Log4j 1's %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // TODO Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
+ // Log4j 1: "{{foo,bar},{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
appenderBuilder.add(newPatternLayout(builder, cpValue));
break;
}
@@ -131,11 +140,11 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.HTMLLayout": {
- appenderBuilder.add(builder.newLayout("HtmlLayout"));
+ appenderBuilder.add(builder.newLayout("HtmlLayout")); // TODO check if compatible
break;
}
case "org.apache.log4j.xml.XMLLayout": {
- appenderBuilder.add(builder.newLayout("XmlLayout"));
+ appenderBuilder.add(builder.newLayout("XmlLayout")); // TODO check if compatible
break;
}
default:
From 930ae56c8ca8b35026438d7add4417463186b90a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sun, 14 Aug 2016 11:09:40 +0200
Subject: [PATCH 11/84] Do not try to use Log4j 2 XmlLayout in place of Log4j 1
XmlLayout
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 020da5e2..396d6b14 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -57,7 +57,6 @@
* layout = org.apache.log4j.SimpleLayout (complete)
* layout = org.apache.log4j.TTCCLayout (complete)
* layout = org.apache.log4j.HTMLLayout (partial)
- * layout = org.apache.log4j.xml.XMLLayout (partial)
* layout.ConversionPattern
*
*
@@ -144,11 +143,12 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.xml.XMLLayout": {
- appenderBuilder.add(builder.newLayout("XmlLayout")); // TODO check if compatible
+ // We cannot use the XmlLayout in Log4j 2 since it has a significantly different format
+ reportWarning("Log4j 1 XMLLayout is not supported");
break;
}
default:
- reportWarning("Unsupported value for console appender layout: " + layoutValue);
+ reportWarning("Unsupported layout: " + layoutValue);
}
}
}
From a567360c182f85be76c5e258410b1fb4377460e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sun, 14 Aug 2016 11:20:16 +0200
Subject: [PATCH 12/84] Fix comments
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 396d6b14..d3518977 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -54,9 +54,9 @@
* Target
* layout = org.apache.log4j.PatternLayout (partial)
* layout = org.apache.log4j.EnhancedPatternLayout (partial)
- * layout = org.apache.log4j.SimpleLayout (complete)
- * layout = org.apache.log4j.TTCCLayout (complete)
- * layout = org.apache.log4j.HTMLLayout (partial)
+ * layout = org.apache.log4j.SimpleLayout
+ * layout = org.apache.log4j.TTCCLayout
+ * layout = org.apache.log4j.HTMLLayout
* layout.ConversionPattern
*
*
@@ -139,7 +139,7 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.HTMLLayout": {
- appenderBuilder.add(builder.newLayout("HtmlLayout")); // TODO check if compatible
+ appenderBuilder.add(builder.newLayout("HtmlLayout"));
break;
}
case "org.apache.log4j.xml.XMLLayout": {
From 087fd9e99beaa114a4373146d929b0ad3da98c20 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sun, 14 Aug 2016 21:37:26 +0200
Subject: [PATCH 13/84] Ported Log4j 1's XMLLayout
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index d3518977..d0126bf0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -57,6 +57,7 @@
* layout = org.apache.log4j.SimpleLayout
* layout = org.apache.log4j.TTCCLayout
* layout = org.apache.log4j.HTMLLayout
+ * layout = org.apache.log4j.xml.XMLLayout
* layout.ConversionPattern
*
*
@@ -143,8 +144,7 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.xml.XMLLayout": {
- // We cannot use the XmlLayout in Log4j 2 since it has a significantly different format
- reportWarning("Log4j 1 XMLLayout is not supported");
+ appenderBuilder.add(builder.newLayout("Log4j1XmlLayout"));
break;
}
default:
From 42fe672ecfc559db1a3357666c062c8359dfe7f2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 17 Aug 2016 10:37:11 +0200
Subject: [PATCH 14/84] Support Log4j 1 TTCCLayout options
---
.../log4j/config/Log4j1ConfigurationFactory.java | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index d0126bf0..d88a23cd 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -107,19 +107,20 @@ private void buildAppenderLayout(final Properties properties, final String name,
final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
if (layoutValue != null) {
- final String cpValue = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
switch (layoutValue) {
case "org.apache.log4j.PatternLayout": {
+ final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
// TODO Log4j 2's PatternLayout's %x (NDC) is not compatible with Log4j 1's %x
// Log4j 1: "foo bar baz"
// Log4j 2: "[foo, bar, baz]"
// TODO Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
// Log4j 1: "{{foo,bar},{hoo,boo}}"
// Log4j 2: "{foo=bar,hoo=boo}"
- appenderBuilder.add(newPatternLayout(builder, cpValue));
+ appenderBuilder.add(newPatternLayout(builder, pattern));
break;
}
case "org.apache.log4j.EnhancedPatternLayout": {
+ final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
// TODO missing %ndc as alias for %NDC
// TODO missing %properties as alias for %MDC
// TODO Log4j 2's PatternLayout's %x (NDC) is not compatible with Log4j 1's %x
@@ -128,7 +129,7 @@ private void buildAppenderLayout(final Properties properties, final String name,
// TODO Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
// Log4j 1: "{{foo,bar},{hoo,boo}}"
// Log4j 2: "{foo=bar,hoo=boo}"
- appenderBuilder.add(newPatternLayout(builder, cpValue));
+ appenderBuilder.add(newPatternLayout(builder, pattern));
break;
}
case "org.apache.log4j.SimpleLayout": {
@@ -136,7 +137,14 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.TTCCLayout": {
- appenderBuilder.add(builder.newLayout("TTCCLayout"));
+ final LayoutComponentBuilder ttccLayout = builder.newLayout("TTCCLayout");
+ ttccLayout.addAttribute("threadPrinting",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ThreadPrinting", "true")));
+ ttccLayout.addAttribute("categoryPrefixing",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.CategoryPrefixing", "true")));
+ ttccLayout.addAttribute("contextPrinting",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ContextPrinting", "true")));
+ appenderBuilder.add(ttccLayout);
break;
}
case "org.apache.log4j.HTMLLayout": {
From 2d5a412253c22bfff52d585f849ed00a645d817e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 17 Aug 2016 10:57:37 +0200
Subject: [PATCH 15/84] Support Log4j 1 HtmlLayout options
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index d88a23cd..0848f4d0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -148,10 +148,16 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.HTMLLayout": {
- appenderBuilder.add(builder.newLayout("HtmlLayout"));
+ LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
+ htmlLayout.addAttribute("title",
+ getLog4jAppenderValue(properties, name, "layout.Title", "Log4J Log Messages"));
+ htmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+ appenderBuilder.add(htmlLayout);
break;
}
case "org.apache.log4j.xml.XMLLayout": {
+ // TODO support properties
appenderBuilder.add(builder.newLayout("Log4j1XmlLayout"));
break;
}
From be09fdbb97c6fb85fa87c915c94c60f44ddfe266 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 17 Aug 2016 11:52:17 +0200
Subject: [PATCH 16/84] Support Log4j 1 XmlLayout options
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 0848f4d0..0824fae8 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -157,8 +157,12 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.xml.XMLLayout": {
- // TODO support properties
- appenderBuilder.add(builder.newLayout("Log4j1XmlLayout"));
+ LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
+ xmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+ xmlLayout.addAttribute("properties",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.Properties", "false")));
+ appenderBuilder.add(xmlLayout);
break;
}
default:
From 7cb262af7d4977eaa43bb30fa9caf5fa257fd122 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 17 Aug 2016 14:00:57 +0200
Subject: [PATCH 17/84] Fix comment
---
.../java/org/apache/log4j/config/Log4j1ConfigurationFactory.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 0824fae8..492ff7c7 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -48,7 +48,6 @@
* log4j.logger
* log4j.appender
* org.apache.log4j.ConsoleAppender
- * org.apache.log4j.PatternLayout
*
* Follow
* Target
From d54e9c43c67e1c711d36cee674ec0d4a9b788969 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 17 Aug 2016 15:00:10 +0200
Subject: [PATCH 18/84] Support %properties in PatternLayout
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 492ff7c7..19acdaa1 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -121,13 +121,12 @@ private void buildAppenderLayout(final Properties properties, final String name,
case "org.apache.log4j.EnhancedPatternLayout": {
final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
// TODO missing %ndc as alias for %NDC
- // TODO missing %properties as alias for %MDC
// TODO Log4j 2's PatternLayout's %x (NDC) is not compatible with Log4j 1's %x
// Log4j 1: "foo bar baz"
// Log4j 2: "[foo, bar, baz]"
- // TODO Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
- // Log4j 1: "{{foo,bar},{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
+ // Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
+ // Log4j 1: "{{foo,bar}{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
appenderBuilder.add(newPatternLayout(builder, pattern));
break;
}
From 5d4e01a3fb77f4ec285f7f6361fab16608014df5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 17 Aug 2016 15:21:31 +0200
Subject: [PATCH 19/84] Support %ndc in PatternLayout
---
.../config/Log4j1ConfigurationFactory.java | 34 ++++++-------------
1 file changed, 11 insertions(+), 23 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 19acdaa1..427f57fc 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -51,13 +51,7 @@
*
* Follow
* Target
- * layout = org.apache.log4j.PatternLayout (partial)
- * layout = org.apache.log4j.EnhancedPatternLayout (partial)
- * layout = org.apache.log4j.SimpleLayout
- * layout = org.apache.log4j.TTCCLayout
- * layout = org.apache.log4j.HTMLLayout
- * layout = org.apache.log4j.xml.XMLLayout
- * layout.ConversionPattern
+ * layout
*
*
*/
@@ -107,26 +101,20 @@ private void buildAppenderLayout(final Properties properties, final String name,
final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
if (layoutValue != null) {
switch (layoutValue) {
- case "org.apache.log4j.PatternLayout": {
- final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
- // TODO Log4j 2's PatternLayout's %x (NDC) is not compatible with Log4j 1's %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // TODO Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
- // Log4j 1: "{{foo,bar},{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- appenderBuilder.add(newPatternLayout(builder, pattern));
- break;
- }
+ case "org.apache.log4j.PatternLayout":
case "org.apache.log4j.EnhancedPatternLayout": {
final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
- // TODO missing %ndc as alias for %NDC
- // TODO Log4j 2's PatternLayout's %x (NDC) is not compatible with Log4j 1's %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Log4j 2's PatternLayout's %X (MDC) is not compatible with Log4j 1's %X
+
+ // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // Use %ndc to get the Log4j 1 format
+
+ // Log4j 2's %X (MDC) is not compatible with Log4j 1's %X
// Log4j 1: "{{foo,bar}{hoo,boo}}"
// Log4j 2: "{foo=bar,hoo=boo}"
+ // Use %properties to get the Log4j 1 format
+
appenderBuilder.add(newPatternLayout(builder, pattern));
break;
}
From 6db69ac39f9b50edbcadf970f59d2391da64f42f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 17 Aug 2016 21:59:05 +0200
Subject: [PATCH 20/84] Fix name of console appender
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 427f57fc..f70468b1 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -89,7 +89,7 @@ private Map buildClassToPropertyPrefixMap(final Properties prope
private void buildConsoleAppender(final Properties properties, final String name,
final ConfigurationBuilder builder) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "CONSOLE");
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "Console");
buildConsoleAppenderTarget(properties, name, builder, appenderBuilder);
buildAppenderLayout(properties, name, builder, appenderBuilder);
buildConsoleAppenderFollow(properties, name, builder, appenderBuilder);
From 58f0370017342667ef46712cf73056c48608d3f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Thu, 18 Aug 2016 14:44:48 +0200
Subject: [PATCH 21/84] Fix AppenderRef
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index f70468b1..f8067e53 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -34,6 +34,7 @@
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.status.StatusLogger;
@@ -239,9 +240,13 @@ private String[] buildRootLogger(final ConfigurationBuilder
}
final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
- builder.add(builder.newRootLogger(rootLoggerLevel));
final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
Arrays.sort(sortedAppenderNames);
+ RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
+ for (String appender : sortedAppenderNames) {
+ loggerBuilder.add(builder.newAppenderRef(appender));
+ }
+ builder.add(loggerBuilder);
return sortedAppenderNames;
}
From fb98dcb53b60baabf3d6eebb14448c54c3cdde10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Thu, 18 Aug 2016 14:46:09 +0200
Subject: [PATCH 22/84] Remove TTCCLayout and use PatternLayout instead
---
.../config/Log4j1ConfigurationFactory.java | 21 ++++++++++++-------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index f8067e53..74563a54 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -124,14 +124,19 @@ private void buildAppenderLayout(final Properties properties, final String name,
break;
}
case "org.apache.log4j.TTCCLayout": {
- final LayoutComponentBuilder ttccLayout = builder.newLayout("TTCCLayout");
- ttccLayout.addAttribute("threadPrinting",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ThreadPrinting", "true")));
- ttccLayout.addAttribute("categoryPrefixing",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.CategoryPrefixing", "true")));
- ttccLayout.addAttribute("contextPrinting",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ContextPrinting", "true")));
- appenderBuilder.add(ttccLayout);
+ String pattern = "%r ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ThreadPrinting", "true"))) {
+ pattern += "[%t] ";
+ }
+ pattern += "%p ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.CategoryPrefixing", "true"))) {
+ pattern += "%c ";
+ }
+ if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ContextPrinting", "true"))) {
+ pattern += "%notEmpty{%ndc }";
+ }
+ pattern += "- %m%n";
+ appenderBuilder.add(newPatternLayout(builder, pattern));
break;
}
case "org.apache.log4j.HTMLLayout": {
From 8727a322f1daf01e7eaa1e0ca8b6098714060aa5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sun, 21 Aug 2016 11:16:20 +0200
Subject: [PATCH 23/84] Convert Log4j 1 pattern so it works properly in Log4j 2
---
.../config/Log4j1ConfigurationFactory.java | 20 ++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 74563a54..7fbb7295 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -104,17 +104,19 @@ private void buildAppenderLayout(final Properties properties, final String name,
switch (layoutValue) {
case "org.apache.log4j.PatternLayout":
case "org.apache.log4j.EnhancedPatternLayout": {
- final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null);
+ final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null)
- // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Use %ndc to get the Log4j 1 format
+ // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // Use %ndc to get the Log4j 1 format
+ .replace("%x", "%ndc")
- // Log4j 2's %X (MDC) is not compatible with Log4j 1's %X
- // Log4j 1: "{{foo,bar}{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- // Use %properties to get the Log4j 1 format
+ // Log4j 2's %X (MDC) is not compatible with Log4j 1's %X
+ // Log4j 1: "{{foo,bar}{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
+ // Use %properties to get the Log4j 1 format
+ .replace("%X", "%properties");
appenderBuilder.add(newPatternLayout(builder, pattern));
break;
From 5699c117dce680935f7fbf1018288d24b1259f42 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sun, 21 Aug 2016 12:03:01 +0200
Subject: [PATCH 24/84] Split Log4j1 config factory into tiny factory and
separate parser
---
.../config/Log4j1ConfigurationFactory.java | 311 +-----------------
.../config/Log4j1ConfigurationParser.java | 301 +++++++++++++++++
2 files changed, 313 insertions(+), 299 deletions(-)
create mode 100644 log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 7fbb7295..2ca2ac17 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -16,45 +16,17 @@
*/
package org.apache.log4j.config;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.core.appender.ConsoleAppender;
-import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
-import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
-import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import org.apache.logging.log4j.status.StatusLogger;
+
+import java.io.IOException;
/**
- * Experimental ConfigurationFactory for Log4j 1.2 properties files.
- *
- * Currently supports:
- *
- *
- * log4j.debug
- * log4j.rootLogger
- * log4j.logger
- * log4j.appender
- * org.apache.log4j.ConsoleAppender
- *
- * Follow
- * Target
- * layout
- *
- *
+ * Experimental ConfigurationFactory for Log4j 1.2 properties configuration files.
*/
// TODO
// @Plugin(name = "Log4j1ConfigurationFactory", category = ConfigurationFactory.CATEGORY)
@@ -63,282 +35,23 @@
// @Order(50)
public class Log4j1ConfigurationFactory extends ConfigurationFactory {
- private Map buildClassToPropertyPrefixMap(final Properties properties,
- final String[] sortedAppenderNames) {
- final String prefix = "log4j.appender.";
- final int preLength = prefix.length();
- final Map map = new HashMap<>(sortedAppenderNames.length);
- for (final Entry entry : properties.entrySet()) {
- final Object keyObj = entry.getKey();
- if (keyObj != null) {
- final String key = keyObj.toString();
- if (key.startsWith(prefix)) {
- if (key.indexOf('.', preLength) < 0) {
- final String name = key.substring(preLength);
- if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
- final Object value = entry.getValue();
- if (value != null) {
- map.put(name, value.toString());
- }
- }
- }
- }
- }
- }
- return map;
- }
-
- private void buildConsoleAppender(final Properties properties, final String name,
- final ConfigurationBuilder builder) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "Console");
- buildConsoleAppenderTarget(properties, name, builder, appenderBuilder);
- buildAppenderLayout(properties, name, builder, appenderBuilder);
- buildConsoleAppenderFollow(properties, name, builder, appenderBuilder);
- builder.add(appenderBuilder);
- }
-
- private void buildAppenderLayout(final Properties properties, final String name,
- final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
- final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
- if (layoutValue != null) {
- switch (layoutValue) {
- case "org.apache.log4j.PatternLayout":
- case "org.apache.log4j.EnhancedPatternLayout": {
- final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null)
-
- // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Use %ndc to get the Log4j 1 format
- .replace("%x", "%ndc")
-
- // Log4j 2's %X (MDC) is not compatible with Log4j 1's %X
- // Log4j 1: "{{foo,bar}{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- // Use %properties to get the Log4j 1 format
- .replace("%X", "%properties");
-
- appenderBuilder.add(newPatternLayout(builder, pattern));
- break;
- }
- case "org.apache.log4j.SimpleLayout": {
- appenderBuilder.add(newPatternLayout(builder, "%level - %m%n"));
- break;
- }
- case "org.apache.log4j.TTCCLayout": {
- String pattern = "%r ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ThreadPrinting", "true"))) {
- pattern += "[%t] ";
- }
- pattern += "%p ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.CategoryPrefixing", "true"))) {
- pattern += "%c ";
- }
- if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ContextPrinting", "true"))) {
- pattern += "%notEmpty{%ndc }";
- }
- pattern += "- %m%n";
- appenderBuilder.add(newPatternLayout(builder, pattern));
- break;
- }
- case "org.apache.log4j.HTMLLayout": {
- LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
- htmlLayout.addAttribute("title",
- getLog4jAppenderValue(properties, name, "layout.Title", "Log4J Log Messages"));
- htmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
- appenderBuilder.add(htmlLayout);
- break;
- }
- case "org.apache.log4j.xml.XMLLayout": {
- LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
- xmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
- xmlLayout.addAttribute("properties",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.Properties", "false")));
- appenderBuilder.add(xmlLayout);
- break;
- }
- default:
- reportWarning("Unsupported layout: " + layoutValue);
- }
- }
- }
-
- private LayoutComponentBuilder newPatternLayout(final ConfigurationBuilder builder,
- final String pattern) {
- final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
- if (pattern != null) {
- layoutBuilder.addAttribute("pattern", pattern);
- }
- return layoutBuilder;
- }
-
- private void buildConsoleAppenderTarget(final Properties properties, final String name,
- final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
- final String value = getLog4jAppenderValue(properties, name, "Target", "System.out");
- if (value != null) {
- final Target target;
- switch (value) {
- case "System.out":
- target = ConsoleAppender.Target.SYSTEM_OUT;
- break;
- case "System.err":
- target = ConsoleAppender.Target.SYSTEM_ERR;
- break;
- default:
- reportWarning("Unknow value for console Target: " + value);
- target = null;
- }
- if (target != null) {
- appenderBuilder.addAttribute("target", target);
- }
- }
- }
-
- private void buildConsoleAppenderFollow(final Properties properties, final String name,
- final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
- final String value = getLog4jAppenderValue(properties, name, "Follow", "false");
- if (value != null) {
- appenderBuilder.addAttribute("follow", Boolean.valueOf(value).booleanValue());
- }
- }
-
- Configuration createConfiguration(final String configName, final URI configLocation,
- final ConfigurationBuilder builder) throws IOException {
- builder.setConfigurationName(configName);
- final Properties properties = load(configLocation);
- if (properties == null) {
- return null;
- }
- // DEBUG
- final String debugValue = getLog4jValue(properties, "debug");
- if (Boolean.valueOf(debugValue)) {
- builder.setStatusLevel(Level.DEBUG);
- }
- // Root
- final String[] sortedAppenderNamesC = buildRootLogger(builder, getRootCategoryValue(properties));
- final String[] sortedAppenderNamesL = buildRootLogger(builder, getRootLoggerValue(properties));
- final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
- : sortedAppenderNamesC;
- // Appenders
- final Map classNameToProperty = buildClassToPropertyPrefixMap(properties, sortedAppenderNames);
- for (final Entry entry : classNameToProperty.entrySet()) {
- final String appenderName = entry.getKey();
- switch (entry.getValue()) {
- case "org.apache.log4j.ConsoleAppender":
- buildConsoleAppender(properties, appenderName, builder);
- break;
- default:
- reportWarning("Ignoring appender " + appenderName
- + "; consider porting your configuration file to the current Log4j format.");
- }
- }
- // Loggers
- buildLoggers(properties, "log4j.category.", builder);
- buildLoggers(properties, "log4j.logger.", builder);
- return builder.build();
- }
-
- private String[] buildRootLogger(final ConfigurationBuilder builder,
- final String rootLoggerValue) {
- if (rootLoggerValue == null) {
- return new String[0];
- }
- final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
- final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
- final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
- Arrays.sort(sortedAppenderNames);
- RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
- for (String appender : sortedAppenderNames) {
- loggerBuilder.add(builder.newAppenderRef(appender));
- }
- builder.add(loggerBuilder);
- return sortedAppenderNames;
- }
-
- private void buildLoggers(final Properties properties, final String prefix,
- final ConfigurationBuilder builder) {
- final int preLength = prefix.length();
- for (final Entry entry : properties.entrySet()) {
- final Object keyObj = entry.getKey();
- if (keyObj != null) {
- final String key = keyObj.toString();
- if (key.startsWith(prefix)) {
- final String name = key.substring(preLength);
- final Object value = entry.getValue();
- if (value != null) {
- builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
- }
- }
- }
- }
-
- }
+ private static final String[] SUFFIXES = {".properties"};
@Override
public Configuration getConfiguration(final ConfigurationSource source) {
- return getConfiguration(source.toString(), null);
- }
-
- @Override
- public Configuration getConfiguration(final String name, final URI configLocation) {
+ final ConfigurationBuilder builder;
try {
- return createConfiguration(name, configLocation, newConfigurationBuilder());
- } catch (final IOException e) {
- StatusLogger.getLogger().error(e);
- return null;
+ builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(source.getInputStream());
+ } catch (IOException e) {
+ throw new ConfigurationException("Unable to load " + source.toString(), e);
}
- }
-
- private String getLog4jAppenderValue(final Properties properties, final String appenderName,
- final String attributeName, final String defaultValue) {
- return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
- }
-
- private String getLog4jValue(final Properties properties, final String key) {
- return properties.getProperty("log4j." + key);
- }
-
- private String getRootCategoryValue(final Properties properties) {
- return getLog4jValue(properties, "rootCategory");
- }
-
- private String getRootLoggerValue(final Properties properties) {
- return getLog4jValue(properties, "rootLogger");
+ if (builder == null) return null;
+ return builder.build();
}
@Override
protected String[] getSupportedTypes() {
- return new String[] { "*.properties", ".xml" };
- }
-
- private Properties load(final URI uri) throws IOException {
- final Properties properties = toProperties(uri);
- final String rootCategoryValue = getRootCategoryValue(properties);
- final String rootLoggerValue = getRootLoggerValue(properties);
- if (rootCategoryValue == null && rootLoggerValue == null) {
- // This is not a Log4j 1 properties file.
- return null;
- }
- return properties;
+ return SUFFIXES;
}
- private void reportWarning(final String msg) {
- StatusLogger.getLogger().warn("Log4j version 1 to 2 configuration bridge: " + msg);
-
- }
-
- private Properties toProperties(final URI uri) throws IOException {
- final Properties properties;
- try (InputStream in = uri.toURL().openStream()) {
- properties = new Properties();
- if (uri.toString().endsWith(".xml")) {
- properties.loadFromXML(in);
- } else {
- properties.load(in);
- }
- }
- return properties;
- }
}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
new file mode 100644
index 00000000..f98f9099
--- /dev/null
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -0,0 +1,301 @@
+/*
+ * 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.log4j.config;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
+import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.status.StatusLogger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Experimental parser for Log4j 1.2 properties configuration files.
+ *
+ * Currently supports:
+ *
+ *
+ * log4j.debug
+ * log4j.rootLogger
+ * log4j.logger
+ * log4j.appender
+ * org.apache.log4j.ConsoleAppender
+ *
+ * Follow
+ * Target
+ * layout
+ *
+ *
+ */
+public class Log4j1ConfigurationParser {
+
+ /**
+ * Parse a Log4j 1.2 properties configuration file into a ConfigurationBuilder.
+ *
+ * @param input InputStream to read from, will not be closed.
+ * @return the populated ConfigurationBuilder
+ * @throws IOException if unable to read the input
+ */
+ public ConfigurationBuilder buildConfigurationBuilder(InputStream input) throws IOException {
+ final ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder();
+ builder.setConfigurationName("Log4j1");
+ final Properties properties = new Properties();
+ properties.load(input);
+ final String rootCategoryValue = getRootCategoryValue(properties);
+ final String rootLoggerValue = getRootLoggerValue(properties);
+ if (rootCategoryValue == null && rootLoggerValue == null) {
+ // This is not a Log4j 1 properties configuration file.
+ return null;
+ }
+ // DEBUG
+ final String debugValue = getLog4jValue(properties, "debug");
+ if (Boolean.valueOf(debugValue)) {
+ builder.setStatusLevel(Level.DEBUG);
+ }
+ // Root
+ final String[] sortedAppenderNamesC = buildRootLogger(builder, getRootCategoryValue(properties));
+ final String[] sortedAppenderNamesL = buildRootLogger(builder, getRootLoggerValue(properties));
+ final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
+ : sortedAppenderNamesC;
+ // Appenders
+ final Map classNameToProperty = buildClassToPropertyPrefixMap(properties, sortedAppenderNames);
+ for (final Map.Entry entry : classNameToProperty.entrySet()) {
+ final String appenderName = entry.getKey();
+ switch (entry.getValue()) {
+ case "org.apache.log4j.ConsoleAppender":
+ buildConsoleAppender(properties, appenderName, builder);
+ break;
+ default:
+ reportWarning("Ignoring appender " + appenderName
+ + "; consider porting your configuration file to the current Log4j format.");
+ }
+ }
+ // Loggers
+ buildLoggers(properties, "log4j.category.", builder);
+ buildLoggers(properties, "log4j.logger.", builder);
+ return builder;
+ }
+
+ private Map buildClassToPropertyPrefixMap(final Properties properties,
+ final String[] sortedAppenderNames) {
+ final String prefix = "log4j.appender.";
+ final int preLength = prefix.length();
+ final Map map = new HashMap<>(sortedAppenderNames.length);
+ for (final Map.Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ if (key.indexOf('.', preLength) < 0) {
+ final String name = key.substring(preLength);
+ if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
+ final Object value = entry.getValue();
+ if (value != null) {
+ map.put(name, value.toString());
+ }
+ }
+ }
+ }
+ }
+ }
+ return map;
+ }
+
+ private void buildConsoleAppender(final Properties properties, final String name,
+ final ConfigurationBuilder builder) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "Console");
+ buildConsoleAppenderTarget(properties, name, builder, appenderBuilder);
+ buildAppenderLayout(properties, name, builder, appenderBuilder);
+ buildConsoleAppenderFollow(properties, name, builder, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
+
+ private void buildAppenderLayout(final Properties properties, final String name,
+ final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
+ final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
+ if (layoutValue != null) {
+ switch (layoutValue) {
+ case "org.apache.log4j.PatternLayout":
+ case "org.apache.log4j.EnhancedPatternLayout": {
+ final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null)
+
+ // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // Use %ndc to get the Log4j 1 format
+ .replace("%x", "%ndc")
+
+ // Log4j 2's %X (MDC) is not compatible with Log4j 1's %X
+ // Log4j 1: "{{foo,bar}{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
+ // Use %properties to get the Log4j 1 format
+ .replace("%X", "%properties");
+
+ appenderBuilder.add(newPatternLayout(builder, pattern));
+ break;
+ }
+ case "org.apache.log4j.SimpleLayout": {
+ appenderBuilder.add(newPatternLayout(builder, "%level - %m%n"));
+ break;
+ }
+ case "org.apache.log4j.TTCCLayout": {
+ String pattern = "%r ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ThreadPrinting", "true"))) {
+ pattern += "[%t] ";
+ }
+ pattern += "%p ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.CategoryPrefixing", "true"))) {
+ pattern += "%c ";
+ }
+ if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ContextPrinting", "true"))) {
+ pattern += "%notEmpty{%ndc }";
+ }
+ pattern += "- %m%n";
+ appenderBuilder.add(newPatternLayout(builder, pattern));
+ break;
+ }
+ case "org.apache.log4j.HTMLLayout": {
+ LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
+ htmlLayout.addAttribute("title",
+ getLog4jAppenderValue(properties, name, "layout.Title", "Log4J Log Messages"));
+ htmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+ appenderBuilder.add(htmlLayout);
+ break;
+ }
+ case "org.apache.log4j.xml.XMLLayout": {
+ LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
+ xmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+ xmlLayout.addAttribute("properties",
+ Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.Properties", "false")));
+ appenderBuilder.add(xmlLayout);
+ break;
+ }
+ default:
+ reportWarning("Unsupported layout: " + layoutValue);
+ }
+ }
+ }
+
+ private LayoutComponentBuilder newPatternLayout(final ConfigurationBuilder builder,
+ final String pattern) {
+ final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
+ if (pattern != null) {
+ layoutBuilder.addAttribute("pattern", pattern);
+ }
+ return layoutBuilder;
+ }
+
+ private void buildConsoleAppenderTarget(final Properties properties, final String name,
+ final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
+ final String value = getLog4jAppenderValue(properties, name, "Target", "System.out");
+ if (value != null) {
+ final ConsoleAppender.Target target;
+ switch (value) {
+ case "System.out":
+ target = ConsoleAppender.Target.SYSTEM_OUT;
+ break;
+ case "System.err":
+ target = ConsoleAppender.Target.SYSTEM_ERR;
+ break;
+ default:
+ reportWarning("Unknow value for console Target: " + value);
+ target = null;
+ }
+ if (target != null) {
+ appenderBuilder.addAttribute("target", target);
+ }
+ }
+ }
+
+ private void buildConsoleAppenderFollow(final Properties properties, final String name,
+ final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
+ final String value = getLog4jAppenderValue(properties, name, "Follow", "false");
+ if (value != null) {
+ appenderBuilder.addAttribute("follow", Boolean.valueOf(value).booleanValue());
+ }
+ }
+
+ private String[] buildRootLogger(final ConfigurationBuilder builder,
+ final String rootLoggerValue) {
+ if (rootLoggerValue == null) {
+ return new String[0];
+ }
+ final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
+ final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
+ final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
+ Arrays.sort(sortedAppenderNames);
+ RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
+ for (String appender : sortedAppenderNames) {
+ loggerBuilder.add(builder.newAppenderRef(appender));
+ }
+ builder.add(loggerBuilder);
+ return sortedAppenderNames;
+ }
+
+ private void buildLoggers(final Properties properties, final String prefix,
+ final ConfigurationBuilder builder) {
+ final int preLength = prefix.length();
+ for (final Map.Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ final String name = key.substring(preLength);
+ final Object value = entry.getValue();
+ if (value != null) {
+ builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
+ }
+ }
+ }
+ }
+
+ }
+
+ private String getLog4jAppenderValue(final Properties properties, final String appenderName,
+ final String attributeName, final String defaultValue) {
+ return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
+ }
+
+ private String getLog4jValue(final Properties properties, final String key) {
+ return properties.getProperty("log4j." + key);
+ }
+
+ private String getRootCategoryValue(final Properties properties) {
+ return getLog4jValue(properties, "rootCategory");
+ }
+
+ private String getRootLoggerValue(final Properties properties) {
+ return getLog4jValue(properties, "rootLogger");
+ }
+
+ private void reportWarning(final String msg) {
+ StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
+ }
+
+}
From 41efb61725e354338893009005b005dac2926c8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Sun, 21 Aug 2016 12:36:46 +0200
Subject: [PATCH 25/84] Close input stream when done
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 2ca2ac17..b1b2dfeb 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -24,6 +24,7 @@
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import java.io.IOException;
+import java.io.InputStream;
/**
* Experimental ConfigurationFactory for Log4j 1.2 properties configuration files.
@@ -40,8 +41,8 @@ public class Log4j1ConfigurationFactory extends ConfigurationFactory {
@Override
public Configuration getConfiguration(final ConfigurationSource source) {
final ConfigurationBuilder builder;
- try {
- builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(source.getInputStream());
+ try (final InputStream configStream = source.getInputStream()) {
+ builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(configStream);
} catch (IOException e) {
throw new ConfigurationException("Unable to load " + source.toString(), e);
}
From fdd979040f863f5c17471481d11f9f3e83480f53 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 23 Aug 2016 20:58:38 -0700
Subject: [PATCH 26/84] First commit for branch for [LOG4J2-1547] The Core
AbstractConfiguration should track its LoggerContext.
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index b1b2dfeb..a974ed5c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -16,6 +16,10 @@
*/
package org.apache.log4j.config;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
@@ -23,9 +27,6 @@
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import java.io.IOException;
-import java.io.InputStream;
-
/**
* Experimental ConfigurationFactory for Log4j 1.2 properties configuration files.
*/
@@ -39,7 +40,7 @@ public class Log4j1ConfigurationFactory extends ConfigurationFactory {
private static final String[] SUFFIXES = {".properties"};
@Override
- public Configuration getConfiguration(final ConfigurationSource source) {
+ public Configuration getConfiguration(LoggerContext loggerContext, final ConfigurationSource source) {
final ConfigurationBuilder builder;
try (final InputStream configStream = source.getInputStream()) {
builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(configStream);
From 03a5a9edbfe1df903bd511211e3c73036c837082 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Thu, 25 Aug 2016 21:30:21 +0200
Subject: [PATCH 27/84] Code clean-up
---
.../config/Log4j1ConfigurationParser.java | 172 ++++++++----------
1 file changed, 80 insertions(+), 92 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index f98f9099..11f7f764 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -50,9 +50,14 @@
* layout
*
*
+ *
+ * This class is not thread-safe.
*/
public class Log4j1ConfigurationParser {
+ private final Properties properties = new Properties();
+ private final ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder();
+
/**
* Parse a Log4j 1.2 properties configuration file into a ConfigurationBuilder.
*
@@ -60,48 +65,39 @@ public class Log4j1ConfigurationParser {
* @return the populated ConfigurationBuilder
* @throws IOException if unable to read the input
*/
- public ConfigurationBuilder buildConfigurationBuilder(InputStream input) throws IOException {
- final ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder();
- builder.setConfigurationName("Log4j1");
- final Properties properties = new Properties();
+ public ConfigurationBuilder buildConfigurationBuilder(final InputStream input) throws IOException {
properties.load(input);
- final String rootCategoryValue = getRootCategoryValue(properties);
- final String rootLoggerValue = getRootLoggerValue(properties);
+ final String rootCategoryValue = getLog4jValue("rootCategory");
+ final String rootLoggerValue = getLog4jValue("rootLogger");
if (rootCategoryValue == null && rootLoggerValue == null) {
// This is not a Log4j 1 properties configuration file.
return null;
}
+ builder.setConfigurationName("Log4j1");
// DEBUG
- final String debugValue = getLog4jValue(properties, "debug");
+ final String debugValue = getLog4jValue("debug");
if (Boolean.valueOf(debugValue)) {
builder.setStatusLevel(Level.DEBUG);
}
// Root
- final String[] sortedAppenderNamesC = buildRootLogger(builder, getRootCategoryValue(properties));
- final String[] sortedAppenderNamesL = buildRootLogger(builder, getRootLoggerValue(properties));
+ final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue("rootCategory"));
+ final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue("rootLogger"));
final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
: sortedAppenderNamesC;
// Appenders
- final Map classNameToProperty = buildClassToPropertyPrefixMap(properties, sortedAppenderNames);
+ final Map classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
for (final Map.Entry entry : classNameToProperty.entrySet()) {
final String appenderName = entry.getKey();
- switch (entry.getValue()) {
- case "org.apache.log4j.ConsoleAppender":
- buildConsoleAppender(properties, appenderName, builder);
- break;
- default:
- reportWarning("Ignoring appender " + appenderName
- + "; consider porting your configuration file to the current Log4j format.");
- }
+ String appenderClass = entry.getValue();
+ buildAppender(appenderName, appenderClass);
}
// Loggers
- buildLoggers(properties, "log4j.category.", builder);
- buildLoggers(properties, "log4j.logger.", builder);
+ buildLoggers("log4j.category.");
+ buildLoggers("log4j.logger.");
return builder;
}
- private Map buildClassToPropertyPrefixMap(final Properties properties,
- final String[] sortedAppenderNames) {
+ private Map buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
final String prefix = "log4j.appender.";
final int preLength = prefix.length();
final Map map = new HashMap<>(sortedAppenderNames.length);
@@ -125,23 +121,56 @@ private Map buildClassToPropertyPrefixMap(final Properties prope
return map;
}
- private void buildConsoleAppender(final Properties properties, final String name,
- final ConfigurationBuilder builder) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, "Console");
- buildConsoleAppenderTarget(properties, name, builder, appenderBuilder);
- buildAppenderLayout(properties, name, builder, appenderBuilder);
- buildConsoleAppenderFollow(properties, name, builder, appenderBuilder);
+ private void buildAppender(final String appenderName, final String appenderClass) {
+ switch (appenderClass) {
+ case "org.apache.log4j.ConsoleAppender":
+ buildConsoleAppender(appenderName);
+ break;
+ default:
+ reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
+ }
+ }
+
+ private void buildConsoleAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Console");
+ final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
+ if (targetValue != null) {
+ final ConsoleAppender.Target target;
+ switch (targetValue) {
+ case "System.out":
+ target = ConsoleAppender.Target.SYSTEM_OUT;
+ break;
+ case "System.err":
+ target = ConsoleAppender.Target.SYSTEM_ERR;
+ break;
+ default:
+ reportWarning("Unknown value for console Target: " + targetValue);
+ target = null;
+ }
+ if (target != null) {
+ appenderBuilder.addAttribute("target", target);
+ }
+ }
+ buildAppenderAttribute(appenderName, appenderBuilder, "Follow", "false", "follow");
+ buildAppenderLayout(appenderName, appenderBuilder);
builder.add(appenderBuilder);
}
- private void buildAppenderLayout(final Properties properties, final String name,
- final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
- final String layoutValue = getLog4jAppenderValue(properties, name, "layout", null);
- if (layoutValue != null) {
- switch (layoutValue) {
+ private void buildAppenderAttribute(String appenderName, AppenderComponentBuilder appenderBuilder,
+ String sourceAttributeName, String defaultValue, String targetAttributeName) {
+ final String attributeValue = getLog4jAppenderValue(appenderName, sourceAttributeName, defaultValue);
+ if (attributeValue != null) {
+ appenderBuilder.addAttribute(targetAttributeName, attributeValue);
+ }
+ }
+
+ private void buildAppenderLayout(final String name, final AppenderComponentBuilder appenderBuilder) {
+ final String layoutClass = getLog4jAppenderValue(name, "layout", null);
+ if (layoutClass != null) {
+ switch (layoutClass) {
case "org.apache.log4j.PatternLayout":
case "org.apache.log4j.EnhancedPatternLayout": {
- final String pattern = getLog4jAppenderValue(properties, name, "layout.ConversionPattern", null)
+ final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
// Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
// Log4j 1: "foo bar baz"
@@ -155,55 +184,54 @@ private void buildAppenderLayout(final Properties properties, final String name,
// Use %properties to get the Log4j 1 format
.replace("%X", "%properties");
- appenderBuilder.add(newPatternLayout(builder, pattern));
+ appenderBuilder.add(newPatternLayout(pattern));
break;
}
case "org.apache.log4j.SimpleLayout": {
- appenderBuilder.add(newPatternLayout(builder, "%level - %m%n"));
+ appenderBuilder.add(newPatternLayout("%level - %m%n"));
break;
}
case "org.apache.log4j.TTCCLayout": {
String pattern = "%r ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ThreadPrinting", "true"))) {
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", "true"))) {
pattern += "[%t] ";
}
pattern += "%p ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.CategoryPrefixing", "true"))) {
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", "true"))) {
pattern += "%c ";
}
- if (Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.ContextPrinting", "true"))) {
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", "true"))) {
pattern += "%notEmpty{%ndc }";
}
pattern += "- %m%n";
- appenderBuilder.add(newPatternLayout(builder, pattern));
+ appenderBuilder.add(newPatternLayout(pattern));
break;
}
case "org.apache.log4j.HTMLLayout": {
LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
htmlLayout.addAttribute("title",
- getLog4jAppenderValue(properties, name, "layout.Title", "Log4J Log Messages"));
+ getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
htmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
appenderBuilder.add(htmlLayout);
break;
}
case "org.apache.log4j.xml.XMLLayout": {
LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
xmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.LocationInfo", "false")));
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
xmlLayout.addAttribute("properties",
- Boolean.parseBoolean(getLog4jAppenderValue(properties, name, "layout.Properties", "false")));
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", "false")));
appenderBuilder.add(xmlLayout);
break;
}
default:
- reportWarning("Unsupported layout: " + layoutValue);
+ reportWarning("Unknown layout class: " + layoutClass);
}
}
}
- private LayoutComponentBuilder newPatternLayout(final ConfigurationBuilder builder,
- final String pattern) {
+ private LayoutComponentBuilder newPatternLayout(final String pattern) {
final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
if (pattern != null) {
layoutBuilder.addAttribute("pattern", pattern);
@@ -211,38 +239,7 @@ private LayoutComponentBuilder newPatternLayout(final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
- final String value = getLog4jAppenderValue(properties, name, "Target", "System.out");
- if (value != null) {
- final ConsoleAppender.Target target;
- switch (value) {
- case "System.out":
- target = ConsoleAppender.Target.SYSTEM_OUT;
- break;
- case "System.err":
- target = ConsoleAppender.Target.SYSTEM_ERR;
- break;
- default:
- reportWarning("Unknow value for console Target: " + value);
- target = null;
- }
- if (target != null) {
- appenderBuilder.addAttribute("target", target);
- }
- }
- }
-
- private void buildConsoleAppenderFollow(final Properties properties, final String name,
- final ConfigurationBuilder builder, final AppenderComponentBuilder appenderBuilder) {
- final String value = getLog4jAppenderValue(properties, name, "Follow", "false");
- if (value != null) {
- appenderBuilder.addAttribute("follow", Boolean.valueOf(value).booleanValue());
- }
- }
-
- private String[] buildRootLogger(final ConfigurationBuilder builder,
- final String rootLoggerValue) {
+ private String[] buildRootLogger(final String rootLoggerValue) {
if (rootLoggerValue == null) {
return new String[0];
}
@@ -258,8 +255,7 @@ private String[] buildRootLogger(final ConfigurationBuilder
return sortedAppenderNames;
}
- private void buildLoggers(final Properties properties, final String prefix,
- final ConfigurationBuilder builder) {
+ private void buildLoggers(final String prefix) {
final int preLength = prefix.length();
for (final Map.Entry entry : properties.entrySet()) {
final Object keyObj = entry.getKey();
@@ -277,23 +273,15 @@ private void buildLoggers(final Properties properties, final String prefix,
}
- private String getLog4jAppenderValue(final Properties properties, final String appenderName,
- final String attributeName, final String defaultValue) {
+ private String getLog4jAppenderValue(final String appenderName, final String attributeName,
+ final String defaultValue) {
return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
}
- private String getLog4jValue(final Properties properties, final String key) {
+ private String getLog4jValue(final String key) {
return properties.getProperty("log4j." + key);
}
- private String getRootCategoryValue(final Properties properties) {
- return getLog4jValue(properties, "rootCategory");
- }
-
- private String getRootLoggerValue(final Properties properties) {
- return getLog4jValue(properties, "rootLogger");
- }
-
private void reportWarning(final String msg) {
StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
}
From a66429db68b5d194f202f1c7e4d2c4fa0a32368f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Thu, 25 Aug 2016 22:29:08 +0200
Subject: [PATCH 28/84] Support FileAppender
---
.../config/Log4j1ConfigurationParser.java | 48 +++++++++++++++++--
1 file changed, 43 insertions(+), 5 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 11f7f764..84b85338 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -19,6 +19,7 @@
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
@@ -126,6 +127,9 @@ private void buildAppender(final String appenderName, final String appenderClass
case "org.apache.log4j.ConsoleAppender":
buildConsoleAppender(appenderName);
break;
+ case "org.apache.log4j.FileAppender":
+ buildFileAppender(appenderName);
+ break;
default:
reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
}
@@ -151,16 +155,46 @@ private void buildConsoleAppender(final String appenderName) {
appenderBuilder.addAttribute("target", target);
}
}
- buildAppenderAttribute(appenderName, appenderBuilder, "Follow", "false", "follow");
+ buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
+ if ("false".equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
+ reportWarning("ImmediateFlush=false is not supported on Console appender");
+ }
buildAppenderLayout(appenderName, appenderBuilder);
builder.add(appenderBuilder);
}
- private void buildAppenderAttribute(String appenderName, AppenderComponentBuilder appenderBuilder,
- String sourceAttributeName, String defaultValue, String targetAttributeName) {
- final String attributeValue = getLog4jAppenderValue(appenderName, sourceAttributeName, defaultValue);
+ private void buildFileAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "File");
+ buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
+ buildAttribute(appenderName, appenderBuilder, "Append", "append");
+ buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
+ buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
+ buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
+ buildAppenderLayout(appenderName, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
+
+ private void buildAttribute(String componentName, ComponentBuilder componentBuilder,
+ String sourceAttributeName, String targetAttributeName) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
+ if (attributeValue != null) {
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ }
+ }
+
+ private void buildAttributeWithDefault(String componentName, ComponentBuilder componentBuilder,
+ String sourceAttributeName, String targetAttributeName, String defaultValue) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ }
+
+ private void buildMandatoryAttribute(String componentName, ComponentBuilder componentBuilder,
+ String sourceAttributeName, String targetAttributeName) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
- appenderBuilder.addAttribute(targetAttributeName, attributeValue);
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ } else {
+ reportWarning("Missing " + sourceAttributeName + " for " + componentName);
}
}
@@ -273,6 +307,10 @@ private void buildLoggers(final String prefix) {
}
+ private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
+ return properties.getProperty("log4j.appender." + appenderName + "." + attributeName);
+ }
+
private String getLog4jAppenderValue(final String appenderName, final String attributeName,
final String defaultValue) {
return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
From 54bd0486b2d6f0c6a037060b7f783b393cc6f14c Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 26 Aug 2016 08:32:50 -0700
Subject: [PATCH 29/84] Use final.
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index a974ed5c..0a6bf2a9 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -40,7 +40,7 @@ public class Log4j1ConfigurationFactory extends ConfigurationFactory {
private static final String[] SUFFIXES = {".properties"};
@Override
- public Configuration getConfiguration(LoggerContext loggerContext, final ConfigurationSource source) {
+ public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
final ConfigurationBuilder builder;
try (final InputStream configStream = source.getInputStream()) {
builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(configStream);
From 1a20761c098be90412d48f4f5bf783d2d81e7603 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 31 Aug 2016 11:18:29 +0200
Subject: [PATCH 30/84] Proof-of-concept for Log4j 1.x config conversion
---
.../config/Log4j1ConfigurationConverter.java | 41 +++++++++++++++++++
1 file changed, 41 insertions(+)
create mode 100644 log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
new file mode 100644
index 00000000..ed6a02f3
--- /dev/null
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -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.log4j.config;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
+import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+
+/**
+ * Tool for converting a Log4j 1.x properties configuration file to Log4j 2.x XML configuration file.
+ */
+public final class Log4j1ConfigurationConverter {
+
+ public static void main(String[] args) throws IOException {
+ try (InputStream input = args.length > 0 ? new FileInputStream(args[0]) : System.in;
+ OutputStream output = args.length > 1 ? new FileOutputStream(args[1]) : System.out) {
+ ConfigurationBuilder builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
+ builder.writeXmlConfiguration(output);
+ }
+ }
+
+}
From 4d2caf0b1399ea57a905cc55b160bcb01ca7adc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 31 Aug 2016 11:40:12 +0200
Subject: [PATCH 31/84] Fix error handling in Log4j 1 configuration
---
.../config/Log4j1ConfigurationFactory.java | 1 -
.../config/Log4j1ConfigurationParser.java | 20 ++++++++++---------
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 0a6bf2a9..d6eb4445 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -47,7 +47,6 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
} catch (IOException e) {
throw new ConfigurationException("Unable to load " + source.toString(), e);
}
- if (builder == null) return null;
return builder.build();
}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 84b85338..9356584b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -16,8 +16,16 @@
*/
package org.apache.log4j.config;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
@@ -27,13 +35,6 @@
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.status.StatusLogger;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
/**
* Experimental parser for Log4j 1.2 properties configuration files.
*
@@ -63,8 +64,9 @@ public class Log4j1ConfigurationParser {
* Parse a Log4j 1.2 properties configuration file into a ConfigurationBuilder.
*
* @param input InputStream to read from, will not be closed.
- * @return the populated ConfigurationBuilder
+ * @return the populated ConfigurationBuilder, never {@literal null}
* @throws IOException if unable to read the input
+ * @throws ConfigurationException if the input does not contain a valid configuration
*/
public ConfigurationBuilder buildConfigurationBuilder(final InputStream input) throws IOException {
properties.load(input);
@@ -72,7 +74,7 @@ public ConfigurationBuilder buildConfigurationBuilder(final
final String rootLoggerValue = getLog4jValue("rootLogger");
if (rootCategoryValue == null && rootLoggerValue == null) {
// This is not a Log4j 1 properties configuration file.
- return null;
+ throw new ConfigurationException("Input does not contain a valid Log4j 1.x properties configuration");
}
builder.setConfigurationName("Log4j1");
// DEBUG
From 016e894600f406d8942ca46c29f9d2791e402c8a Mon Sep 17 00:00:00 2001
From: ggregory
Date: Wed, 31 Aug 2016 08:26:16 -0700
Subject: [PATCH 32/84] Format nit.
---
.../org/apache/log4j/config/Log4j1ConfigurationConverter.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index ed6a02f3..ab09f4be 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -32,7 +32,7 @@ public final class Log4j1ConfigurationConverter {
public static void main(String[] args) throws IOException {
try (InputStream input = args.length > 0 ? new FileInputStream(args[0]) : System.in;
- OutputStream output = args.length > 1 ? new FileOutputStream(args[1]) : System.out) {
+ OutputStream output = args.length > 1 ? new FileOutputStream(args[1]) : System.out) {
ConfigurationBuilder builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
builder.writeXmlConfiguration(output);
}
From 844685d3e27911da68f65e6605e6376b0e04bf13 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 6 Sep 2016 23:00:21 -0400
Subject: [PATCH 33/84] Add final modifier to method parameters
---
.../log4j/config/Log4j1ConfigurationConverter.java | 2 +-
.../log4j/config/Log4j1ConfigurationParser.java | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index ab09f4be..3cfb8880 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -30,7 +30,7 @@
*/
public final class Log4j1ConfigurationConverter {
- public static void main(String[] args) throws IOException {
+ public static void main(final String[] args) throws IOException {
try (InputStream input = args.length > 0 ? new FileInputStream(args[0]) : System.in;
OutputStream output = args.length > 1 ? new FileOutputStream(args[1]) : System.out) {
ConfigurationBuilder builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 9356584b..d857877f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -176,22 +176,22 @@ private void buildFileAppender(final String appenderName) {
builder.add(appenderBuilder);
}
- private void buildAttribute(String componentName, ComponentBuilder componentBuilder,
- String sourceAttributeName, String targetAttributeName) {
+ private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
}
- private void buildAttributeWithDefault(String componentName, ComponentBuilder componentBuilder,
- String sourceAttributeName, String targetAttributeName, String defaultValue) {
+ private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
- private void buildMandatoryAttribute(String componentName, ComponentBuilder componentBuilder,
- String sourceAttributeName, String targetAttributeName) {
+ private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
From d2eed9fabec7c327d5fdefdbe6479a6bb195095e Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 6 Sep 2016 23:01:19 -0400
Subject: [PATCH 34/84] Add final modifier to local variables.
---
.../log4j/config/Log4j1ConfigurationConverter.java | 2 +-
.../log4j/config/Log4j1ConfigurationFactory.java | 2 +-
.../apache/log4j/config/Log4j1ConfigurationParser.java | 10 +++++-----
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index 3cfb8880..8170708f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -33,7 +33,7 @@ public final class Log4j1ConfigurationConverter {
public static void main(final String[] args) throws IOException {
try (InputStream input = args.length > 0 ? new FileInputStream(args[0]) : System.in;
OutputStream output = args.length > 1 ? new FileOutputStream(args[1]) : System.out) {
- ConfigurationBuilder builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
+ final ConfigurationBuilder builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
builder.writeXmlConfiguration(output);
}
}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index d6eb4445..970a43f5 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -44,7 +44,7 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
final ConfigurationBuilder builder;
try (final InputStream configStream = source.getInputStream()) {
builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(configStream);
- } catch (IOException e) {
+ } catch (final IOException e) {
throw new ConfigurationException("Unable to load " + source.toString(), e);
}
return builder.build();
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index d857877f..04a78128 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -91,7 +91,7 @@ public ConfigurationBuilder buildConfigurationBuilder(final
final Map classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
for (final Map.Entry entry : classNameToProperty.entrySet()) {
final String appenderName = entry.getKey();
- String appenderClass = entry.getValue();
+ final String appenderClass = entry.getValue();
buildAppender(appenderName, appenderClass);
}
// Loggers
@@ -244,7 +244,7 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
break;
}
case "org.apache.log4j.HTMLLayout": {
- LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
+ final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
htmlLayout.addAttribute("title",
getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
htmlLayout.addAttribute("locationInfo",
@@ -253,7 +253,7 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
break;
}
case "org.apache.log4j.xml.XMLLayout": {
- LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
+ final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
xmlLayout.addAttribute("locationInfo",
Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
xmlLayout.addAttribute("properties",
@@ -283,8 +283,8 @@ private String[] buildRootLogger(final String rootLoggerValue) {
final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
Arrays.sort(sortedAppenderNames);
- RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
- for (String appender : sortedAppenderNames) {
+ final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
+ for (final String appender : sortedAppenderNames) {
loggerBuilder.add(builder.newAppenderRef(appender));
}
builder.add(loggerBuilder);
From 34430760ca7cfd91edc9a355e8f3e6175378a119 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mikael=20St=C3=A5ldal?=
Date: Wed, 7 Sep 2016 18:15:32 +0200
Subject: [PATCH 35/84] Remove obsolete comment
---
.../log4j/config/Log4j1ConfigurationParser.java | 15 ---------------
1 file changed, 15 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 04a78128..a8c3977b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -37,21 +37,6 @@
/**
* Experimental parser for Log4j 1.2 properties configuration files.
- *
- * Currently supports:
- *
- *
- * log4j.debug
- * log4j.rootLogger
- * log4j.logger
- * log4j.appender
- * org.apache.log4j.ConsoleAppender
- *
- * Follow
- * Target
- * layout
- *
- *
*
* This class is not thread-safe.
*/
From c798399c5e3415f8eabbdb1f339748730d83e9c0 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 21 Sep 2016 19:27:42 -0700
Subject: [PATCH 36/84] [LOG4J2-1523] Log4j 1 appenders. NullAppender.
---
.../apache/log4j/config/Log4j1ConfigurationParser.java | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index a8c3977b..adc512c7 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -117,12 +117,15 @@ private void buildAppender(final String appenderName, final String appenderClass
case "org.apache.log4j.FileAppender":
buildFileAppender(appenderName);
break;
+ case "org.apache.log4j.varia.NullAppender":
+ buildNullAppender(appenderName);
+ break;
default:
reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
}
}
- private void buildConsoleAppender(final String appenderName) {
+ private void buildConsoleAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Console");
final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
if (targetValue != null) {
@@ -185,6 +188,11 @@ private void buildMandatoryAttribute(final String componentName, final Component
}
}
+ private void buildNullAppender(String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Null");
+ builder.add(appenderBuilder);
+ }
+
private void buildAppenderLayout(final String name, final AppenderComponentBuilder appenderBuilder) {
final String layoutClass = getLog4jAppenderValue(name, "layout", null);
if (layoutClass != null) {
From 71136da29b4cd8b1297591e7932574cf6d923c23 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 21 Sep 2016 20:38:29 -0700
Subject: [PATCH 37/84] [LOG4J2-1523] Log4j 1 appenders. Classic
RollingFileAppender.
---
.../config/Log4j1ConfigurationParser.java | 531 +++++++++---------
1 file changed, 278 insertions(+), 253 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index adc512c7..0d5be538 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -42,281 +42,306 @@
*/
public class Log4j1ConfigurationParser {
- private final Properties properties = new Properties();
- private final ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder();
+ private final Properties properties = new Properties();
+ private final ConfigurationBuilder builder = ConfigurationBuilderFactory
+ .newConfigurationBuilder();
- /**
- * Parse a Log4j 1.2 properties configuration file into a ConfigurationBuilder.
- *
- * @param input InputStream to read from, will not be closed.
- * @return the populated ConfigurationBuilder, never {@literal null}
- * @throws IOException if unable to read the input
- * @throws ConfigurationException if the input does not contain a valid configuration
- */
- public ConfigurationBuilder buildConfigurationBuilder(final InputStream input) throws IOException {
- properties.load(input);
- final String rootCategoryValue = getLog4jValue("rootCategory");
- final String rootLoggerValue = getLog4jValue("rootLogger");
- if (rootCategoryValue == null && rootLoggerValue == null) {
- // This is not a Log4j 1 properties configuration file.
- throw new ConfigurationException("Input does not contain a valid Log4j 1.x properties configuration");
- }
- builder.setConfigurationName("Log4j1");
- // DEBUG
- final String debugValue = getLog4jValue("debug");
- if (Boolean.valueOf(debugValue)) {
- builder.setStatusLevel(Level.DEBUG);
- }
- // Root
- final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue("rootCategory"));
- final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue("rootLogger"));
- final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
- : sortedAppenderNamesC;
- // Appenders
- final Map classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
- for (final Map.Entry entry : classNameToProperty.entrySet()) {
- final String appenderName = entry.getKey();
- final String appenderClass = entry.getValue();
- buildAppender(appenderName, appenderClass);
- }
- // Loggers
- buildLoggers("log4j.category.");
- buildLoggers("log4j.logger.");
- return builder;
- }
+ /**
+ * Parse a Log4j 1.2 properties configuration file into a
+ * ConfigurationBuilder.
+ *
+ * @param input
+ * InputStream to read from, will not be closed.
+ * @return the populated ConfigurationBuilder, never {@literal null}
+ * @throws IOException
+ * if unable to read the input
+ * @throws ConfigurationException
+ * if the input does not contain a valid configuration
+ */
+ public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
+ throws IOException {
+ properties.load(input);
+ final String rootCategoryValue = getLog4jValue("rootCategory");
+ final String rootLoggerValue = getLog4jValue("rootLogger");
+ if (rootCategoryValue == null && rootLoggerValue == null) {
+ // This is not a Log4j 1 properties configuration file.
+ throw new ConfigurationException("Input does not contain a valid Log4j 1.x properties configuration");
+ }
+ builder.setConfigurationName("Log4j1");
+ // DEBUG
+ final String debugValue = getLog4jValue("debug");
+ if (Boolean.valueOf(debugValue)) {
+ builder.setStatusLevel(Level.DEBUG);
+ }
+ // Root
+ final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue("rootCategory"));
+ final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue("rootLogger"));
+ final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
+ : sortedAppenderNamesC;
+ // Appenders
+ final Map classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
+ for (final Map.Entry entry : classNameToProperty.entrySet()) {
+ final String appenderName = entry.getKey();
+ final String appenderClass = entry.getValue();
+ buildAppender(appenderName, appenderClass);
+ }
+ // Loggers
+ buildLoggers("log4j.category.");
+ buildLoggers("log4j.logger.");
+ return builder;
+ }
- private Map buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
- final String prefix = "log4j.appender.";
- final int preLength = prefix.length();
- final Map map = new HashMap<>(sortedAppenderNames.length);
- for (final Map.Entry entry : properties.entrySet()) {
- final Object keyObj = entry.getKey();
- if (keyObj != null) {
- final String key = keyObj.toString();
- if (key.startsWith(prefix)) {
- if (key.indexOf('.', preLength) < 0) {
- final String name = key.substring(preLength);
- if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
- final Object value = entry.getValue();
- if (value != null) {
- map.put(name, value.toString());
- }
- }
- }
- }
- }
- }
- return map;
- }
+ private Map buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
+ final String prefix = "log4j.appender.";
+ final int preLength = prefix.length();
+ final Map map = new HashMap<>(sortedAppenderNames.length);
+ for (final Map.Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ if (key.indexOf('.', preLength) < 0) {
+ final String name = key.substring(preLength);
+ if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
+ final Object value = entry.getValue();
+ if (value != null) {
+ map.put(name, value.toString());
+ }
+ }
+ }
+ }
+ }
+ }
+ return map;
+ }
- private void buildAppender(final String appenderName, final String appenderClass) {
- switch (appenderClass) {
- case "org.apache.log4j.ConsoleAppender":
- buildConsoleAppender(appenderName);
- break;
- case "org.apache.log4j.FileAppender":
- buildFileAppender(appenderName);
- break;
- case "org.apache.log4j.varia.NullAppender":
- buildNullAppender(appenderName);
- break;
- default:
- reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
- }
- }
+ private void buildAppender(final String appenderName, final String appenderClass) {
+ switch (appenderClass) {
+ case "org.apache.log4j.ConsoleAppender":
+ buildConsoleAppender(appenderName);
+ break;
+ case "org.apache.log4j.FileAppender":
+ buildFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.RollingFileAppender":
+ buildRollingFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.varia.NullAppender":
+ buildNullAppender(appenderName);
+ break;
+ default:
+ reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
+ }
+ }
private void buildConsoleAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Console");
- final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
- if (targetValue != null) {
- final ConsoleAppender.Target target;
- switch (targetValue) {
- case "System.out":
- target = ConsoleAppender.Target.SYSTEM_OUT;
- break;
- case "System.err":
- target = ConsoleAppender.Target.SYSTEM_ERR;
- break;
- default:
- reportWarning("Unknown value for console Target: " + targetValue);
- target = null;
- }
- if (target != null) {
- appenderBuilder.addAttribute("target", target);
- }
- }
- buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
- if ("false".equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
- reportWarning("ImmediateFlush=false is not supported on Console appender");
- }
- buildAppenderLayout(appenderName, appenderBuilder);
- builder.add(appenderBuilder);
- }
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Console");
+ final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
+ if (targetValue != null) {
+ final ConsoleAppender.Target target;
+ switch (targetValue) {
+ case "System.out":
+ target = ConsoleAppender.Target.SYSTEM_OUT;
+ break;
+ case "System.err":
+ target = ConsoleAppender.Target.SYSTEM_ERR;
+ break;
+ default:
+ reportWarning("Unknown value for console Target: " + targetValue);
+ target = null;
+ }
+ if (target != null) {
+ appenderBuilder.addAttribute("target", target);
+ }
+ }
+ buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
+ if ("false".equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
+ reportWarning("ImmediateFlush=false is not supported on Console appender");
+ }
+ buildAppenderLayout(appenderName, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
- private void buildFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "File");
- buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
- buildAttribute(appenderName, appenderBuilder, "Append", "append");
- buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
- buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
- buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
- buildAppenderLayout(appenderName, appenderBuilder);
- builder.add(appenderBuilder);
- }
+ private void buildFileAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "File");
+ buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
+ buildAttribute(appenderName, appenderBuilder, "Append", "append");
+ buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
+ buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
+ buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
+ buildAppenderLayout(appenderName, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
- private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
- final String sourceAttributeName, final String targetAttributeName) {
- final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
- if (attributeValue != null) {
- componentBuilder.addAttribute(targetAttributeName, attributeValue);
- }
- }
+ private void buildRollingFileAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "RollingFile");
+ buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
+ final String fileName = getLog4jAppenderValue(appenderName, "File");
+ appenderBuilder.addAttribute("filePattern", fileName + ".%i");
+ final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
+ final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
+ final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies").addComponent(
+ builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
+ appenderBuilder.addComponent(triggeringPolicy);
+ appenderBuilder.addComponent(
+ builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
+ builder.add(appenderBuilder);
+ }
+
+ private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
+ if (attributeValue != null) {
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ }
+ }
- private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
- final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
- final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
- componentBuilder.addAttribute(targetAttributeName, attributeValue);
- }
+ private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ }
- private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
- final String sourceAttributeName, final String targetAttributeName) {
- final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
- if (attributeValue != null) {
- componentBuilder.addAttribute(targetAttributeName, attributeValue);
- } else {
- reportWarning("Missing " + sourceAttributeName + " for " + componentName);
- }
- }
+ private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
+ if (attributeValue != null) {
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ } else {
+ reportWarning("Missing " + sourceAttributeName + " for " + componentName);
+ }
+ }
- private void buildNullAppender(String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Null");
- builder.add(appenderBuilder);
+ private void buildNullAppender(String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Null");
+ builder.add(appenderBuilder);
}
- private void buildAppenderLayout(final String name, final AppenderComponentBuilder appenderBuilder) {
- final String layoutClass = getLog4jAppenderValue(name, "layout", null);
- if (layoutClass != null) {
- switch (layoutClass) {
- case "org.apache.log4j.PatternLayout":
- case "org.apache.log4j.EnhancedPatternLayout": {
- final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
+ private void buildAppenderLayout(final String name, final AppenderComponentBuilder appenderBuilder) {
+ final String layoutClass = getLog4jAppenderValue(name, "layout", null);
+ if (layoutClass != null) {
+ switch (layoutClass) {
+ case "org.apache.log4j.PatternLayout":
+ case "org.apache.log4j.EnhancedPatternLayout": {
+ final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
- // Log4j 2's %x (NDC) is not compatible with Log4j 1's %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Use %ndc to get the Log4j 1 format
- .replace("%x", "%ndc")
+ // Log4j 2's %x (NDC) is not compatible with Log4j 1's
+ // %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // Use %ndc to get the Log4j 1 format
+ .replace("%x", "%ndc")
- // Log4j 2's %X (MDC) is not compatible with Log4j 1's %X
- // Log4j 1: "{{foo,bar}{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- // Use %properties to get the Log4j 1 format
- .replace("%X", "%properties");
+ // Log4j 2's %X (MDC) is not compatible with Log4j 1's
+ // %X
+ // Log4j 1: "{{foo,bar}{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
+ // Use %properties to get the Log4j 1 format
+ .replace("%X", "%properties");
- appenderBuilder.add(newPatternLayout(pattern));
- break;
- }
- case "org.apache.log4j.SimpleLayout": {
- appenderBuilder.add(newPatternLayout("%level - %m%n"));
- break;
- }
- case "org.apache.log4j.TTCCLayout": {
- String pattern = "%r ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", "true"))) {
- pattern += "[%t] ";
- }
- pattern += "%p ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", "true"))) {
- pattern += "%c ";
- }
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", "true"))) {
- pattern += "%notEmpty{%ndc }";
- }
- pattern += "- %m%n";
- appenderBuilder.add(newPatternLayout(pattern));
- break;
- }
- case "org.apache.log4j.HTMLLayout": {
- final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
- htmlLayout.addAttribute("title",
- getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
- htmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
- appenderBuilder.add(htmlLayout);
- break;
- }
- case "org.apache.log4j.xml.XMLLayout": {
- final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
- xmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
- xmlLayout.addAttribute("properties",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", "false")));
- appenderBuilder.add(xmlLayout);
- break;
- }
- default:
- reportWarning("Unknown layout class: " + layoutClass);
- }
- }
- }
+ appenderBuilder.add(newPatternLayout(pattern));
+ break;
+ }
+ case "org.apache.log4j.SimpleLayout": {
+ appenderBuilder.add(newPatternLayout("%level - %m%n"));
+ break;
+ }
+ case "org.apache.log4j.TTCCLayout": {
+ String pattern = "%r ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", "true"))) {
+ pattern += "[%t] ";
+ }
+ pattern += "%p ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", "true"))) {
+ pattern += "%c ";
+ }
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", "true"))) {
+ pattern += "%notEmpty{%ndc }";
+ }
+ pattern += "- %m%n";
+ appenderBuilder.add(newPatternLayout(pattern));
+ break;
+ }
+ case "org.apache.log4j.HTMLLayout": {
+ final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
+ htmlLayout.addAttribute("title", getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
+ htmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
+ appenderBuilder.add(htmlLayout);
+ break;
+ }
+ case "org.apache.log4j.xml.XMLLayout": {
+ final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
+ xmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
+ xmlLayout.addAttribute("properties",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", "false")));
+ appenderBuilder.add(xmlLayout);
+ break;
+ }
+ default:
+ reportWarning("Unknown layout class: " + layoutClass);
+ }
+ }
+ }
- private LayoutComponentBuilder newPatternLayout(final String pattern) {
- final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
- if (pattern != null) {
- layoutBuilder.addAttribute("pattern", pattern);
- }
- return layoutBuilder;
- }
+ private LayoutComponentBuilder newPatternLayout(final String pattern) {
+ final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
+ if (pattern != null) {
+ layoutBuilder.addAttribute("pattern", pattern);
+ }
+ return layoutBuilder;
+ }
- private String[] buildRootLogger(final String rootLoggerValue) {
- if (rootLoggerValue == null) {
- return new String[0];
- }
- final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
- final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
- final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
- Arrays.sort(sortedAppenderNames);
- final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
- for (final String appender : sortedAppenderNames) {
- loggerBuilder.add(builder.newAppenderRef(appender));
- }
- builder.add(loggerBuilder);
- return sortedAppenderNames;
- }
+ private String[] buildRootLogger(final String rootLoggerValue) {
+ if (rootLoggerValue == null) {
+ return new String[0];
+ }
+ final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
+ final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
+ final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
+ Arrays.sort(sortedAppenderNames);
+ final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
+ for (final String appender : sortedAppenderNames) {
+ loggerBuilder.add(builder.newAppenderRef(appender));
+ }
+ builder.add(loggerBuilder);
+ return sortedAppenderNames;
+ }
- private void buildLoggers(final String prefix) {
- final int preLength = prefix.length();
- for (final Map.Entry entry : properties.entrySet()) {
- final Object keyObj = entry.getKey();
- if (keyObj != null) {
- final String key = keyObj.toString();
- if (key.startsWith(prefix)) {
- final String name = key.substring(preLength);
- final Object value = entry.getValue();
- if (value != null) {
- builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
- }
- }
- }
- }
+ private void buildLoggers(final String prefix) {
+ final int preLength = prefix.length();
+ for (final Map.Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ final String name = key.substring(preLength);
+ final Object value = entry.getValue();
+ if (value != null) {
+ builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
+ }
+ }
+ }
+ }
- }
+ }
- private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
- return properties.getProperty("log4j.appender." + appenderName + "." + attributeName);
- }
+ private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
+ return properties.getProperty("log4j.appender." + appenderName + "." + attributeName);
+ }
- private String getLog4jAppenderValue(final String appenderName, final String attributeName,
- final String defaultValue) {
- return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
- }
+ private String getLog4jAppenderValue(final String appenderName, final String attributeName,
+ final String defaultValue) {
+ return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
+ }
- private String getLog4jValue(final String key) {
- return properties.getProperty("log4j." + key);
- }
+ private String getLog4jValue(final String key) {
+ return properties.getProperty("log4j." + key);
+ }
- private void reportWarning(final String msg) {
- StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
- }
+ private void reportWarning(final String msg) {
+ StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
+ }
}
From 7267de22968b36e7ae232a9210cbd4cdc9af0792 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 21 Sep 2016 20:51:23 -0700
Subject: [PATCH 38/84] Refactor properties ivar access.
---
.../log4j/config/Log4j1ConfigurationParser.java | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 0d5be538..f5290498 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -328,16 +328,24 @@ private void buildLoggers(final String prefix) {
}
private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
- return properties.getProperty("log4j.appender." + appenderName + "." + attributeName);
+ return getProperty("log4j.appender." + appenderName + "." + attributeName);
+ }
+
+ private String getProperty(final String key) {
+ return properties.getProperty(key);
+ }
+
+ private String getProperty(final String key, String defaultValue) {
+ return properties.getProperty(key, defaultValue);
}
private String getLog4jAppenderValue(final String appenderName, final String attributeName,
final String defaultValue) {
- return properties.getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
+ return getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
}
private String getLog4jValue(final String key) {
- return properties.getProperty("log4j." + key);
+ return getProperty("log4j." + key);
}
private void reportWarning(final String msg) {
From cd7037444505e8051ea0ae530ec553360b842378 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 21 Sep 2016 21:05:38 -0700
Subject: [PATCH 39/84] [LOG4J2-1523] Log4j 1 appenders. Classic
RollingFileAppender with property substitutions.
---
.../apache/log4j/config/Log4j1ConfigurationParser.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index f5290498..579e600d 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -33,6 +33,7 @@
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.status.StatusLogger;
/**
@@ -43,6 +44,8 @@
public class Log4j1ConfigurationParser {
private final Properties properties = new Properties();
+ private StrSubstitutor strSubstitutor;
+
private final ConfigurationBuilder builder = ConfigurationBuilderFactory
.newConfigurationBuilder();
@@ -61,6 +64,7 @@ public class Log4j1ConfigurationParser {
public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
throws IOException {
properties.load(input);
+ strSubstitutor = new StrSubstitutor(properties);
final String rootCategoryValue = getLog4jValue("rootCategory");
final String rootLoggerValue = getLog4jValue("rootLogger");
if (rootCategoryValue == null && rootLoggerValue == null) {
@@ -324,7 +328,6 @@ private void buildLoggers(final String prefix) {
}
}
}
-
}
private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
@@ -332,11 +335,11 @@ private String getLog4jAppenderValue(final String appenderName, final String att
}
private String getProperty(final String key) {
- return properties.getProperty(key);
+ return strSubstitutor.replace(properties.getProperty(key));
}
private String getProperty(final String key, String defaultValue) {
- return properties.getProperty(key, defaultValue);
+ return strSubstitutor.replace(properties.getProperty(key, defaultValue));
}
private String getLog4jAppenderValue(final String appenderName, final String attributeName,
From e939f8ec40937f5410e51b16003c6cc68eb2ca59 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 21 Sep 2016 23:16:41 -0700
Subject: [PATCH 40/84] [LOG4J2-1523] Log4j 1 appenders. Classic
RollingFileAppender with property substitutions.
---
.../apache/log4j/config/Log4j1ConfigurationParser.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 579e600d..32c51660 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -168,18 +168,22 @@ private void buildConsoleAppender(final String appenderName) {
private void buildFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "File");
+ buildFileAppender(appenderName, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
+
+ private void buildFileAppender(final String appenderName, final AppenderComponentBuilder appenderBuilder) {
buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
buildAttribute(appenderName, appenderBuilder, "Append", "append");
buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
buildAppenderLayout(appenderName, appenderBuilder);
- builder.add(appenderBuilder);
}
private void buildRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "RollingFile");
- buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
+ buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
appenderBuilder.addAttribute("filePattern", fileName + ".%i");
final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
From 8f8077a45d926e3b2a2648da8fdba330afa5983a Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 22 Sep 2016 00:41:09 -0700
Subject: [PATCH 41/84] [LOG4J2-1523] Log4j 1 appenders. Classic
DailyRollingFileAppender.
---
.../config/Log4j1ConfigurationParser.java | 55 ++++++++++++++-----
1 file changed, 40 insertions(+), 15 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 32c51660..27c78072 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -25,6 +25,9 @@
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.appender.FileAppender;
+import org.apache.logging.log4j.core.appender.NullAppender;
+import org.apache.logging.log4j.core.appender.RollingFileAppender;
import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
@@ -43,6 +46,11 @@
*/
public class Log4j1ConfigurationParser {
+ private static final String ROOTLOGGER = "rootLogger";
+ private static final String ROOTCATEGORY = "rootCategory";
+ private static final String TRUE = "true";
+ private static final String FALSE = "false";
+
private final Properties properties = new Properties();
private StrSubstitutor strSubstitutor;
@@ -65,8 +73,8 @@ public ConfigurationBuilder buildConfigurationBuilder(final
throws IOException {
properties.load(input);
strSubstitutor = new StrSubstitutor(properties);
- final String rootCategoryValue = getLog4jValue("rootCategory");
- final String rootLoggerValue = getLog4jValue("rootLogger");
+ final String rootCategoryValue = getLog4jValue(ROOTCATEGORY);
+ final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
if (rootCategoryValue == null && rootLoggerValue == null) {
// This is not a Log4j 1 properties configuration file.
throw new ConfigurationException("Input does not contain a valid Log4j 1.x properties configuration");
@@ -78,8 +86,8 @@ public ConfigurationBuilder buildConfigurationBuilder(final
builder.setStatusLevel(Level.DEBUG);
}
// Root
- final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue("rootCategory"));
- final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue("rootLogger"));
+ final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue(ROOTCATEGORY));
+ final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue(ROOTLOGGER));
final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
: sortedAppenderNamesC;
// Appenders
@@ -127,6 +135,9 @@ private void buildAppender(final String appenderName, final String appenderClass
case "org.apache.log4j.FileAppender":
buildFileAppender(appenderName);
break;
+ case "org.apache.log4j.DailyRollingFileAppender":
+ buildDailyRollingFileAppender(appenderName);
+ break;
case "org.apache.log4j.RollingFileAppender":
buildRollingFileAppender(appenderName);
break;
@@ -139,7 +150,7 @@ private void buildAppender(final String appenderName, final String appenderClass
}
private void buildConsoleAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Console");
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, ConsoleAppender.PLUGIN_NAME);
final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
if (targetValue != null) {
final ConsoleAppender.Target target;
@@ -159,7 +170,7 @@ private void buildConsoleAppender(final String appenderName) {
}
}
buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
- if ("false".equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
+ if (FALSE.equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
reportWarning("ImmediateFlush=false is not supported on Console appender");
}
buildAppenderLayout(appenderName, appenderBuilder);
@@ -167,7 +178,7 @@ private void buildConsoleAppender(final String appenderName) {
}
private void buildFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "File");
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, FileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
builder.add(appenderBuilder);
}
@@ -181,8 +192,22 @@ private void buildFileAppender(final String appenderName, final AppenderComponen
buildAppenderLayout(appenderName, appenderBuilder);
}
+ private void buildDailyRollingFileAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, RollingFileAppender.PLUGIN_NAME);
+ buildFileAppender(appenderName, appenderBuilder);
+ final String fileName = getLog4jAppenderValue(appenderName, "File");
+ final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
+ appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
+ final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies").addComponent(
+ builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
+ appenderBuilder.addComponent(triggeringPolicy);
+ appenderBuilder.addComponent(
+ builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
+ builder.add(appenderBuilder);
+ }
+
private void buildRollingFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "RollingFile");
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
appenderBuilder.addAttribute("filePattern", fileName + ".%i");
@@ -221,7 +246,7 @@ private void buildMandatoryAttribute(final String componentName, final Component
}
private void buildNullAppender(String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, "Null");
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, NullAppender.PLUGIN_NAME);
builder.add(appenderBuilder);
}
@@ -256,14 +281,14 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
}
case "org.apache.log4j.TTCCLayout": {
String pattern = "%r ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", "true"))) {
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", TRUE))) {
pattern += "[%t] ";
}
pattern += "%p ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", "true"))) {
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", TRUE))) {
pattern += "%c ";
}
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", "true"))) {
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", TRUE))) {
pattern += "%notEmpty{%ndc }";
}
pattern += "- %m%n";
@@ -274,16 +299,16 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
htmlLayout.addAttribute("title", getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
htmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
appenderBuilder.add(htmlLayout);
break;
}
case "org.apache.log4j.xml.XMLLayout": {
final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
xmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", "false")));
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
xmlLayout.addAttribute("properties",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", "false")));
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", FALSE)));
appenderBuilder.add(xmlLayout);
break;
}
From fc325d2791b39232a1907b4847db402ca87d9ba1 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 22 Sep 2016 02:20:58 -0700
Subject: [PATCH 42/84] [LOG4J2-1523] Log4j 1 appenders. Support System
properties per Log4j 1 Javadoc.
---
.../config/Log4j1ConfigurationParser.java | 28 ++++++++++++++++---
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 27c78072..16c9b7c9 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -43,6 +43,21 @@
* Experimental parser for Log4j 1.2 properties configuration files.
*
* This class is not thread-safe.
+ *
+ *
+ * From the Log4j 1.2 Javadocs:
+ *
+ *
+ * All option values admit variable substitution. The syntax of variable
+ * substitution is similar to that of Unix shells. The string between an opening
+ * "${" and closing "}" is interpreted as a key. The value of the substituted
+ * variable can be defined as a system property or in the configuration file
+ * itself. The value of the key is first searched in the system properties, and
+ * if not found there, it is then searched in the configuration file being
+ * parsed. The corresponding value replaces the ${variableName} sequence. For
+ * example, if java.home system property is set to /home/xyz, then every
+ * occurrence of the sequence ${java.home} will be interpreted as /home/xyz.
+ *
*/
public class Log4j1ConfigurationParser {
@@ -52,7 +67,8 @@ public class Log4j1ConfigurationParser {
private static final String FALSE = "false";
private final Properties properties = new Properties();
- private StrSubstitutor strSubstitutor;
+ private StrSubstitutor strSubstitutorProperties;
+ private StrSubstitutor strSubstitutorSystem;
private final ConfigurationBuilder builder = ConfigurationBuilderFactory
.newConfigurationBuilder();
@@ -72,7 +88,8 @@ public class Log4j1ConfigurationParser {
public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
throws IOException {
properties.load(input);
- strSubstitutor = new StrSubstitutor(properties);
+ strSubstitutorProperties = new StrSubstitutor(properties);
+ strSubstitutorSystem = new StrSubstitutor(System.getProperties());
final String rootCategoryValue = getLog4jValue(ROOTCATEGORY);
final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
if (rootCategoryValue == null && rootLoggerValue == null) {
@@ -364,11 +381,14 @@ private String getLog4jAppenderValue(final String appenderName, final String att
}
private String getProperty(final String key) {
- return strSubstitutor.replace(properties.getProperty(key));
+ final String value = properties.getProperty(key);
+ final String sysValue = strSubstitutorSystem.replace(value);
+ return strSubstitutorProperties.replace(sysValue);
}
private String getProperty(final String key, String defaultValue) {
- return strSubstitutor.replace(properties.getProperty(key, defaultValue));
+ final String value = getProperty(key);
+ return value == null ? defaultValue : value;
}
private String getLog4jAppenderValue(final String appenderName, final String attributeName,
From 4a7d5b420f6166e9c504963a23eedbb67b92d306 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 22 Sep 2016 23:35:19 -0700
Subject: [PATCH 43/84] Clarify Javadocs.
---
.../config/Log4j1ConfigurationParser.java | 23 +++++++++----------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 16c9b7c9..d71349ed 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -73,18 +73,17 @@ public class Log4j1ConfigurationParser {
private final ConfigurationBuilder builder = ConfigurationBuilderFactory
.newConfigurationBuilder();
- /**
- * Parse a Log4j 1.2 properties configuration file into a
- * ConfigurationBuilder.
- *
- * @param input
- * InputStream to read from, will not be closed.
- * @return the populated ConfigurationBuilder, never {@literal null}
- * @throws IOException
- * if unable to read the input
- * @throws ConfigurationException
- * if the input does not contain a valid configuration
- */
+ /**
+ * Parses a Log4j 1.2 properties configuration file in ISO 8859-1 encoding into a ConfigurationBuilder.
+ *
+ * @param input
+ * InputStream to read from is assumed to be ISO 8859-1, and will not be closed.
+ * @return the populated ConfigurationBuilder, never {@literal null}
+ * @throws IOException
+ * if unable to read the input
+ * @throws ConfigurationException
+ * if the input does not contain a valid configuration
+ */
public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
throws IOException {
properties.load(input);
From 2ff83102db96527e4040acb71d67cff4e1608972 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 15:16:30 -0700
Subject: [PATCH 44/84] Better exception message.
---
.../java/org/apache/log4j/config/Log4j1ConfigurationParser.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index d71349ed..6f65b41e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -93,7 +93,7 @@ public ConfigurationBuilder buildConfigurationBuilder(final
final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
if (rootCategoryValue == null && rootLoggerValue == null) {
// This is not a Log4j 1 properties configuration file.
- throw new ConfigurationException("Input does not contain a valid Log4j 1.x properties configuration");
+ throw new ConfigurationException("Input does not contain a valid Log4j 1.x properties configuration: " + input);
}
builder.setConfigurationName("Log4j1");
// DEBUG
From 6dc903e6fc580c4aaa251e7a1e356992b0d4fe81 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 16:43:24 -0700
Subject: [PATCH 45/84] Beef up Log4j 1.2 to 2 convertion utility. The new test
makes it easy to see what we cannot convert yet (at least what the converter
blows up on).
---
.../config/Log4j1ConfigurationConverter.java | 182 +++++++++++++++++-
.../config/Log4j1ConfigurationParser.java | 71 +++----
2 files changed, 213 insertions(+), 40 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index 8170708f..c9c8bc5d 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -16,25 +16,193 @@
*/
package org.apache.log4j.config;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.core.util.BasicCommandLineArguments;
+
+import com.beust.jcommander.Parameter;
/**
* Tool for converting a Log4j 1.x properties configuration file to Log4j 2.x XML configuration file.
+ *
+ *
+ * Run with "--help" on the command line.
+ *
+ *
+ *
+ * Example:
+ *
+ *
+ *
+ * java org.apache.log4j.config.Log4j1ConfigurationConverter --recurse
+ * E:\vcs\git\apache\logging\logging-log4j2\log4j-1.2-api\src\test\resources\config-1.2\hadoop --in log4j.properties --verbose
+ *
*/
public final class Log4j1ConfigurationConverter {
- public static void main(final String[] args) throws IOException {
- try (InputStream input = args.length > 0 ? new FileInputStream(args[0]) : System.in;
- OutputStream output = args.length > 1 ? new FileOutputStream(args[1]) : System.out) {
- final ConfigurationBuilder builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
- builder.writeXmlConfiguration(output);
+ public static class CommandLineArguments extends BasicCommandLineArguments {
+
+ @Parameter(names = { "--failfast", "-f" }, description = "Fails on the first failure in recurse mode.")
+ private boolean failFast;
+
+ @Parameter(names = { "--in", "-i" }, description = "Specifies the input file.")
+ private Path pathIn;
+
+ @Parameter(names = { "--out", "-o" }, description = "Specifies the output file.")
+ private Path pathOut;
+
+ @Parameter(names = { "--recurse", "-r" }, description = "Recurses into this folder looking for the input file")
+ private Path recurseIntoPath;
+
+ @Parameter(names = { "--verbose", "-v" }, description = "Be verbose.")
+ private boolean verbose;
+
+ public Path getPathIn() {
+ return pathIn;
+ }
+
+ public Path getPathOut() {
+ return pathOut;
+ }
+
+ public Path getRecurseIntoPath() {
+ return recurseIntoPath;
+ }
+
+ public boolean isFailFast() {
+ return failFast;
+ }
+
+ public boolean isVerbose() {
+ return verbose;
+ }
+
+ public void setFailFast(final boolean failFast) {
+ this.failFast = failFast;
+ }
+
+ public void setPathIn(final Path pathIn) {
+ this.pathIn = pathIn;
+ }
+
+ public void setPathOut(final Path pathOut) {
+ this.pathOut = pathOut;
+ }
+
+ public void setRecurseIntoPath(final Path recurseIntoPath) {
+ this.recurseIntoPath = recurseIntoPath;
+ }
+
+ public void setVerbose(final boolean verbose) {
+ this.verbose = verbose;
+ }
+
+ @Override
+ public String toString() {
+ return "CommandLineArguments [recurseIntoPath=" + recurseIntoPath + ", verbose=" + verbose + ", pathIn="
+ + pathIn + ", pathOut=" + pathOut + "]";
+ }
+
+ }
+
+ private static final String FILE_EXT_XML = ".xml";
+
+ public static void main(final String[] args) {
+ new Log4j1ConfigurationConverter(BasicCommandLineArguments.parseCommandLine(args,
+ Log4j1ConfigurationConverter.class, new CommandLineArguments())).run();
+ }
+
+ public static Log4j1ConfigurationConverter run(CommandLineArguments cla) {
+ final Log4j1ConfigurationConverter log4j1ConfigurationConverter = new Log4j1ConfigurationConverter(cla);
+ log4j1ConfigurationConverter.run();
+ return log4j1ConfigurationConverter;
+ }
+
+ private final CommandLineArguments cla;
+
+ private Log4j1ConfigurationConverter(final CommandLineArguments cla) {
+ this.cla = cla;
+ }
+
+ protected void convert(final InputStream input, final OutputStream output) throws IOException {
+ final ConfigurationBuilder builder = new Log4j1ConfigurationParser()
+ .buildConfigurationBuilder(input);
+ builder.writeXmlConfiguration(output);
+ }
+
+ InputStream getInputStream() throws IOException {
+ return cla.pathIn == null ? System.in : Files.newInputStream(cla.pathIn);
+ }
+
+ OutputStream getOutputStream() throws IOException {
+ return cla.pathOut == null ? System.out : Files.newOutputStream(cla.pathOut);
+ }
+
+ private void run() {
+ if (cla.getRecurseIntoPath() != null) {
+ final AtomicInteger countOKs = new AtomicInteger();
+ final AtomicInteger countFails = new AtomicInteger();
+ try {
+ Files.walkFileTree(cla.getRecurseIntoPath(), new SimpleFileVisitor() {
+ @Override
+ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs)
+ throws IOException {
+ if (cla.getPathIn() == null || file.getFileName().equals(cla.getPathIn())) {
+ verbose("Reading %s", file);
+ String newFile = file.getFileName().toString();
+ final int lastIndex = newFile.lastIndexOf(".");
+ newFile = lastIndex < 0 ? newFile + FILE_EXT_XML
+ : newFile.substring(0, lastIndex) + FILE_EXT_XML;
+ final Path resolved = file.resolveSibling(newFile);
+ try (final InputStream input = Files.newInputStream(file);
+ final OutputStream output = Files.newOutputStream(resolved)) {
+ try {
+ convert(input, output);
+ countOKs.incrementAndGet();
+ } catch (ConfigurationException | IOException e) {
+ countFails.incrementAndGet();
+ if (cla.isFailFast()) {
+ throw e;
+ }
+ e.printStackTrace();
+ }
+ verbose("Wrote %s", resolved);
+ }
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ } catch (IOException e) {
+ throw new ConfigurationException(e);
+ } finally {
+ verbose("OK = %,d, Failures = %,d, Total = %,d", countOKs.get(), countFails.get(),
+ countOKs.get() + countFails.get());
+ }
+ } else {
+ verbose("Reading %s", cla.getPathIn());
+ try (final InputStream input = getInputStream(); final OutputStream output = getOutputStream()) {
+ convert(input, output);
+ } catch (IOException e) {
+ throw new ConfigurationException(e);
+ }
+ verbose("Wrote %s", cla.getPathOut());
+ }
+ }
+
+ private void verbose(final String template, final Object... args) {
+ if (cla.isVerbose()) {
+ System.err.println(String.format(template, args));
}
}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 6f65b41e..16ab9c53 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -85,39 +85,44 @@ public class Log4j1ConfigurationParser {
* if the input does not contain a valid configuration
*/
public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
- throws IOException {
- properties.load(input);
- strSubstitutorProperties = new StrSubstitutor(properties);
- strSubstitutorSystem = new StrSubstitutor(System.getProperties());
- final String rootCategoryValue = getLog4jValue(ROOTCATEGORY);
- final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
- if (rootCategoryValue == null && rootLoggerValue == null) {
- // This is not a Log4j 1 properties configuration file.
- throw new ConfigurationException("Input does not contain a valid Log4j 1.x properties configuration: " + input);
- }
- builder.setConfigurationName("Log4j1");
- // DEBUG
- final String debugValue = getLog4jValue("debug");
- if (Boolean.valueOf(debugValue)) {
- builder.setStatusLevel(Level.DEBUG);
- }
- // Root
- final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue(ROOTCATEGORY));
- final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue(ROOTLOGGER));
- final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
- : sortedAppenderNamesC;
- // Appenders
- final Map classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
- for (final Map.Entry entry : classNameToProperty.entrySet()) {
- final String appenderName = entry.getKey();
- final String appenderClass = entry.getValue();
- buildAppender(appenderName, appenderClass);
- }
- // Loggers
- buildLoggers("log4j.category.");
- buildLoggers("log4j.logger.");
- return builder;
- }
+ throws IOException {
+ try {
+ properties.load(input);
+ strSubstitutorProperties = new StrSubstitutor(properties);
+ strSubstitutorSystem = new StrSubstitutor(System.getProperties());
+ final String rootCategoryValue = getLog4jValue(ROOTCATEGORY);
+ final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
+ if (rootCategoryValue == null && rootLoggerValue == null) {
+ // This is not a Log4j 1 properties configuration file.
+ throw new ConfigurationException(
+ "Input does not contain a valid Log4j 1.x properties configuration: " + input);
+ }
+ builder.setConfigurationName("Log4j1");
+ // DEBUG
+ final String debugValue = getLog4jValue("debug");
+ if (Boolean.valueOf(debugValue)) {
+ builder.setStatusLevel(Level.DEBUG);
+ }
+ // Root
+ final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue(ROOTCATEGORY));
+ final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue(ROOTLOGGER));
+ final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
+ : sortedAppenderNamesC;
+ // Appenders
+ final Map classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
+ for (final Map.Entry entry : classNameToProperty.entrySet()) {
+ final String appenderName = entry.getKey();
+ final String appenderClass = entry.getValue();
+ buildAppender(appenderName, appenderClass);
+ }
+ // Loggers
+ buildLoggers("log4j.category.");
+ buildLoggers("log4j.logger.");
+ return builder;
+ } catch (final IllegalArgumentException e) {
+ throw new ConfigurationException(e);
+ }
+ }
private Map buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
final String prefix = "log4j.appender.";
From d2812b901eae696f6dc453ca45d46b883cffe795 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 17:50:57 -0700
Subject: [PATCH 46/84] Better error reporting.
---
.../log4j/config/InputStreamWrapper.java | 92 +++
.../config/Log4j1ConfigurationConverter.java | 4 +-
.../config/Log4j1ConfigurationParser.java | 615 +++++++++---------
3 files changed, 403 insertions(+), 308 deletions(-)
create mode 100644 log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
new file mode 100644
index 00000000..29ea51a2
--- /dev/null
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
@@ -0,0 +1,92 @@
+/*
+ * 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.log4j.config;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+class InputStreamWrapper extends InputStream {
+
+ private final String description;
+ private final InputStream input;
+
+ public InputStreamWrapper(final InputStream input, final String description) {
+ this.input = input;
+ this.description = description;
+ }
+
+ @Override
+ public int available() throws IOException {
+ return input.available();
+ }
+
+ @Override
+ public void close() throws IOException {
+ input.close();
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ return input.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return input.hashCode();
+ }
+
+ @Override
+ public void mark(final int readlimit) {
+ input.mark(readlimit);
+ }
+
+ @Override
+ public boolean markSupported() {
+ return input.markSupported();
+ }
+
+ @Override
+ public int read() throws IOException {
+ return input.read();
+ }
+
+ @Override
+ public int read(final byte[] b) throws IOException {
+ return input.read(b);
+ }
+
+ @Override
+ public int read(final byte[] b, final int off, final int len) throws IOException {
+ return input.read(b, off, len);
+ }
+
+ @Override
+ public synchronized void reset() throws IOException {
+ input.reset();
+ }
+
+ @Override
+ public long skip(final long n) throws IOException {
+ return input.skip(n);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + " [description=" + description + ", input=" + input + "]";
+ }
+
+}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index c9c8bc5d..e48e54c4 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -142,7 +142,7 @@ protected void convert(final InputStream input, final OutputStream output) throw
}
InputStream getInputStream() throws IOException {
- return cla.pathIn == null ? System.in : Files.newInputStream(cla.pathIn);
+ return cla.pathIn == null ? System.in : new InputStreamWrapper(Files.newInputStream(cla.pathIn), cla.pathIn.toString());
}
OutputStream getOutputStream() throws IOException {
@@ -165,7 +165,7 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
newFile = lastIndex < 0 ? newFile + FILE_EXT_XML
: newFile.substring(0, lastIndex) + FILE_EXT_XML;
final Path resolved = file.resolveSibling(newFile);
- try (final InputStream input = Files.newInputStream(file);
+ try (final InputStream input = new InputStreamWrapper(Files.newInputStream(file), file.toString());
final OutputStream output = Files.newOutputStream(resolved)) {
try {
convert(input, output);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 16ab9c53..da9bc8f0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -48,30 +48,26 @@
* From the Log4j 1.2 Javadocs:
*
*
- * All option values admit variable substitution. The syntax of variable
- * substitution is similar to that of Unix shells. The string between an opening
- * "${" and closing "}" is interpreted as a key. The value of the substituted
- * variable can be defined as a system property or in the configuration file
- * itself. The value of the key is first searched in the system properties, and
- * if not found there, it is then searched in the configuration file being
- * parsed. The corresponding value replaces the ${variableName} sequence. For
- * example, if java.home system property is set to /home/xyz, then every
- * occurrence of the sequence ${java.home} will be interpreted as /home/xyz.
+ * All option values admit variable substitution. The syntax of variable substitution is similar to that of Unix shells. The string between
+ * an opening "${" and closing "}" is interpreted as a key. The value of the substituted variable can be defined as a system property or in
+ * the configuration file itself. The value of the key is first searched in the system properties, and if not found there, it is then
+ * searched in the configuration file being parsed. The corresponding value replaces the ${variableName} sequence. For example, if java.home
+ * system property is set to /home/xyz, then every occurrence of the sequence ${java.home} will be interpreted as /home/xyz.
*
*/
public class Log4j1ConfigurationParser {
- private static final String ROOTLOGGER = "rootLogger";
- private static final String ROOTCATEGORY = "rootCategory";
- private static final String TRUE = "true";
- private static final String FALSE = "false";
-
- private final Properties properties = new Properties();
- private StrSubstitutor strSubstitutorProperties;
- private StrSubstitutor strSubstitutorSystem;
-
- private final ConfigurationBuilder builder = ConfigurationBuilderFactory
- .newConfigurationBuilder();
+ private static final String ROOTLOGGER = "rootLogger";
+ private static final String ROOTCATEGORY = "rootCategory";
+ private static final String TRUE = "true";
+ private static final String FALSE = "false";
+
+ private final Properties properties = new Properties();
+ private StrSubstitutor strSubstitutorProperties;
+ private StrSubstitutor strSubstitutorSystem;
+
+ private final ConfigurationBuilder builder = ConfigurationBuilderFactory
+ .newConfigurationBuilder();
/**
* Parses a Log4j 1.2 properties configuration file in ISO 8859-1 encoding into a ConfigurationBuilder.
@@ -84,7 +80,7 @@ public class Log4j1ConfigurationParser {
* @throws ConfigurationException
* if the input does not contain a valid configuration
*/
- public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
+ public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
throws IOException {
try {
properties.load(input);
@@ -94,8 +90,9 @@ public ConfigurationBuilder buildConfigurationBuilder(final
final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
if (rootCategoryValue == null && rootLoggerValue == null) {
// This is not a Log4j 1 properties configuration file.
- throw new ConfigurationException(
- "Input does not contain a valid Log4j 1.x properties configuration: " + input);
+ warn("Missing " + ROOTCATEGORY + " or " + ROOTLOGGER + " in " + input);
+ // throw new ConfigurationException(
+ // "Missing " + ROOTCATEGORY + " or " + ROOTLOGGER + " in " + input);
}
builder.setConfigurationName("Log4j1");
// DEBUG
@@ -124,288 +121,294 @@ public ConfigurationBuilder buildConfigurationBuilder(final
}
}
- private Map buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
- final String prefix = "log4j.appender.";
- final int preLength = prefix.length();
- final Map map = new HashMap<>(sortedAppenderNames.length);
- for (final Map.Entry entry : properties.entrySet()) {
- final Object keyObj = entry.getKey();
- if (keyObj != null) {
- final String key = keyObj.toString();
- if (key.startsWith(prefix)) {
- if (key.indexOf('.', preLength) < 0) {
- final String name = key.substring(preLength);
- if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
- final Object value = entry.getValue();
- if (value != null) {
- map.put(name, value.toString());
- }
- }
- }
- }
- }
- }
- return map;
- }
-
- private void buildAppender(final String appenderName, final String appenderClass) {
- switch (appenderClass) {
- case "org.apache.log4j.ConsoleAppender":
- buildConsoleAppender(appenderName);
- break;
- case "org.apache.log4j.FileAppender":
- buildFileAppender(appenderName);
- break;
- case "org.apache.log4j.DailyRollingFileAppender":
- buildDailyRollingFileAppender(appenderName);
- break;
- case "org.apache.log4j.RollingFileAppender":
- buildRollingFileAppender(appenderName);
- break;
- case "org.apache.log4j.varia.NullAppender":
- buildNullAppender(appenderName);
- break;
- default:
- reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
- }
- }
-
- private void buildConsoleAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, ConsoleAppender.PLUGIN_NAME);
- final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
- if (targetValue != null) {
- final ConsoleAppender.Target target;
- switch (targetValue) {
- case "System.out":
- target = ConsoleAppender.Target.SYSTEM_OUT;
- break;
- case "System.err":
- target = ConsoleAppender.Target.SYSTEM_ERR;
- break;
- default:
- reportWarning("Unknown value for console Target: " + targetValue);
- target = null;
- }
- if (target != null) {
- appenderBuilder.addAttribute("target", target);
- }
- }
- buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
- if (FALSE.equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
- reportWarning("ImmediateFlush=false is not supported on Console appender");
- }
- buildAppenderLayout(appenderName, appenderBuilder);
- builder.add(appenderBuilder);
- }
-
- private void buildFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, FileAppender.PLUGIN_NAME);
- buildFileAppender(appenderName, appenderBuilder);
- builder.add(appenderBuilder);
- }
-
- private void buildFileAppender(final String appenderName, final AppenderComponentBuilder appenderBuilder) {
- buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
- buildAttribute(appenderName, appenderBuilder, "Append", "append");
- buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
- buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
- buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
- buildAppenderLayout(appenderName, appenderBuilder);
- }
-
- private void buildDailyRollingFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, RollingFileAppender.PLUGIN_NAME);
- buildFileAppender(appenderName, appenderBuilder);
- final String fileName = getLog4jAppenderValue(appenderName, "File");
- final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
- appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
- final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies").addComponent(
- builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
- appenderBuilder.addComponent(triggeringPolicy);
- appenderBuilder.addComponent(
- builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
- builder.add(appenderBuilder);
- }
-
- private void buildRollingFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, RollingFileAppender.PLUGIN_NAME);
- buildFileAppender(appenderName, appenderBuilder);
- final String fileName = getLog4jAppenderValue(appenderName, "File");
- appenderBuilder.addAttribute("filePattern", fileName + ".%i");
- final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
- final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
- final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies").addComponent(
- builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
- appenderBuilder.addComponent(triggeringPolicy);
- appenderBuilder.addComponent(
- builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
- builder.add(appenderBuilder);
- }
-
- private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
- final String sourceAttributeName, final String targetAttributeName) {
- final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
- if (attributeValue != null) {
- componentBuilder.addAttribute(targetAttributeName, attributeValue);
- }
- }
-
- private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
- final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
- final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
- componentBuilder.addAttribute(targetAttributeName, attributeValue);
- }
-
- private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
- final String sourceAttributeName, final String targetAttributeName) {
- final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
- if (attributeValue != null) {
- componentBuilder.addAttribute(targetAttributeName, attributeValue);
- } else {
- reportWarning("Missing " + sourceAttributeName + " for " + componentName);
- }
- }
-
- private void buildNullAppender(String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, NullAppender.PLUGIN_NAME);
- builder.add(appenderBuilder);
- }
-
- private void buildAppenderLayout(final String name, final AppenderComponentBuilder appenderBuilder) {
- final String layoutClass = getLog4jAppenderValue(name, "layout", null);
- if (layoutClass != null) {
- switch (layoutClass) {
- case "org.apache.log4j.PatternLayout":
- case "org.apache.log4j.EnhancedPatternLayout": {
- final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
-
- // Log4j 2's %x (NDC) is not compatible with Log4j 1's
- // %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Use %ndc to get the Log4j 1 format
- .replace("%x", "%ndc")
-
- // Log4j 2's %X (MDC) is not compatible with Log4j 1's
- // %X
- // Log4j 1: "{{foo,bar}{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- // Use %properties to get the Log4j 1 format
- .replace("%X", "%properties");
-
- appenderBuilder.add(newPatternLayout(pattern));
- break;
- }
- case "org.apache.log4j.SimpleLayout": {
- appenderBuilder.add(newPatternLayout("%level - %m%n"));
- break;
- }
- case "org.apache.log4j.TTCCLayout": {
- String pattern = "%r ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", TRUE))) {
- pattern += "[%t] ";
- }
- pattern += "%p ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", TRUE))) {
- pattern += "%c ";
- }
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", TRUE))) {
- pattern += "%notEmpty{%ndc }";
- }
- pattern += "- %m%n";
- appenderBuilder.add(newPatternLayout(pattern));
- break;
- }
- case "org.apache.log4j.HTMLLayout": {
- final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
- htmlLayout.addAttribute("title", getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
- htmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
- appenderBuilder.add(htmlLayout);
- break;
- }
- case "org.apache.log4j.xml.XMLLayout": {
- final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
- xmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
- xmlLayout.addAttribute("properties",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", FALSE)));
- appenderBuilder.add(xmlLayout);
- break;
- }
- default:
- reportWarning("Unknown layout class: " + layoutClass);
- }
- }
- }
-
- private LayoutComponentBuilder newPatternLayout(final String pattern) {
- final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
- if (pattern != null) {
- layoutBuilder.addAttribute("pattern", pattern);
- }
- return layoutBuilder;
- }
-
- private String[] buildRootLogger(final String rootLoggerValue) {
- if (rootLoggerValue == null) {
- return new String[0];
- }
- final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
- final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
- final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
- Arrays.sort(sortedAppenderNames);
- final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
- for (final String appender : sortedAppenderNames) {
- loggerBuilder.add(builder.newAppenderRef(appender));
- }
- builder.add(loggerBuilder);
- return sortedAppenderNames;
- }
-
- private void buildLoggers(final String prefix) {
- final int preLength = prefix.length();
- for (final Map.Entry entry : properties.entrySet()) {
- final Object keyObj = entry.getKey();
- if (keyObj != null) {
- final String key = keyObj.toString();
- if (key.startsWith(prefix)) {
- final String name = key.substring(preLength);
- final Object value = entry.getValue();
- if (value != null) {
- builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
- }
- }
- }
- }
- }
-
- private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
- return getProperty("log4j.appender." + appenderName + "." + attributeName);
- }
-
- private String getProperty(final String key) {
- final String value = properties.getProperty(key);
- final String sysValue = strSubstitutorSystem.replace(value);
- return strSubstitutorProperties.replace(sysValue);
- }
-
- private String getProperty(final String key, String defaultValue) {
- final String value = getProperty(key);
- return value == null ? defaultValue : value;
- }
-
- private String getLog4jAppenderValue(final String appenderName, final String attributeName,
- final String defaultValue) {
- return getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
- }
-
- private String getLog4jValue(final String key) {
- return getProperty("log4j." + key);
- }
-
- private void reportWarning(final String msg) {
- StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
- }
+ private void warn(String string) {
+ System.err.println(string);
+ }
+
+ private Map buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
+ final String prefix = "log4j.appender.";
+ final int preLength = prefix.length();
+ final Map map = new HashMap<>(sortedAppenderNames.length);
+ for (final Map.Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ if (key.indexOf('.', preLength) < 0) {
+ final String name = key.substring(preLength);
+ if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
+ final Object value = entry.getValue();
+ if (value != null) {
+ map.put(name, value.toString());
+ }
+ }
+ }
+ }
+ }
+ }
+ return map;
+ }
+
+ private void buildAppender(final String appenderName, final String appenderClass) {
+ switch (appenderClass) {
+ case "org.apache.log4j.ConsoleAppender":
+ buildConsoleAppender(appenderName);
+ break;
+ case "org.apache.log4j.FileAppender":
+ buildFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.DailyRollingFileAppender":
+ buildDailyRollingFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.RollingFileAppender":
+ buildRollingFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.varia.NullAppender":
+ buildNullAppender(appenderName);
+ break;
+ default:
+ reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
+ }
+ }
+
+ private void buildConsoleAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, ConsoleAppender.PLUGIN_NAME);
+ final String targetValue = getLog4jAppenderValue(appenderName, "Target", "System.out");
+ if (targetValue != null) {
+ final ConsoleAppender.Target target;
+ switch (targetValue) {
+ case "System.out":
+ target = ConsoleAppender.Target.SYSTEM_OUT;
+ break;
+ case "System.err":
+ target = ConsoleAppender.Target.SYSTEM_ERR;
+ break;
+ default:
+ reportWarning("Unknown value for console Target: " + targetValue);
+ target = null;
+ }
+ if (target != null) {
+ appenderBuilder.addAttribute("target", target);
+ }
+ }
+ buildAttribute(appenderName, appenderBuilder, "Follow", "follow");
+ if (FALSE.equalsIgnoreCase(getLog4jAppenderValue(appenderName, "ImmediateFlush"))) {
+ reportWarning("ImmediateFlush=false is not supported on Console appender");
+ }
+ buildAppenderLayout(appenderName, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
+
+ private void buildFileAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, FileAppender.PLUGIN_NAME);
+ buildFileAppender(appenderName, appenderBuilder);
+ builder.add(appenderBuilder);
+ }
+
+ private void buildFileAppender(final String appenderName, final AppenderComponentBuilder appenderBuilder) {
+ buildMandatoryAttribute(appenderName, appenderBuilder, "File", "fileName");
+ buildAttribute(appenderName, appenderBuilder, "Append", "append");
+ buildAttribute(appenderName, appenderBuilder, "BufferedIO", "bufferedIo");
+ buildAttribute(appenderName, appenderBuilder, "BufferSize", "bufferSize");
+ buildAttribute(appenderName, appenderBuilder, "ImmediateFlush", "immediateFlush");
+ buildAppenderLayout(appenderName, appenderBuilder);
+ }
+
+ private void buildDailyRollingFileAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
+ RollingFileAppender.PLUGIN_NAME);
+ buildFileAppender(appenderName, appenderBuilder);
+ final String fileName = getLog4jAppenderValue(appenderName, "File");
+ final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
+ appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
+ final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies")
+ .addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
+ appenderBuilder.addComponent(triggeringPolicy);
+ appenderBuilder
+ .addComponent(builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
+ builder.add(appenderBuilder);
+ }
+
+ private void buildRollingFileAppender(final String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
+ RollingFileAppender.PLUGIN_NAME);
+ buildFileAppender(appenderName, appenderBuilder);
+ final String fileName = getLog4jAppenderValue(appenderName, "File");
+ appenderBuilder.addAttribute("filePattern", fileName + ".%i");
+ final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
+ final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
+ final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies").addComponent(
+ builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
+ appenderBuilder.addComponent(triggeringPolicy);
+ appenderBuilder.addComponent(
+ builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
+ builder.add(appenderBuilder);
+ }
+
+ private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
+ if (attributeValue != null) {
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ }
+ }
+
+ private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ }
+
+ private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ final String sourceAttributeName, final String targetAttributeName) {
+ final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
+ if (attributeValue != null) {
+ componentBuilder.addAttribute(targetAttributeName, attributeValue);
+ } else {
+ reportWarning("Missing " + sourceAttributeName + " for " + componentName);
+ }
+ }
+
+ private void buildNullAppender(String appenderName) {
+ final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, NullAppender.PLUGIN_NAME);
+ builder.add(appenderBuilder);
+ }
+
+ private void buildAppenderLayout(final String name, final AppenderComponentBuilder appenderBuilder) {
+ final String layoutClass = getLog4jAppenderValue(name, "layout", null);
+ if (layoutClass != null) {
+ switch (layoutClass) {
+ case "org.apache.log4j.PatternLayout":
+ case "org.apache.log4j.EnhancedPatternLayout": {
+ final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
+
+ // Log4j 2's %x (NDC) is not compatible with Log4j 1's
+ // %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // Use %ndc to get the Log4j 1 format
+ .replace("%x", "%ndc")
+
+ // Log4j 2's %X (MDC) is not compatible with Log4j 1's
+ // %X
+ // Log4j 1: "{{foo,bar}{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
+ // Use %properties to get the Log4j 1 format
+ .replace("%X", "%properties");
+
+ appenderBuilder.add(newPatternLayout(pattern));
+ break;
+ }
+ case "org.apache.log4j.SimpleLayout": {
+ appenderBuilder.add(newPatternLayout("%level - %m%n"));
+ break;
+ }
+ case "org.apache.log4j.TTCCLayout": {
+ String pattern = "%r ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", TRUE))) {
+ pattern += "[%t] ";
+ }
+ pattern += "%p ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", TRUE))) {
+ pattern += "%c ";
+ }
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", TRUE))) {
+ pattern += "%notEmpty{%ndc }";
+ }
+ pattern += "- %m%n";
+ appenderBuilder.add(newPatternLayout(pattern));
+ break;
+ }
+ case "org.apache.log4j.HTMLLayout": {
+ final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
+ htmlLayout.addAttribute("title", getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
+ htmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
+ appenderBuilder.add(htmlLayout);
+ break;
+ }
+ case "org.apache.log4j.xml.XMLLayout": {
+ final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
+ xmlLayout.addAttribute("locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
+ xmlLayout.addAttribute("properties",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", FALSE)));
+ appenderBuilder.add(xmlLayout);
+ break;
+ }
+ default:
+ reportWarning("Unknown layout class: " + layoutClass);
+ }
+ }
+ }
+
+ private LayoutComponentBuilder newPatternLayout(final String pattern) {
+ final LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
+ if (pattern != null) {
+ layoutBuilder.addAttribute("pattern", pattern);
+ }
+ return layoutBuilder;
+ }
+
+ private String[] buildRootLogger(final String rootLoggerValue) {
+ if (rootLoggerValue == null) {
+ return new String[0];
+ }
+ final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
+ final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
+ final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
+ Arrays.sort(sortedAppenderNames);
+ final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
+ for (final String appender : sortedAppenderNames) {
+ loggerBuilder.add(builder.newAppenderRef(appender));
+ }
+ builder.add(loggerBuilder);
+ return sortedAppenderNames;
+ }
+
+ private void buildLoggers(final String prefix) {
+ final int preLength = prefix.length();
+ for (final Map.Entry entry : properties.entrySet()) {
+ final Object keyObj = entry.getKey();
+ if (keyObj != null) {
+ final String key = keyObj.toString();
+ if (key.startsWith(prefix)) {
+ final String name = key.substring(preLength);
+ final Object value = entry.getValue();
+ if (value != null) {
+ builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
+ }
+ }
+ }
+ }
+ }
+
+ private String getLog4jAppenderValue(final String appenderName, final String attributeName) {
+ return getProperty("log4j.appender." + appenderName + "." + attributeName);
+ }
+
+ private String getProperty(final String key) {
+ final String value = properties.getProperty(key);
+ final String sysValue = strSubstitutorSystem.replace(value);
+ return strSubstitutorProperties.replace(sysValue);
+ }
+
+ private String getProperty(final String key, String defaultValue) {
+ final String value = getProperty(key);
+ return value == null ? defaultValue : value;
+ }
+
+ private String getLog4jAppenderValue(final String appenderName, final String attributeName,
+ final String defaultValue) {
+ return getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
+ }
+
+ private String getLog4jValue(final String key) {
+ return getProperty("log4j." + key);
+ }
+
+ private void reportWarning(final String msg) {
+ StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
+ }
}
From e902fb921e4e5c28243b34b21fbc408c485347e0 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 17:51:26 -0700
Subject: [PATCH 47/84] Better error reporting.
---
.../main/java/org/apache/log4j/config/InputStreamWrapper.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
index 29ea51a2..19bf9a9a 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
@@ -50,7 +50,7 @@ public int hashCode() {
}
@Override
- public void mark(final int readlimit) {
+ public synchronized void mark(final int readlimit) {
input.mark(readlimit);
}
From f53c1c3c773e2f4d38d1ebcb3b16ac073b602266 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 17:52:59 -0700
Subject: [PATCH 48/84] Minor refactoring of dup calls.
---
.../apache/log4j/config/Log4j1ConfigurationConverter.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index e48e54c4..9e63a730 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -142,11 +142,13 @@ protected void convert(final InputStream input, final OutputStream output) throw
}
InputStream getInputStream() throws IOException {
- return cla.pathIn == null ? System.in : new InputStreamWrapper(Files.newInputStream(cla.pathIn), cla.pathIn.toString());
+ final Path pathIn = cla.getPathIn();
+ return pathIn == null ? System.in : new InputStreamWrapper(Files.newInputStream(pathIn), pathIn.toString());
}
OutputStream getOutputStream() throws IOException {
- return cla.pathOut == null ? System.out : Files.newOutputStream(cla.pathOut);
+ final Path pathOut = cla.getPathOut();
+ return pathOut == null ? System.out : Files.newOutputStream(pathOut);
}
private void run() {
From 85ec8b8a1e597aaa5ba6ce1ef5f21e41f8b87dea Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 18:10:28 -0700
Subject: [PATCH 49/84] Allow for a logger to be defined as "Level,
AppenderRef, AppenderRef, ..."
---
.../config/Log4j1ConfigurationParser.java | 21 ++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index da9bc8f0..b346fac4 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -23,6 +23,8 @@
import java.util.Map;
import java.util.Properties;
+import javax.swing.text.StyledEditorKit.ForegroundAction;
+
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.appender.FileAppender;
@@ -34,10 +36,12 @@
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.velocity.runtime.directive.Foreach;
/**
* Experimental parser for Log4j 1.2 properties configuration files.
@@ -376,7 +380,22 @@ private void buildLoggers(final String prefix) {
final String name = key.substring(preLength);
final Object value = entry.getValue();
if (value != null) {
- builder.add(builder.newLogger(name, Level.valueOf(value.toString())));
+ // a Level may be followed by a list of Appender refs.
+ final String valueStr = value.toString();
+ final String[] split = valueStr.split("\\s*,\\s*");
+ final String levelStr = split.length > 0 ? split[0] : null;
+ if (levelStr == null) {
+ warn("Level is missing: " + entry);
+ } else {
+ final LoggerComponentBuilder newLogger = builder.newLogger(name, Level.valueOf(levelStr));
+ if (split.length > 1) {
+ // Add Appenders to this logger
+ for (int i = 1; i < split.length; i++) {
+ newLogger.add(builder.newAppenderRef(split[i]));
+ }
+ }
+ builder.add(newLogger);
+ }
}
}
}
From ad622af802bbc9ba6019f604a1aa2be56f14fa7a Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 18:25:26 -0700
Subject: [PATCH 50/84] Allow for a logger to be defined as "Level,
AppenderRef, AppenderRef, ..."
---
.../java/org/apache/log4j/config/Log4j1ConfigurationParser.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index b346fac4..5462697f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -140,7 +140,7 @@ private Map buildClassToPropertyPrefixMap(final String[] sortedA
if (key.startsWith(prefix)) {
if (key.indexOf('.', preLength) < 0) {
final String name = key.substring(preLength);
- if (Arrays.binarySearch(sortedAppenderNames, name) >= 0) {
+ if (Arrays.binarySearch(sortedAppenderNames, name) == -1) {
final Object value = entry.getValue();
if (value != null) {
map.put(name, value.toString());
From 3f6cb0ce5284e90abefecead1851e41be5a92ac9 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 18:32:11 -0700
Subject: [PATCH 51/84] Refactor some common code.
---
.../config/Log4j1ConfigurationParser.java | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 5462697f..ca13babd 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -61,6 +61,7 @@
*/
public class Log4j1ConfigurationParser {
+ private static final String COMMA_DELIMITED_RE = "\\s*,\\s*";
private static final String ROOTLOGGER = "rootLogger";
private static final String ROOTCATEGORY = "rootCategory";
private static final String TRUE = "true";
@@ -358,8 +359,8 @@ private String[] buildRootLogger(final String rootLoggerValue) {
if (rootLoggerValue == null) {
return new String[0];
}
- final String[] rootLoggerParts = rootLoggerValue.split("\\s*,\\s*");
- final Level rootLoggerLevel = rootLoggerParts.length > 0 ? Level.valueOf(rootLoggerParts[0]) : Level.ERROR;
+ final String[] rootLoggerParts = rootLoggerValue.split(COMMA_DELIMITED_RE);
+ final Level rootLoggerLevel = getLevel(rootLoggerParts, Level.ERROR);
final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
Arrays.sort(sortedAppenderNames);
final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
@@ -370,6 +371,10 @@ private String[] buildRootLogger(final String rootLoggerValue) {
return sortedAppenderNames;
}
+ private Level getLevel(final String[] loggerParts, final Level defaultLevel) {
+ return loggerParts.length > 0 ? Level.valueOf(loggerParts[0]) : defaultLevel;
+ }
+
private void buildLoggers(final String prefix) {
final int preLength = prefix.length();
for (final Map.Entry entry : properties.entrySet()) {
@@ -382,12 +387,12 @@ private void buildLoggers(final String prefix) {
if (value != null) {
// a Level may be followed by a list of Appender refs.
final String valueStr = value.toString();
- final String[] split = valueStr.split("\\s*,\\s*");
- final String levelStr = split.length > 0 ? split[0] : null;
- if (levelStr == null) {
- warn("Level is missing: " + entry);
+ final String[] split = valueStr.split(COMMA_DELIMITED_RE);
+ final Level level = getLevel(split, null);
+ if (level == null) {
+ warn("Level is missing for entry " + entry);
} else {
- final LoggerComponentBuilder newLogger = builder.newLogger(name, Level.valueOf(levelStr));
+ final LoggerComponentBuilder newLogger = builder.newLogger(name, level);
if (split.length > 1) {
// Add Appenders to this logger
for (int i = 1; i < split.length; i++) {
From 6be905c507d132d7961ae41020dd49a4e3fb2ff8 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 18:37:51 -0700
Subject: [PATCH 52/84] Do not convert strings to Level objects internally
since they can be variables.
---
.../apache/log4j/config/Log4j1ConfigurationParser.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index ca13babd..bdcc32d9 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -360,7 +360,7 @@ private String[] buildRootLogger(final String rootLoggerValue) {
return new String[0];
}
final String[] rootLoggerParts = rootLoggerValue.split(COMMA_DELIMITED_RE);
- final Level rootLoggerLevel = getLevel(rootLoggerParts, Level.ERROR);
+ final String rootLoggerLevel = getLevelString(rootLoggerParts, Level.ERROR.name());
final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
Arrays.sort(sortedAppenderNames);
final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
@@ -371,8 +371,8 @@ private String[] buildRootLogger(final String rootLoggerValue) {
return sortedAppenderNames;
}
- private Level getLevel(final String[] loggerParts, final Level defaultLevel) {
- return loggerParts.length > 0 ? Level.valueOf(loggerParts[0]) : defaultLevel;
+ private String getLevelString(final String[] loggerParts, final String defaultLevel) {
+ return loggerParts.length > 0 ? loggerParts[0] : defaultLevel;
}
private void buildLoggers(final String prefix) {
@@ -388,7 +388,7 @@ private void buildLoggers(final String prefix) {
// a Level may be followed by a list of Appender refs.
final String valueStr = value.toString();
final String[] split = valueStr.split(COMMA_DELIMITED_RE);
- final Level level = getLevel(split, null);
+ final String level = getLevelString(split, null);
if (level == null) {
warn("Level is missing for entry " + entry);
} else {
From 8e837731df8cdc2e4e8dc66005698e464dc0a7c1 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 19:01:14 -0700
Subject: [PATCH 53/84] Convert properties.
---
.../log4j/config/Log4j1ConfigurationParser.java | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index bdcc32d9..be9d4b98 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -21,6 +21,7 @@
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
import java.util.Properties;
import javax.swing.text.StyledEditorKit.ForegroundAction;
@@ -41,6 +42,7 @@
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
import org.apache.velocity.runtime.directive.Foreach;
/**
@@ -120,12 +122,22 @@ public ConfigurationBuilder buildConfigurationBuilder(final
// Loggers
buildLoggers("log4j.category.");
buildLoggers("log4j.logger.");
+ buildProperties();
return builder;
} catch (final IllegalArgumentException e) {
throw new ConfigurationException(e);
}
}
+ private void buildProperties() {
+ for (Map.Entry entry : properties.entrySet()) {
+ final String key = entry.getKey().toString();
+ if (!key.startsWith("log4j.") && !key.equals(ROOTCATEGORY) && !key.equals(ROOTLOGGER)) {
+ builder.addProperty(key, Objects.toString(entry.getValue(), Strings.EMPTY));
+ }
+ }
+ }
+
private void warn(String string) {
System.err.println(string);
}
From c1c2cb742ecdb7597e8d7473d1d8a32288149ce4 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 21:44:55 -0700
Subject: [PATCH 54/84] Remove unused import.
---
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 3 ---
1 file changed, 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index be9d4b98..4ff39242 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -24,8 +24,6 @@
import java.util.Objects;
import java.util.Properties;
-import javax.swing.text.StyledEditorKit.ForegroundAction;
-
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.appender.FileAppender;
@@ -43,7 +41,6 @@
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
-import org.apache.velocity.runtime.directive.Foreach;
/**
* Experimental parser for Log4j 1.2 properties configuration files.
From b6f7de21849b81723eaec1398d2e3059979870c9 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 22:06:50 -0700
Subject: [PATCH 55/84] Sort properties.
---
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 4ff39242..a5c02436 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -23,6 +23,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
+import java.util.TreeMap;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
@@ -127,7 +128,7 @@ public ConfigurationBuilder buildConfigurationBuilder(final
}
private void buildProperties() {
- for (Map.Entry entry : properties.entrySet()) {
+ for (Map.Entry entry : new TreeMap<>(properties).entrySet()) {
final String key = entry.getKey().toString();
if (!key.startsWith("log4j.") && !key.equals(ROOTCATEGORY) && !key.equals(ROOTLOGGER)) {
builder.addProperty(key, Objects.toString(entry.getValue(), Strings.EMPTY));
From 93b56a0bc79204deaca7d5ff430a97cefbe1db68 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 22:38:56 -0700
Subject: [PATCH 56/84] toString() is implied.
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 970a43f5..83f66753 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -45,7 +45,7 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
try (final InputStream configStream = source.getInputStream()) {
builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(configStream);
} catch (final IOException e) {
- throw new ConfigurationException("Unable to load " + source.toString(), e);
+ throw new ConfigurationException("Unable to load " + source, e);
}
return builder.build();
}
From 0be54eec84c941c637b3cc61899fd39de58a8dc9 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 22:50:36 -0700
Subject: [PATCH 57/84] Fix regression.
---
.../config/Log4j1ConfigurationParser.java | 22 ++++++++-----------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index a5c02436..ca870c90 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -106,13 +106,11 @@ public ConfigurationBuilder buildConfigurationBuilder(final
builder.setStatusLevel(Level.DEBUG);
}
// Root
- final String[] sortedAppenderNamesC = buildRootLogger(getLog4jValue(ROOTCATEGORY));
- final String[] sortedAppenderNamesL = buildRootLogger(getLog4jValue(ROOTLOGGER));
- final String[] sortedAppenderNames = sortedAppenderNamesL.length > 0 ? sortedAppenderNamesL
- : sortedAppenderNamesC;
+ buildRootLogger(getLog4jValue(ROOTCATEGORY));
+ buildRootLogger(getLog4jValue(ROOTLOGGER));
// Appenders
- final Map classNameToProperty = buildClassToPropertyPrefixMap(sortedAppenderNames);
- for (final Map.Entry entry : classNameToProperty.entrySet()) {
+ final Map appenderNameToClassName = buildClassToPropertyPrefixMap();
+ for (final Map.Entry entry : appenderNameToClassName.entrySet()) {
final String appenderName = entry.getKey();
final String appenderClass = entry.getValue();
buildAppender(appenderName, appenderClass);
@@ -140,10 +138,10 @@ private void warn(String string) {
System.err.println(string);
}
- private Map buildClassToPropertyPrefixMap(final String[] sortedAppenderNames) {
+ private Map buildClassToPropertyPrefixMap() {
final String prefix = "log4j.appender.";
final int preLength = prefix.length();
- final Map map = new HashMap<>(sortedAppenderNames.length);
+ final Map map = new HashMap<>();
for (final Map.Entry entry : properties.entrySet()) {
final Object keyObj = entry.getKey();
if (keyObj != null) {
@@ -151,11 +149,9 @@ private Map buildClassToPropertyPrefixMap(final String[] sortedA
if (key.startsWith(prefix)) {
if (key.indexOf('.', preLength) < 0) {
final String name = key.substring(preLength);
- if (Arrays.binarySearch(sortedAppenderNames, name) == -1) {
- final Object value = entry.getValue();
- if (value != null) {
- map.put(name, value.toString());
- }
+ final Object value = entry.getValue();
+ if (value != null) {
+ map.put(name, value.toString());
}
}
}
From cd994353ad2f89b010ef0dae67a72ce70ec46895 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Fri, 23 Sep 2016 23:05:30 -0700
Subject: [PATCH 58/84] Code clean ups and sort appender names for a logger's
appender refs.
---
.../log4j/config/Log4j1ConfigurationParser.java | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index ca870c90..894f6e53 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -361,20 +361,20 @@ private LayoutComponentBuilder newPatternLayout(final String pattern) {
return layoutBuilder;
}
- private String[] buildRootLogger(final String rootLoggerValue) {
+ private void buildRootLogger(final String rootLoggerValue) {
if (rootLoggerValue == null) {
- return new String[0];
+ return;
}
final String[] rootLoggerParts = rootLoggerValue.split(COMMA_DELIMITED_RE);
final String rootLoggerLevel = getLevelString(rootLoggerParts, Level.ERROR.name());
+ final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
+ //
final String[] sortedAppenderNames = Arrays.copyOfRange(rootLoggerParts, 1, rootLoggerParts.length);
Arrays.sort(sortedAppenderNames);
- final RootLoggerComponentBuilder loggerBuilder = builder.newRootLogger(rootLoggerLevel);
for (final String appender : sortedAppenderNames) {
loggerBuilder.add(builder.newAppenderRef(appender));
}
builder.add(loggerBuilder);
- return sortedAppenderNames;
}
private String getLevelString(final String[] loggerParts, final String defaultLevel) {
@@ -401,8 +401,10 @@ private void buildLoggers(final String prefix) {
final LoggerComponentBuilder newLogger = builder.newLogger(name, level);
if (split.length > 1) {
// Add Appenders to this logger
- for (int i = 1; i < split.length; i++) {
- newLogger.add(builder.newAppenderRef(split[i]));
+ final String[] sortedAppenderNames = Arrays.copyOfRange(split, 1, split.length);
+ Arrays.sort(sortedAppenderNames);
+ for (String appenderName : sortedAppenderNames) {
+ newLogger.add(builder.newAppenderRef(appenderName));
}
}
builder.add(newLogger);
From e3a9fe582fd9e7aba47879b205d4767dc8921615 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 12 Nov 2016 01:11:40 -0800
Subject: [PATCH 59/84] Add final modifier to method parameters.
---
.../apache/log4j/config/Log4j1ConfigurationConverter.java | 2 +-
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index 9e63a730..dcb1ecbe 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -123,7 +123,7 @@ public static void main(final String[] args) {
Log4j1ConfigurationConverter.class, new CommandLineArguments())).run();
}
- public static Log4j1ConfigurationConverter run(CommandLineArguments cla) {
+ public static Log4j1ConfigurationConverter run(final CommandLineArguments cla) {
final Log4j1ConfigurationConverter log4j1ConfigurationConverter = new Log4j1ConfigurationConverter(cla);
log4j1ConfigurationConverter.run();
return log4j1ConfigurationConverter;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 894f6e53..c453f61e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -134,7 +134,7 @@ private void buildProperties() {
}
}
- private void warn(String string) {
+ private void warn(final String string) {
System.err.println(string);
}
@@ -280,7 +280,7 @@ private void buildMandatoryAttribute(final String componentName, final Component
}
}
- private void buildNullAppender(String appenderName) {
+ private void buildNullAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName, NullAppender.PLUGIN_NAME);
builder.add(appenderBuilder);
}
@@ -425,7 +425,7 @@ private String getProperty(final String key) {
return strSubstitutorProperties.replace(sysValue);
}
- private String getProperty(final String key, String defaultValue) {
+ private String getProperty(final String key, final String defaultValue) {
final String value = getProperty(key);
return value == null ? defaultValue : value;
}
From 58974f63a5e001c0e62a801936a6ad2e76ce51d0 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 12 Nov 2016 01:12:21 -0800
Subject: [PATCH 60/84] Add final modifier to local variables
---
.../org/apache/log4j/config/Log4j1ConfigurationConverter.java | 4 ++--
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index dcb1ecbe..aef822e5 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -185,7 +185,7 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
return FileVisitResult.CONTINUE;
}
});
- } catch (IOException e) {
+ } catch (final IOException e) {
throw new ConfigurationException(e);
} finally {
verbose("OK = %,d, Failures = %,d, Total = %,d", countOKs.get(), countFails.get(),
@@ -195,7 +195,7 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
verbose("Reading %s", cla.getPathIn());
try (final InputStream input = getInputStream(); final OutputStream output = getOutputStream()) {
convert(input, output);
- } catch (IOException e) {
+ } catch (final IOException e) {
throw new ConfigurationException(e);
}
verbose("Wrote %s", cla.getPathOut());
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index c453f61e..112ab424 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -126,7 +126,7 @@ public ConfigurationBuilder buildConfigurationBuilder(final
}
private void buildProperties() {
- for (Map.Entry entry : new TreeMap<>(properties).entrySet()) {
+ for (final Map.Entry entry : new TreeMap<>(properties).entrySet()) {
final String key = entry.getKey().toString();
if (!key.startsWith("log4j.") && !key.equals(ROOTCATEGORY) && !key.equals(ROOTLOGGER)) {
builder.addProperty(key, Objects.toString(entry.getValue(), Strings.EMPTY));
@@ -403,7 +403,7 @@ private void buildLoggers(final String prefix) {
// Add Appenders to this logger
final String[] sortedAppenderNames = Arrays.copyOfRange(split, 1, split.length);
Arrays.sort(sortedAppenderNames);
- for (String appenderName : sortedAppenderNames) {
+ for (final String appenderName : sortedAppenderNames) {
newLogger.add(builder.newAppenderRef(appenderName));
}
}
From 8899cc7e2901582031c8907f694c401649993b5b Mon Sep 17 00:00:00 2001
From: rpopma
Date: Tue, 15 Aug 2017 01:18:19 +0900
Subject: [PATCH 61/84] LOG4J2-2011 replace JCommander command line parser with
picocli to let users run Log4j2 utility applications without requiring an
external dependency
---
.../config/Log4j1ConfigurationConverter.java | 37 ++++++++++++-------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index aef822e5..516286b7 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -30,20 +30,21 @@
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.util.BasicCommandLineArguments;
-
-import com.beust.jcommander.Parameter;
+import org.apache.logging.log4j.core.util.picocli.CommandLine;
+import org.apache.logging.log4j.core.util.picocli.CommandLine.Command;
+import org.apache.logging.log4j.core.util.picocli.CommandLine.Option;
/**
* Tool for converting a Log4j 1.x properties configuration file to Log4j 2.x XML configuration file.
- *
+ *
*
* Run with "--help" on the command line.
*
- *
+ *
*
* Example:
*
- *
+ *
*
* java org.apache.log4j.config.Log4j1ConfigurationConverter --recurse
* E:\vcs\git\apache\logging\logging-log4j2\log4j-1.2-api\src\test\resources\config-1.2\hadoop --in log4j.properties --verbose
@@ -51,21 +52,22 @@
*/
public final class Log4j1ConfigurationConverter {
- public static class CommandLineArguments extends BasicCommandLineArguments {
+ @Command(name = "Log4j1ConfigurationConverter")
+ public static class CommandLineArguments extends BasicCommandLineArguments implements Runnable {
- @Parameter(names = { "--failfast", "-f" }, description = "Fails on the first failure in recurse mode.")
+ @Option(names = { "--failfast", "-f" }, description = "Fails on the first failure in recurse mode.")
private boolean failFast;
- @Parameter(names = { "--in", "-i" }, description = "Specifies the input file.")
+ @Option(names = { "--in", "-i" }, description = "Specifies the input file.")
private Path pathIn;
- @Parameter(names = { "--out", "-o" }, description = "Specifies the output file.")
+ @Option(names = { "--out", "-o" }, description = "Specifies the output file.")
private Path pathOut;
- @Parameter(names = { "--recurse", "-r" }, description = "Recurses into this folder looking for the input file")
+ @Option(names = { "--recurse", "-r" }, description = "Recurses into this folder looking for the input file")
private Path recurseIntoPath;
- @Parameter(names = { "--verbose", "-v" }, description = "Be verbose.")
+ @Option(names = { "--verbose", "-v" }, description = "Be verbose.")
private boolean verbose;
public Path getPathIn() {
@@ -108,19 +110,26 @@ public void setVerbose(final boolean verbose) {
this.verbose = verbose;
}
+ @Override
+ public void run() {
+ if (isHelp()) {
+ CommandLine.usage(this, System.err);
+ return;
+ }
+ new Log4j1ConfigurationConverter(this).run();
+ }
+
@Override
public String toString() {
return "CommandLineArguments [recurseIntoPath=" + recurseIntoPath + ", verbose=" + verbose + ", pathIn="
+ pathIn + ", pathOut=" + pathOut + "]";
}
-
}
private static final String FILE_EXT_XML = ".xml";
public static void main(final String[] args) {
- new Log4j1ConfigurationConverter(BasicCommandLineArguments.parseCommandLine(args,
- Log4j1ConfigurationConverter.class, new CommandLineArguments())).run();
+ CommandLine.run(new CommandLineArguments(), System.err, args);
}
public static Log4j1ConfigurationConverter run(final CommandLineArguments cla) {
From 0341e791aae28e9cb2ac4f9495f26cfe91488302 Mon Sep 17 00:00:00 2001
From: rpopma
Date: Wed, 16 Aug 2017 07:23:19 +0900
Subject: [PATCH 62/84] LOG4J2-2011 moved classes from util.picocli to
tools.picocli
---
.../apache/log4j/config/Log4j1ConfigurationConverter.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index 516286b7..4475f6ab 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -29,10 +29,10 @@
import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import org.apache.logging.log4j.core.util.BasicCommandLineArguments;
-import org.apache.logging.log4j.core.util.picocli.CommandLine;
-import org.apache.logging.log4j.core.util.picocli.CommandLine.Command;
-import org.apache.logging.log4j.core.util.picocli.CommandLine.Option;
+import org.apache.logging.log4j.core.tools.BasicCommandLineArguments;
+import org.apache.logging.log4j.core.tools.picocli.CommandLine;
+import org.apache.logging.log4j.core.tools.picocli.CommandLine.Command;
+import org.apache.logging.log4j.core.tools.picocli.CommandLine.Option;
/**
* Tool for converting a Log4j 1.x properties configuration file to Log4j 2.x XML configuration file.
From 8690b90d864ade88ae3996e1b02b2dfd4186af73 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 3 Feb 2021 11:15:20 -0500
Subject: [PATCH 63/84] [LOG4J2-3014] Log4j1ConfigurationConverter on Windows
produces "
" at end of every line.
---
.../config/Log4j1ConfigurationConverter.java | 26 ++++++++++++++++---
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index 4475f6ab..caede4e4 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.log4j.config;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -26,9 +28,14 @@
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.atomic.AtomicInteger;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder;
import org.apache.logging.log4j.core.tools.BasicCommandLineArguments;
import org.apache.logging.log4j.core.tools.picocli.CommandLine;
import org.apache.logging.log4j.core.tools.picocli.CommandLine.Command;
@@ -175,11 +182,16 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
final int lastIndex = newFile.lastIndexOf(".");
newFile = lastIndex < 0 ? newFile + FILE_EXT_XML
: newFile.substring(0, lastIndex) + FILE_EXT_XML;
- final Path resolved = file.resolveSibling(newFile);
+ final Path resolvedPath = file.resolveSibling(newFile);
try (final InputStream input = new InputStreamWrapper(Files.newInputStream(file), file.toString());
- final OutputStream output = Files.newOutputStream(resolved)) {
+ final OutputStream output = Files.newOutputStream(resolvedPath)) {
try {
- convert(input, output);
+ final ByteArrayOutputStream tmpOutput = new ByteArrayOutputStream();
+ convert(input, tmpOutput);
+ tmpOutput.close();
+ DefaultConfigurationBuilder.formatXml(
+ new StreamSource(new ByteArrayInputStream(tmpOutput.toByteArray())),
+ new StreamResult(output));
countOKs.incrementAndGet();
} catch (ConfigurationException | IOException e) {
countFails.incrementAndGet();
@@ -187,8 +199,14 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
throw e;
}
e.printStackTrace();
+ } catch (TransformerException e) {
+ countFails.incrementAndGet();
+ if (cla.isFailFast()) {
+ throw new IOException(e);
+ }
+ e.printStackTrace();
}
- verbose("Wrote %s", resolved);
+ verbose("Wrote %s", resolvedPath);
}
}
return FileVisitResult.CONTINUE;
From b94517cdd58ec824c52c84d092e9120195180d64 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 29 Jul 2021 10:28:36 -0400
Subject: [PATCH 64/84] Remove trailing white spaces on all lines.
---
.../java/org/apache/log4j/config/Log4j1ConfigurationParser.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 112ab424..ea2834f0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -47,7 +47,7 @@
* Experimental parser for Log4j 1.2 properties configuration files.
*
* This class is not thread-safe.
- *
+ *
*
* From the Log4j 1.2 Javadocs:
*
From af69703c4d38d746a22f1a5d79de7fad090c30f2 Mon Sep 17 00:00:00 2001
From: Carter Kozak
Date: Thu, 16 Dec 2021 17:11:56 -0500
Subject: [PATCH 65/84] Fix string substitution recursion
---
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index ea2834f0..ae5b0f72 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -39,6 +39,7 @@
import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.core.lookup.ConfigurationStrSubstitutor;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
@@ -89,8 +90,8 @@ public ConfigurationBuilder buildConfigurationBuilder(final
throws IOException {
try {
properties.load(input);
- strSubstitutorProperties = new StrSubstitutor(properties);
- strSubstitutorSystem = new StrSubstitutor(System.getProperties());
+ strSubstitutorProperties = new ConfigurationStrSubstitutor(properties);
+ strSubstitutorSystem = new ConfigurationStrSubstitutor(System.getProperties());
final String rootCategoryValue = getLog4jValue(ROOTCATEGORY);
final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
if (rootCategoryValue == null && rootLoggerValue == null) {
From 3af65c76d006063f895d29d7630ea1e550cd70e0 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 13 Jan 2022 07:50:40 -0500
Subject: [PATCH 66/84] Use generics.
---
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index ae5b0f72..d9c7f51e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -257,7 +257,7 @@ private void buildRollingFileAppender(final String appenderName) {
builder.add(appenderBuilder);
}
- private void buildAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ private void buildAttribute(final String componentName, final ComponentBuilder> componentBuilder,
final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
@@ -265,13 +265,13 @@ private void buildAttribute(final String componentName, final ComponentBuilder c
}
}
- private void buildAttributeWithDefault(final String componentName, final ComponentBuilder componentBuilder,
+ private void buildAttributeWithDefault(final String componentName, final ComponentBuilder> componentBuilder,
final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
- private void buildMandatoryAttribute(final String componentName, final ComponentBuilder componentBuilder,
+ private void buildMandatoryAttribute(final String componentName, final ComponentBuilder> componentBuilder,
final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
From a196fcc4b28caea7f05b0aa654b2abc17786b38d Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 20 Jan 2022 18:27:28 -0500
Subject: [PATCH 67/84] Log4j 1.2 bridge throws ClassCastException when using
SimpleLayout and others #708.
---
.../apache/log4j/config/Log4j1ConfigurationParser.java | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index d9c7f51e..962bdebf 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -25,6 +25,7 @@
import java.util.Properties;
import java.util.TreeMap;
+import org.apache.log4j.helpers.OptionConverter;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.appender.FileAppender;
@@ -39,8 +40,6 @@
import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import org.apache.logging.log4j.core.lookup.ConfigurationStrSubstitutor;
-import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
@@ -69,8 +68,6 @@ public class Log4j1ConfigurationParser {
private static final String FALSE = "false";
private final Properties properties = new Properties();
- private StrSubstitutor strSubstitutorProperties;
- private StrSubstitutor strSubstitutorSystem;
private final ConfigurationBuilder builder = ConfigurationBuilderFactory
.newConfigurationBuilder();
@@ -90,8 +87,6 @@ public ConfigurationBuilder buildConfigurationBuilder(final
throws IOException {
try {
properties.load(input);
- strSubstitutorProperties = new ConfigurationStrSubstitutor(properties);
- strSubstitutorSystem = new ConfigurationStrSubstitutor(System.getProperties());
final String rootCategoryValue = getLog4jValue(ROOTCATEGORY);
final String rootLoggerValue = getLog4jValue(ROOTLOGGER);
if (rootCategoryValue == null && rootLoggerValue == null) {
@@ -422,8 +417,7 @@ private String getLog4jAppenderValue(final String appenderName, final String att
private String getProperty(final String key) {
final String value = properties.getProperty(key);
- final String sysValue = strSubstitutorSystem.replace(value);
- return strSubstitutorProperties.replace(sysValue);
+ return OptionConverter.substVars(value, properties);
}
private String getProperty(final String key, final String defaultValue) {
From 53421919e6c76088fc6ff6a23662dff4f05aa54e Mon Sep 17 00:00:00 2001
From: ppkarwasz
Date: Fri, 4 Feb 2022 22:06:55 +0100
Subject: [PATCH 68/84] Adds support for missing Log4j 1.x properties and fixes
default values (#737)
* Fixes default Log4j 1.x values
The properties of the generated appenders are not always the same as it
was in Log4j 1.x.
* Fixes NoSuchFieldError
Adapts `getAppendProperty` to different Java versions.
* Fixes whitespace problems
Conflicts:
log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
log4j-1.2-api/src/test/java/org/apache/log4j/config/PropertiesConfigurationTest.java
---
.../config/Log4j1ConfigurationParser.java | 28 +++++++++++++++----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 962bdebf..c16be44c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -66,6 +66,8 @@ public class Log4j1ConfigurationParser {
private static final String ROOTCATEGORY = "rootCategory";
private static final String TRUE = "true";
private static final String FALSE = "false";
+ private static final String RELATIVE = "RELATIVE";
+ private static final String NULL = "NULL";
private final Properties properties = new Properties();
@@ -226,7 +228,7 @@ private void buildDailyRollingFileAppender(final String appenderName) {
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
- final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
+ final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", ".yyyy-MM-dd");
appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
@@ -287,8 +289,9 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
switch (layoutClass) {
case "org.apache.log4j.PatternLayout":
case "org.apache.log4j.EnhancedPatternLayout": {
- final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null)
-
+ String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null);
+ if (pattern != null) {
+ pattern = pattern
// Log4j 2's %x (NDC) is not compatible with Log4j 1's
// %x
// Log4j 1: "foo bar baz"
@@ -302,7 +305,9 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
// Log4j 2: "{foo=bar,hoo=boo}"
// Use %properties to get the Log4j 1 format
.replace("%X", "%properties");
-
+ } else {
+ pattern = "%m%n";
+ }
appenderBuilder.add(newPatternLayout(pattern));
break;
}
@@ -311,7 +316,20 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
break;
}
case "org.apache.log4j.TTCCLayout": {
- String pattern = "%r ";
+ String pattern = "";
+ final String dateFormat = getLog4jAppenderValue(name, "layout.DateFormat", RELATIVE);
+ final String timezone = getLog4jAppenderValue(name, "layout.TimeZone", null);
+ if (dateFormat != null) {
+ if (RELATIVE.equalsIgnoreCase(dateFormat)) {
+ pattern += "%r ";
+ } else if (!NULL.equalsIgnoreCase(dateFormat)){
+ pattern += "%d{" + dateFormat + "}";
+ if (timezone != null) {
+ pattern += "{" + timezone + "}";
+ }
+ pattern += " ";
+ }
+ }
if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", TRUE))) {
pattern += "[%t] ";
}
From c255b1297c0127f1b592deb1c05cfcdecf7930b3 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 19 Feb 2022 17:25:03 -0500
Subject: [PATCH 69/84] Remove unused method.
---
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 6 ------
1 file changed, 6 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index c16be44c..5425244c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -262,12 +262,6 @@ private void buildAttribute(final String componentName, final ComponentBuilder
}
}
- private void buildAttributeWithDefault(final String componentName, final ComponentBuilder> componentBuilder,
- final String sourceAttributeName, final String targetAttributeName, final String defaultValue) {
- final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName, defaultValue);
- componentBuilder.addAttribute(targetAttributeName, attributeValue);
- }
-
private void buildMandatoryAttribute(final String componentName, final ComponentBuilder> componentBuilder,
final String sourceAttributeName, final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
From cf8bc91b14155fae1306664d3689f8243d7b5713 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 19 Feb 2022 18:12:56 -0500
Subject: [PATCH 70/84] Allow for whitespace in property files.
Tests are from PR #762 by ppkarwasz.
Conflicts:
log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java
log4j-1.2-api/src/test/java/org/apache/log4j/config/PropertiesConfigurationTest.java
---
.../log4j/config/Log4j1ConfigurationParser.java | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 5425244c..d345ba05 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -143,13 +143,13 @@ private Map buildClassToPropertyPrefixMap() {
for (final Map.Entry entry : properties.entrySet()) {
final Object keyObj = entry.getKey();
if (keyObj != null) {
- final String key = keyObj.toString();
+ final String key = keyObj.toString().trim();
if (key.startsWith(prefix)) {
if (key.indexOf('.', preLength) < 0) {
final String name = key.substring(preLength);
final Object value = entry.getValue();
if (value != null) {
- map.put(name, value.toString());
+ map.put(name, value.toString().trim());
}
}
}
@@ -394,13 +394,13 @@ private void buildLoggers(final String prefix) {
for (final Map.Entry entry : properties.entrySet()) {
final Object keyObj = entry.getKey();
if (keyObj != null) {
- final String key = keyObj.toString();
+ final String key = keyObj.toString().trim();
if (key.startsWith(prefix)) {
final String name = key.substring(preLength);
final Object value = entry.getValue();
if (value != null) {
// a Level may be followed by a list of Appender refs.
- final String valueStr = value.toString();
+ final String valueStr = value.toString().trim();
final String[] split = valueStr.split(COMMA_DELIMITED_RE);
final String level = getLevelString(split, null);
if (level == null) {
@@ -429,7 +429,8 @@ private String getLog4jAppenderValue(final String appenderName, final String att
private String getProperty(final String key) {
final String value = properties.getProperty(key);
- return OptionConverter.substVars(value, properties);
+ final String substVars = OptionConverter.substVars(value, properties);
+ return substVars == null ? null : substVars.trim();
}
private String getProperty(final String key, final String defaultValue) {
From 8f138d695807f43892229d6cc6c8bb3c508ebff9 Mon Sep 17 00:00:00 2001
From: ppkarwasz
Date: Mon, 21 Feb 2022 20:46:57 +0100
Subject: [PATCH 71/84] Adds Log4j 1.x global threshold (#764)
The `log4j.threshold` configuration key was not translated into its
Log4j 2.x equivalent global filter.
Conflicts:
log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
---
.../log4j/config/Log4j1ConfigurationParser.java | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index d345ba05..927c1543 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -25,8 +25,10 @@
import java.util.Properties;
import java.util.TreeMap;
+import org.apache.log4j.LogManager;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.Filter.Result;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.appender.FileAppender;
import org.apache.logging.log4j.core.appender.NullAppender;
@@ -36,10 +38,12 @@
import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
+import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.core.filter.ThresholdFilter;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
@@ -103,6 +107,13 @@ public ConfigurationBuilder buildConfigurationBuilder(final
if (Boolean.valueOf(debugValue)) {
builder.setStatusLevel(Level.DEBUG);
}
+ // global threshold
+ final String threshold = OptionConverter.findAndSubst(PropertiesConfiguration.THRESHOLD_KEY, properties);
+ if (threshold != null) {
+ final Level level = OptionConverter.convertLevel(threshold.trim(), Level.ALL);
+ builder.add(builder.newFilter("ThresholdFilter", Result.NEUTRAL, Result.DENY)
+ .addAttribute("level", level));
+ }
// Root
buildRootLogger(getLog4jValue(ROOTCATEGORY));
buildRootLogger(getLog4jValue(ROOTLOGGER));
From 45a0b608e95963bdaeea9e14e4717547fcbb6ab0 Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Thu, 31 Mar 2022 00:44:38 +0200
Subject: [PATCH 72/84] `final` synchronization with 2.17.2
Synchronizes `log4j-1.2-api` main source with version 2.17.2. It mainly
consists of:
* formatting,
* `final` modifiers,
* the removal of the deprecated `Holder` class.
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 2 +-
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 5 +----
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 83f66753..467d88d4 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -37,7 +37,7 @@
// @Order(50)
public class Log4j1ConfigurationFactory extends ConfigurationFactory {
- private static final String[] SUFFIXES = {".properties"};
+ private static final String[] SUFFIXES = { ".properties" };
@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 927c1543..985594c6 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -25,7 +25,6 @@
import java.util.Properties;
import java.util.TreeMap;
-import org.apache.log4j.LogManager;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Filter.Result;
@@ -38,12 +37,10 @@
import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
-import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import org.apache.logging.log4j.core.filter.ThresholdFilter;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
@@ -104,7 +101,7 @@ public ConfigurationBuilder buildConfigurationBuilder(final
builder.setConfigurationName("Log4j1");
// DEBUG
final String debugValue = getLog4jValue("debug");
- if (Boolean.valueOf(debugValue)) {
+ if (Boolean.parseBoolean(debugValue)) {
builder.setStatusLevel(Level.DEBUG);
}
// global threshold
From 42ec510f48f29472f2167119d7344a5a41966f78 Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Mon, 14 Mar 2022 21:52:10 +0100
Subject: [PATCH 73/84] [LOG4J2-3419] Add a Log4j 1.x level name pattern
converter
When custom levels are in play the names of Log4j 1.x custom levels
(which are not unique) and those of Log4j 2.x custom levels (which must
be unique) do not match.
There is a need therefore for a pattern converter specific to Log4j 1.x.
Conflicts:
log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/SimpleLayoutBuilder.java
---
.../config/Log4j1ConfigurationParser.java | 30 ++++++++++---------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 985594c6..33a0ba2f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -294,19 +294,21 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null);
if (pattern != null) {
pattern = pattern
- // Log4j 2's %x (NDC) is not compatible with Log4j 1's
- // %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Use %ndc to get the Log4j 1 format
- .replace("%x", "%ndc")
-
- // Log4j 2's %X (MDC) is not compatible with Log4j 1's
- // %X
- // Log4j 1: "{{foo,bar}{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- // Use %properties to get the Log4j 1 format
- .replace("%X", "%properties");
+ // Log4j 2 and Log4j 1 level names differ for custom levels
+ .replaceAll("%([-\\.\\d]*)p", "%$1v1Level")
+ // Log4j 2's %x (NDC) is not compatible with Log4j 1's
+ // %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // Use %ndc to get the Log4j 1 format
+ .replaceAll("%([-\\.\\d]*)x", "%$1ndc")
+
+ // Log4j 2's %X (MDC) is not compatible with Log4j 1's
+ // %X
+ // Log4j 1: "{{foo,bar}{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
+ // Use %properties to get the Log4j 1 format
+ .replaceAll("%([-\\.\\d]*)X", "%$1properties");
} else {
pattern = "%m%n";
}
@@ -314,7 +316,7 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
break;
}
case "org.apache.log4j.SimpleLayout": {
- appenderBuilder.add(newPatternLayout("%level - %m%n"));
+ appenderBuilder.add(newPatternLayout("%v1Level - %m%n"));
break;
}
case "org.apache.log4j.TTCCLayout": {
From c28d39ff81fa03e38bfb85af419e266257a61674 Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Wed, 23 Mar 2022 21:37:20 +0100
Subject: [PATCH 74/84] [LOG4J2-3419] Allows %pid in Log4j 1.x patterns
Although `%pid` was never a valid Log4j 1.x pattern, it was supported in
the previous bridge versions.
This fixes a regression with respect to `log4j-1.2-api` version 2.17.2.
Conflicts:
log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
---
.../org/apache/log4j/config/Log4j1ConfigurationParser.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 33a0ba2f..3d364bca 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -295,20 +295,20 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
if (pattern != null) {
pattern = pattern
// Log4j 2 and Log4j 1 level names differ for custom levels
- .replaceAll("%([-\\.\\d]*)p", "%$1v1Level")
+ .replaceAll("%([-\\.\\d]*)p(?!\\w)", "%$1v1Level")
// Log4j 2's %x (NDC) is not compatible with Log4j 1's
// %x
// Log4j 1: "foo bar baz"
// Log4j 2: "[foo, bar, baz]"
// Use %ndc to get the Log4j 1 format
- .replaceAll("%([-\\.\\d]*)x", "%$1ndc")
+ .replaceAll("%([-\\.\\d]*)x(?!\\w)", "%$1ndc")
// Log4j 2's %X (MDC) is not compatible with Log4j 1's
// %X
// Log4j 1: "{{foo,bar}{hoo,boo}}"
// Log4j 2: "{foo=bar,hoo=boo}"
// Use %properties to get the Log4j 1 format
- .replaceAll("%([-\\.\\d]*)X", "%$1properties");
+ .replaceAll("%([-\\.\\d]*)X(?!\\w)", "%$1properties");
} else {
pattern = "%m%n";
}
From 3803627a08088ddc50c0eb5962dd0d8884e9fe83 Mon Sep 17 00:00:00 2001
From: Matt Sicker
Date: Mon, 16 May 2022 01:12:59 -0500
Subject: [PATCH 75/84] Extract Category annotation from Plugin and add to Key
- Moved Plugin::category into recently created annotation Category::value
- Category is no longer a qualifier type but instead a namespace for Key.
- Allow for stereotype annotations for Category to make categories annotation-type-safe when desired (including new TypeConverterCategory stereotype)
- Rename Plugin::name to Plugin::value and make it optional, defaulting to the simple class name of the annotated class
- Add PluginEntry::getElementName to more consistently store element names along with refactoring to use a builder pattern
- Fix PluginElementVisitor to fall back to checking a plugin name when the element name isn't defined. This inconsistency arose from a typo somewhere.
- Update PluginOrder to fall back to comparing by class name when neither class is annotated
- Replace Named with Category when injecting plugin categories
- Update docs to clarify that plugin categories are namespaces
Signed-off-by: Matt Sicker
---
.../apache/log4j/config/Log4j1ConfigurationFactory.java | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 467d88d4..af4de345 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -16,9 +16,6 @@
*/
package org.apache.log4j.config;
-import java.io.IOException;
-import java.io.InputStream;
-
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
@@ -27,11 +24,15 @@
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import java.io.IOException;
+import java.io.InputStream;
+
/**
* Experimental ConfigurationFactory for Log4j 1.2 properties configuration files.
*/
// TODO
-// @Plugin(name = "Log4j1ConfigurationFactory", category = ConfigurationFactory.CATEGORY)
+// @Category(ConfigurationFactory.CATEGORY)
+// @Plugin("Log4j1ConfigurationFactory")
//
// Best Value?
// @Order(50)
From 98f9cee1be9611edcdff9cb74eb59c03bccbface Mon Sep 17 00:00:00 2001
From: Michael Ernst
Date: Wed, 12 Apr 2023 06:05:40 -0700
Subject: [PATCH 76/84] Change `{@literal null}` to `{@code null}` (#1424)
---
.../java/org/apache/log4j/config/Log4j1ConfigurationParser.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 3d364bca..d9f64792 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -80,7 +80,7 @@ public class Log4j1ConfigurationParser {
*
* @param input
* InputStream to read from is assumed to be ISO 8859-1, and will not be closed.
- * @return the populated ConfigurationBuilder, never {@literal null}
+ * @return the populated ConfigurationBuilder, never {@code null}
* @throws IOException
* if unable to read the input
* @throws ConfigurationException
From f37afc14dd7dbc85595803dd7df5f255c8babbb8 Mon Sep 17 00:00:00 2001
From: "spotless[bot]"
Date: Tue, 25 Apr 2023 18:47:04 +0200
Subject: [PATCH 77/84] Apply Spotless to all files
---
.../apache/log4j/config/InputStreamWrapper.java | 10 +++++-----
.../config/Log4j1ConfigurationConverter.java | 10 +++++-----
.../log4j/config/Log4j1ConfigurationFactory.java | 16 ++++++++--------
.../log4j/config/Log4j1ConfigurationParser.java | 10 +++++-----
4 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
index 19bf9a9a..9f8f2bbe 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
@@ -1,18 +1,18 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
+ * 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 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
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
package org.apache.log4j.config;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index caede4e4..ac78bde2 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -1,18 +1,18 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
+ * 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 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
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
package org.apache.log4j.config;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index af4de345..15a783e5 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -1,21 +1,24 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
+ * 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 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
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
package org.apache.log4j.config;
+import java.io.IOException;
+import java.io.InputStream;
+
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
@@ -24,9 +27,6 @@
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import java.io.IOException;
-import java.io.InputStream;
-
/**
* Experimental ConfigurationFactory for Log4j 1.2 properties configuration files.
*/
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index d9f64792..484ca354 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -1,18 +1,18 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
+ * 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 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
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
package org.apache.log4j.config;
From 10f8cc21996f554aad197d796f19d4a77b3bf0b1 Mon Sep 17 00:00:00 2001
From: Krzysztof Krason
Date: Mon, 21 Aug 2023 14:11:04 +0200
Subject: [PATCH 78/84] Updated default fileIndex for rollover strategy in
log4j1
---
.../log4j/config/Log4j1ConfigurationParser.java | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 484ca354..6d10d436 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -241,8 +241,10 @@ private void buildDailyRollingFileAppender(final String appenderName) {
final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
appenderBuilder.addComponent(triggeringPolicy);
- appenderBuilder
- .addComponent(builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
+ appenderBuilder.addComponent(builder.newComponent("DefaultRolloverStrategy")
+ .addAttribute("max", Integer.MAX_VALUE)
+ .addAttribute("fileIndex", "min")
+ );
builder.add(appenderBuilder);
}
@@ -258,7 +260,10 @@ private void buildRollingFileAppender(final String appenderName) {
builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder.addComponent(
- builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
+ builder.newComponent("DefaultRolloverStrategy")
+ .addAttribute("max", maxBackupIndexString)
+ .addAttribute("fileIndex", "min")
+ );
builder.add(appenderBuilder);
}
From fce7b8f2d97eb292c9079b89f1bf8e04d561e229 Mon Sep 17 00:00:00 2001
From: Spotless
Date: Mon, 20 Nov 2023 12:34:04 +0100
Subject: [PATCH 79/84] Format using Palantir formatter
---
.../log4j/config/InputStreamWrapper.java | 1 -
.../config/Log4j1ConfigurationConverter.java | 47 ++--
.../config/Log4j1ConfigurationFactory.java | 4 +-
.../config/Log4j1ConfigurationParser.java | 247 +++++++++---------
4 files changed, 156 insertions(+), 143 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
index 9f8f2bbe..49eaea91 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
@@ -88,5 +88,4 @@ public long skip(final long n) throws IOException {
public String toString() {
return getClass().getSimpleName() + " [description=" + description + ", input=" + input + "]";
}
-
}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
index ac78bde2..c0f8e73f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
@@ -27,11 +27,9 @@
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.atomic.AtomicInteger;
-
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
-
import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
@@ -62,19 +60,29 @@ public final class Log4j1ConfigurationConverter {
@Command(name = "Log4j1ConfigurationConverter")
public static class CommandLineArguments extends BasicCommandLineArguments implements Runnable {
- @Option(names = { "--failfast", "-f" }, description = "Fails on the first failure in recurse mode.")
+ @Option(
+ names = {"--failfast", "-f"},
+ description = "Fails on the first failure in recurse mode.")
private boolean failFast;
- @Option(names = { "--in", "-i" }, description = "Specifies the input file.")
+ @Option(
+ names = {"--in", "-i"},
+ description = "Specifies the input file.")
private Path pathIn;
- @Option(names = { "--out", "-o" }, description = "Specifies the output file.")
+ @Option(
+ names = {"--out", "-o"},
+ description = "Specifies the output file.")
private Path pathOut;
- @Option(names = { "--recurse", "-r" }, description = "Recurses into this folder looking for the input file")
+ @Option(
+ names = {"--recurse", "-r"},
+ description = "Recurses into this folder looking for the input file")
private Path recurseIntoPath;
- @Option(names = { "--verbose", "-v" }, description = "Be verbose.")
+ @Option(
+ names = {"--verbose", "-v"},
+ description = "Be verbose.")
private boolean verbose;
public Path getPathIn() {
@@ -152,8 +160,8 @@ private Log4j1ConfigurationConverter(final CommandLineArguments cla) {
}
protected void convert(final InputStream input, final OutputStream output) throws IOException {
- final ConfigurationBuilder builder = new Log4j1ConfigurationParser()
- .buildConfigurationBuilder(input);
+ final ConfigurationBuilder builder =
+ new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
builder.writeXmlConfiguration(output);
}
@@ -180,18 +188,20 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
verbose("Reading %s", file);
String newFile = file.getFileName().toString();
final int lastIndex = newFile.lastIndexOf(".");
- newFile = lastIndex < 0 ? newFile + FILE_EXT_XML
+ newFile = lastIndex < 0
+ ? newFile + FILE_EXT_XML
: newFile.substring(0, lastIndex) + FILE_EXT_XML;
final Path resolvedPath = file.resolveSibling(newFile);
- try (final InputStream input = new InputStreamWrapper(Files.newInputStream(file), file.toString());
- final OutputStream output = Files.newOutputStream(resolvedPath)) {
+ try (final InputStream input =
+ new InputStreamWrapper(Files.newInputStream(file), file.toString());
+ final OutputStream output = Files.newOutputStream(resolvedPath)) {
try {
final ByteArrayOutputStream tmpOutput = new ByteArrayOutputStream();
convert(input, tmpOutput);
tmpOutput.close();
DefaultConfigurationBuilder.formatXml(
- new StreamSource(new ByteArrayInputStream(tmpOutput.toByteArray())),
- new StreamResult(output));
+ new StreamSource(new ByteArrayInputStream(tmpOutput.toByteArray())),
+ new StreamResult(output));
countOKs.incrementAndGet();
} catch (ConfigurationException | IOException e) {
countFails.incrementAndGet();
@@ -215,12 +225,14 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
} catch (final IOException e) {
throw new ConfigurationException(e);
} finally {
- verbose("OK = %,d, Failures = %,d, Total = %,d", countOKs.get(), countFails.get(),
- countOKs.get() + countFails.get());
+ verbose(
+ "OK = %,d, Failures = %,d, Total = %,d",
+ countOKs.get(), countFails.get(), countOKs.get() + countFails.get());
}
} else {
verbose("Reading %s", cla.getPathIn());
- try (final InputStream input = getInputStream(); final OutputStream output = getOutputStream()) {
+ try (final InputStream input = getInputStream();
+ final OutputStream output = getOutputStream()) {
convert(input, output);
} catch (final IOException e) {
throw new ConfigurationException(e);
@@ -234,5 +246,4 @@ private void verbose(final String template, final Object... args) {
System.err.println(String.format(template, args));
}
}
-
}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 15a783e5..5454ad7c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.io.InputStream;
-
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
@@ -38,7 +37,7 @@
// @Order(50)
public class Log4j1ConfigurationFactory extends ConfigurationFactory {
- private static final String[] SUFFIXES = { ".properties" };
+ private static final String[] SUFFIXES = {".properties"};
@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
@@ -55,5 +54,4 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
protected String[] getSupportedTypes() {
return SUFFIXES;
}
-
}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 6d10d436..4e8ea686 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -24,7 +24,6 @@
import java.util.Objects;
import java.util.Properties;
import java.util.TreeMap;
-
import org.apache.log4j.helpers.OptionConverter;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Filter.Result;
@@ -72,8 +71,8 @@ public class Log4j1ConfigurationParser {
private final Properties properties = new Properties();
- private final ConfigurationBuilder builder = ConfigurationBuilderFactory
- .newConfigurationBuilder();
+ private final ConfigurationBuilder builder =
+ ConfigurationBuilderFactory.newConfigurationBuilder();
/**
* Parses a Log4j 1.2 properties configuration file in ISO 8859-1 encoding into a ConfigurationBuilder.
@@ -168,23 +167,23 @@ private Map buildClassToPropertyPrefixMap() {
private void buildAppender(final String appenderName, final String appenderClass) {
switch (appenderClass) {
- case "org.apache.log4j.ConsoleAppender":
- buildConsoleAppender(appenderName);
- break;
- case "org.apache.log4j.FileAppender":
- buildFileAppender(appenderName);
- break;
- case "org.apache.log4j.DailyRollingFileAppender":
- buildDailyRollingFileAppender(appenderName);
- break;
- case "org.apache.log4j.RollingFileAppender":
- buildRollingFileAppender(appenderName);
- break;
- case "org.apache.log4j.varia.NullAppender":
- buildNullAppender(appenderName);
- break;
- default:
- reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
+ case "org.apache.log4j.ConsoleAppender":
+ buildConsoleAppender(appenderName);
+ break;
+ case "org.apache.log4j.FileAppender":
+ buildFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.DailyRollingFileAppender":
+ buildDailyRollingFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.RollingFileAppender":
+ buildRollingFileAppender(appenderName);
+ break;
+ case "org.apache.log4j.varia.NullAppender":
+ buildNullAppender(appenderName);
+ break;
+ default:
+ reportWarning("Unknown appender class: " + appenderClass + "; ignoring appender: " + appenderName);
}
}
@@ -194,15 +193,15 @@ private void buildConsoleAppender(final String appenderName) {
if (targetValue != null) {
final ConsoleAppender.Target target;
switch (targetValue) {
- case "System.out":
- target = ConsoleAppender.Target.SYSTEM_OUT;
- break;
- case "System.err":
- target = ConsoleAppender.Target.SYSTEM_ERR;
- break;
- default:
- reportWarning("Unknown value for console Target: " + targetValue);
- target = null;
+ case "System.out":
+ target = ConsoleAppender.Target.SYSTEM_OUT;
+ break;
+ case "System.err":
+ target = ConsoleAppender.Target.SYSTEM_ERR;
+ break;
+ default:
+ reportWarning("Unknown value for console Target: " + targetValue);
+ target = null;
}
if (target != null) {
appenderBuilder.addAttribute("target", target);
@@ -232,8 +231,8 @@ private void buildFileAppender(final String appenderName, final AppenderComponen
}
private void buildDailyRollingFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
- RollingFileAppender.PLUGIN_NAME);
+ final AppenderComponentBuilder appenderBuilder =
+ builder.newAppender(appenderName, RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", ".yyyy-MM-dd");
@@ -243,40 +242,44 @@ private void buildDailyRollingFileAppender(final String appenderName) {
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder.addComponent(builder.newComponent("DefaultRolloverStrategy")
.addAttribute("max", Integer.MAX_VALUE)
- .addAttribute("fileIndex", "min")
- );
+ .addAttribute("fileIndex", "min"));
builder.add(appenderBuilder);
}
private void buildRollingFileAppender(final String appenderName) {
- final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
- RollingFileAppender.PLUGIN_NAME);
+ final AppenderComponentBuilder appenderBuilder =
+ builder.newAppender(appenderName, RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
appenderBuilder.addAttribute("filePattern", fileName + ".%i");
final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
- final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies").addComponent(
- builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
+ final ComponentBuilder> triggeringPolicy = builder.newComponent("Policies")
+ .addComponent(
+ builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
appenderBuilder.addComponent(triggeringPolicy);
- appenderBuilder.addComponent(
- builder.newComponent("DefaultRolloverStrategy")
- .addAttribute("max", maxBackupIndexString)
- .addAttribute("fileIndex", "min")
- );
+ appenderBuilder.addComponent(builder.newComponent("DefaultRolloverStrategy")
+ .addAttribute("max", maxBackupIndexString)
+ .addAttribute("fileIndex", "min"));
builder.add(appenderBuilder);
}
- private void buildAttribute(final String componentName, final ComponentBuilder> componentBuilder,
- final String sourceAttributeName, final String targetAttributeName) {
+ private void buildAttribute(
+ final String componentName,
+ final ComponentBuilder> componentBuilder,
+ final String sourceAttributeName,
+ final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
}
}
- private void buildMandatoryAttribute(final String componentName, final ComponentBuilder> componentBuilder,
- final String sourceAttributeName, final String targetAttributeName) {
+ private void buildMandatoryAttribute(
+ final String componentName,
+ final ComponentBuilder> componentBuilder,
+ final String sourceAttributeName,
+ final String targetAttributeName) {
final String attributeValue = getLog4jAppenderValue(componentName, sourceAttributeName);
if (attributeValue != null) {
componentBuilder.addAttribute(targetAttributeName, attributeValue);
@@ -294,84 +297,87 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
final String layoutClass = getLog4jAppenderValue(name, "layout", null);
if (layoutClass != null) {
switch (layoutClass) {
- case "org.apache.log4j.PatternLayout":
- case "org.apache.log4j.EnhancedPatternLayout": {
- String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null);
- if (pattern != null) {
- pattern = pattern
- // Log4j 2 and Log4j 1 level names differ for custom levels
- .replaceAll("%([-\\.\\d]*)p(?!\\w)", "%$1v1Level")
- // Log4j 2's %x (NDC) is not compatible with Log4j 1's
- // %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Use %ndc to get the Log4j 1 format
- .replaceAll("%([-\\.\\d]*)x(?!\\w)", "%$1ndc")
-
- // Log4j 2's %X (MDC) is not compatible with Log4j 1's
- // %X
- // Log4j 1: "{{foo,bar}{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- // Use %properties to get the Log4j 1 format
- .replaceAll("%([-\\.\\d]*)X(?!\\w)", "%$1properties");
- } else {
- pattern = "%m%n";
+ case "org.apache.log4j.PatternLayout":
+ case "org.apache.log4j.EnhancedPatternLayout": {
+ String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null);
+ if (pattern != null) {
+ pattern = pattern
+ // Log4j 2 and Log4j 1 level names differ for custom levels
+ .replaceAll("%([-\\.\\d]*)p(?!\\w)", "%$1v1Level")
+ // Log4j 2's %x (NDC) is not compatible with Log4j 1's
+ // %x
+ // Log4j 1: "foo bar baz"
+ // Log4j 2: "[foo, bar, baz]"
+ // Use %ndc to get the Log4j 1 format
+ .replaceAll("%([-\\.\\d]*)x(?!\\w)", "%$1ndc")
+
+ // Log4j 2's %X (MDC) is not compatible with Log4j 1's
+ // %X
+ // Log4j 1: "{{foo,bar}{hoo,boo}}"
+ // Log4j 2: "{foo=bar,hoo=boo}"
+ // Use %properties to get the Log4j 1 format
+ .replaceAll("%([-\\.\\d]*)X(?!\\w)", "%$1properties");
+ } else {
+ pattern = "%m%n";
+ }
+ appenderBuilder.add(newPatternLayout(pattern));
+ break;
}
- appenderBuilder.add(newPatternLayout(pattern));
- break;
- }
- case "org.apache.log4j.SimpleLayout": {
- appenderBuilder.add(newPatternLayout("%v1Level - %m%n"));
- break;
- }
- case "org.apache.log4j.TTCCLayout": {
- String pattern = "";
- final String dateFormat = getLog4jAppenderValue(name, "layout.DateFormat", RELATIVE);
- final String timezone = getLog4jAppenderValue(name, "layout.TimeZone", null);
- if (dateFormat != null) {
- if (RELATIVE.equalsIgnoreCase(dateFormat)) {
- pattern += "%r ";
- } else if (!NULL.equalsIgnoreCase(dateFormat)){
- pattern += "%d{" + dateFormat + "}";
- if (timezone != null) {
- pattern += "{" + timezone + "}";
+ case "org.apache.log4j.SimpleLayout": {
+ appenderBuilder.add(newPatternLayout("%v1Level - %m%n"));
+ break;
+ }
+ case "org.apache.log4j.TTCCLayout": {
+ String pattern = "";
+ final String dateFormat = getLog4jAppenderValue(name, "layout.DateFormat", RELATIVE);
+ final String timezone = getLog4jAppenderValue(name, "layout.TimeZone", null);
+ if (dateFormat != null) {
+ if (RELATIVE.equalsIgnoreCase(dateFormat)) {
+ pattern += "%r ";
+ } else if (!NULL.equalsIgnoreCase(dateFormat)) {
+ pattern += "%d{" + dateFormat + "}";
+ if (timezone != null) {
+ pattern += "{" + timezone + "}";
+ }
+ pattern += " ";
}
- pattern += " ";
}
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", TRUE))) {
+ pattern += "[%t] ";
+ }
+ pattern += "%p ";
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", TRUE))) {
+ pattern += "%c ";
+ }
+ if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", TRUE))) {
+ pattern += "%notEmpty{%ndc }";
+ }
+ pattern += "- %m%n";
+ appenderBuilder.add(newPatternLayout(pattern));
+ break;
}
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ThreadPrinting", TRUE))) {
- pattern += "[%t] ";
- }
- pattern += "%p ";
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.CategoryPrefixing", TRUE))) {
- pattern += "%c ";
+ case "org.apache.log4j.HTMLLayout": {
+ final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
+ htmlLayout.addAttribute("title", getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
+ htmlLayout.addAttribute(
+ "locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
+ appenderBuilder.add(htmlLayout);
+ break;
}
- if (Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.ContextPrinting", TRUE))) {
- pattern += "%notEmpty{%ndc }";
+ case "org.apache.log4j.xml.XMLLayout": {
+ final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
+ xmlLayout.addAttribute(
+ "locationInfo",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
+ xmlLayout.addAttribute(
+ "properties",
+ Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", FALSE)));
+ appenderBuilder.add(xmlLayout);
+ break;
}
- pattern += "- %m%n";
- appenderBuilder.add(newPatternLayout(pattern));
- break;
- }
- case "org.apache.log4j.HTMLLayout": {
- final LayoutComponentBuilder htmlLayout = builder.newLayout("HtmlLayout");
- htmlLayout.addAttribute("title", getLog4jAppenderValue(name, "layout.Title", "Log4J Log Messages"));
- htmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
- appenderBuilder.add(htmlLayout);
- break;
- }
- case "org.apache.log4j.xml.XMLLayout": {
- final LayoutComponentBuilder xmlLayout = builder.newLayout("Log4j1XmlLayout");
- xmlLayout.addAttribute("locationInfo",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.LocationInfo", FALSE)));
- xmlLayout.addAttribute("properties",
- Boolean.parseBoolean(getLog4jAppenderValue(name, "layout.Properties", FALSE)));
- appenderBuilder.add(xmlLayout);
- break;
- }
- default:
- reportWarning("Unknown layout class: " + layoutClass);
+ default:
+ reportWarning("Unknown layout class: " + layoutClass);
}
}
}
@@ -453,8 +459,8 @@ private String getProperty(final String key, final String defaultValue) {
return value == null ? defaultValue : value;
}
- private String getLog4jAppenderValue(final String appenderName, final String attributeName,
- final String defaultValue) {
+ private String getLog4jAppenderValue(
+ final String appenderName, final String attributeName, final String defaultValue) {
return getProperty("log4j.appender." + appenderName + "." + attributeName, defaultValue);
}
@@ -465,5 +471,4 @@ private String getLog4jValue(final String key) {
private void reportWarning(final String msg) {
StatusLogger.getLogger().warn("Log4j 1 configuration parser: " + msg);
}
-
}
From eeff3d7ecfaaad7ad3d63b59700e93fc52b78c77 Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Mon, 4 Mar 2024 13:12:25 +0100
Subject: [PATCH 80/84] Generalize DI usage
This commit ensures that:
* an `InstanceFactory` is created in the Log4j `Provider`,
* the same factory is injected as parameters to all
the components of the chain `Log4jContextFactory`, `ContextSelector`,
`LoggerContext` (child), `Configuration` (grand-child).
* `DI.createInstanceFactory` is called only when strictly necessary.
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 5454ad7c..b4f2ff0e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -19,9 +19,9 @@
import java.io.IOException;
import java.io.InputStream;
import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.AbstractConfigurationFactory;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
@@ -35,7 +35,7 @@
//
// Best Value?
// @Order(50)
-public class Log4j1ConfigurationFactory extends ConfigurationFactory {
+public class Log4j1ConfigurationFactory extends AbstractConfigurationFactory {
private static final String[] SUFFIXES = {".properties"};
@@ -51,7 +51,7 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
}
@Override
- protected String[] getSupportedTypes() {
+ public String[] getSupportedTypes() {
return SUFFIXES;
}
}
From ec14b3f4bd0fe5d842178500fc91bbae3e84c202 Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Tue, 12 Mar 2024 10:45:27 +0100
Subject: [PATCH 81/84] Revert `ConfigurationFactory` renaming
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index b4f2ff0e..76e3021b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -19,9 +19,9 @@
import java.io.IOException;
import java.io.InputStream;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.config.AbstractConfigurationFactory;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
+import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
@@ -35,7 +35,7 @@
//
// Best Value?
// @Order(50)
-public class Log4j1ConfigurationFactory extends AbstractConfigurationFactory {
+public class Log4j1ConfigurationFactory extends ConfigurationFactory {
private static final String[] SUFFIXES = {".properties"};
From bcece68cec972cabd7797546caf21864f994f995 Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Wed, 13 Mar 2024 17:23:56 +0100
Subject: [PATCH 82/84] Revert changes to methods used by Spring Boot
---
.../org/apache/log4j/config/Log4j1ConfigurationFactory.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 76e3021b..5454ad7c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -51,7 +51,7 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
}
@Override
- public String[] getSupportedTypes() {
+ protected String[] getSupportedTypes() {
return SUFFIXES;
}
}
From 9e527e1194eb82f0e908520405dac147e3f0838b Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Mon, 1 Apr 2024 12:43:03 +0200
Subject: [PATCH 83/84] Moven `Log4j1ConfigurationConverter` to new artifact
---
log4j-config-converter/pom.xml | 137 ++++++++++++++++++
.../log4j/config/InputStreamWrapper.java | 0
.../config/Log4j1ConfigurationConverter.java | 0
.../config/Log4j1ConfigurationFactory.java | 0
.../config/Log4j1ConfigurationParser.java | 0
5 files changed, 137 insertions(+)
create mode 100644 log4j-config-converter/pom.xml
rename {log4j-1.2-api => log4j-config-converter}/src/main/java/org/apache/log4j/config/InputStreamWrapper.java (100%)
rename {log4j-1.2-api => log4j-config-converter}/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java (100%)
rename {log4j-1.2-api => log4j-config-converter}/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java (100%)
rename {log4j-1.2-api => log4j-config-converter}/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java (100%)
diff --git a/log4j-config-converter/pom.xml b/log4j-config-converter/pom.xml
new file mode 100644
index 00000000..0b4335c7
--- /dev/null
+++ b/log4j-config-converter/pom.xml
@@ -0,0 +1,137 @@
+
+
+
+ 4.0.0
+
+ org.apache.logging.log4j
+ log4j-transform-parent
+ ${revision}
+ ../log4j-transform-parent
+
+
+ log4j-config-converter
+ Apache Log4j Configuration converter
+ Converts between multiple Log4j configuration formats.
+
+
+ org.apache.logging.log4j.cli.generator.Generate
+
+
+ 3.4.1
+
+
+ 4.7.5
+
+
+
+
+
+
+ info.picocli
+ picocli
+ ${picocli.version}
+
+
+
+
+
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+
+
+
+ info.picocli
+ picocli
+
+
+
+ org.apache.logging.log4j
+ log4j-api-test
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+ info.picocli
+ picocli-codegen
+ ${picocli.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+
+ org.apache.logging.log4j
+ log4j-transform-maven-shade-plugin-extensions
+ ${project.version}
+
+
+
+
+ shade-jar-with-dependencies
+
+ shade
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java b/log4j-config-converter/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
similarity index 100%
rename from log4j-1.2-api/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
rename to log4j-config-converter/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
similarity index 100%
rename from log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
rename to log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
similarity index 100%
rename from log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
rename to log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
similarity index 100%
rename from log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
rename to log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
From fc9f584a7e61e613b351f1ee53d1dad0f40ffaaa Mon Sep 17 00:00:00 2001
From: "Piotr P. Karwasz"
Date: Mon, 1 Apr 2024 14:28:15 +0200
Subject: [PATCH 84/84] Adapt to external PicoCLI dependency
---
.gitignore | 10 +-
log4j-config-converter/pom.xml | 23 +-
.../config/Log4j1ConfigurationFactory.java | 57 -----
.../config/converter}/InputStreamWrapper.java | 2 +-
.../Log4j1ConfigurationConverter.java | 203 +++++++++---------
.../converter}/Log4j1ConfigurationParser.java | 47 +---
pom.xml | 7 +
7 files changed, 134 insertions(+), 215 deletions(-)
delete mode 100644 log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
rename log4j-config-converter/src/main/java/org/apache/{log4j/config => logging/log4j/config/converter}/InputStreamWrapper.java (97%)
rename log4j-config-converter/src/main/java/org/apache/{log4j/config => logging/log4j/config/converter}/Log4j1ConfigurationConverter.java (58%)
rename log4j-config-converter/src/main/java/org/apache/{log4j/config => logging/log4j/config/converter}/Log4j1ConfigurationParser.java (90%)
diff --git a/.gitignore b/.gitignore
index d67ee403..48467368 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,14 +13,16 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-target/
+# IntelliJ IDEA
.idea
*.iml
*.iws
-/out
-.flattened-pom.xml
-/.mvn/wrapper/maven-wrapper.jar
# Eclipse
.project
.classpath
.settings/
+# Generated by Maven
+.flattened-pom.xml
+dependency-reduced-pom.xml
+/.mvn/wrapper/maven-wrapper.jar
+target/
diff --git a/log4j-config-converter/pom.xml b/log4j-config-converter/pom.xml
index 0b4335c7..aebeb99a 100644
--- a/log4j-config-converter/pom.xml
+++ b/log4j-config-converter/pom.xml
@@ -29,23 +29,27 @@
Converts between multiple Log4j configuration formats.
- org.apache.logging.log4j.cli.generator.Generate
+
+ false
+
+ org.apache.logging.log4j.config.converter.Log4j1ConfigurationConverter
3.4.1
+ 3.0.0-SNAPSHOT
4.7.5
-
- info.picocli
- picocli
- ${picocli.version}
-
+
+ info.picocli
+ picocli
+ ${picocli.version}
+
@@ -57,7 +61,11 @@
log4j-api
-
+
+ org.apache.logging.log4j
+ log4j-1.2-api
+
+
org.apache.logging.log4j
log4j-core
@@ -117,6 +125,7 @@
shade
+ true
diff --git a/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
deleted file mode 100644
index 5454ad7c..00000000
--- a/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ /dev/null
@@ -1,57 +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.log4j.config;
-
-import java.io.IOException;
-import java.io.InputStream;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.ConfigurationException;
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
-import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-
-/**
- * Experimental ConfigurationFactory for Log4j 1.2 properties configuration files.
- */
-// TODO
-// @Category(ConfigurationFactory.CATEGORY)
-// @Plugin("Log4j1ConfigurationFactory")
-//
-// Best Value?
-// @Order(50)
-public class Log4j1ConfigurationFactory extends ConfigurationFactory {
-
- private static final String[] SUFFIXES = {".properties"};
-
- @Override
- public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
- final ConfigurationBuilder builder;
- try (final InputStream configStream = source.getInputStream()) {
- builder = new Log4j1ConfigurationParser().buildConfigurationBuilder(configStream);
- } catch (final IOException e) {
- throw new ConfigurationException("Unable to load " + source, e);
- }
- return builder.build();
- }
-
- @Override
- protected String[] getSupportedTypes() {
- return SUFFIXES;
- }
-}
diff --git a/log4j-config-converter/src/main/java/org/apache/log4j/config/InputStreamWrapper.java b/log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/InputStreamWrapper.java
similarity index 97%
rename from log4j-config-converter/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
rename to log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/InputStreamWrapper.java
index 49eaea91..5a771d9c 100644
--- a/log4j-config-converter/src/main/java/org/apache/log4j/config/InputStreamWrapper.java
+++ b/log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/InputStreamWrapper.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.log4j.config;
+package org.apache.logging.log4j.config.converter;
import java.io.IOException;
import java.io.InputStream;
diff --git a/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java b/log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/Log4j1ConfigurationConverter.java
similarity index 58%
rename from log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
rename to log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/Log4j1ConfigurationConverter.java
index c0f8e73f..16414c46 100644
--- a/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationConverter.java
+++ b/log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/Log4j1ConfigurationConverter.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.log4j.config;
+package org.apache.logging.log4j.config.converter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -34,10 +34,9 @@
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder;
-import org.apache.logging.log4j.core.tools.BasicCommandLineArguments;
-import org.apache.logging.log4j.core.tools.picocli.CommandLine;
-import org.apache.logging.log4j.core.tools.picocli.CommandLine.Command;
-import org.apache.logging.log4j.core.tools.picocli.CommandLine.Option;
+import picocli.CommandLine;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Option;
/**
* Tool for converting a Log4j 1.x properties configuration file to Log4j 2.x XML configuration file.
@@ -51,142 +50,132 @@
*
*
*
- * java org.apache.log4j.config.Log4j1ConfigurationConverter --recurse
+ * java org.apache.logging.log4j.cli.converter.Log4j1ConfigurationConverter --recurse
* E:\vcs\git\apache\logging\logging-log4j2\log4j-1.2-api\src\test\resources\config-1.2\hadoop --in log4j.properties --verbose
*
*/
-public final class Log4j1ConfigurationConverter {
-
- @Command(name = "Log4j1ConfigurationConverter")
- public static class CommandLineArguments extends BasicCommandLineArguments implements Runnable {
-
- @Option(
- names = {"--failfast", "-f"},
- description = "Fails on the first failure in recurse mode.")
- private boolean failFast;
-
- @Option(
- names = {"--in", "-i"},
- description = "Specifies the input file.")
- private Path pathIn;
-
- @Option(
- names = {"--out", "-o"},
- description = "Specifies the output file.")
- private Path pathOut;
-
- @Option(
- names = {"--recurse", "-r"},
- description = "Recurses into this folder looking for the input file")
- private Path recurseIntoPath;
-
- @Option(
- names = {"--verbose", "-v"},
- description = "Be verbose.")
- private boolean verbose;
-
- public Path getPathIn() {
- return pathIn;
- }
-
- public Path getPathOut() {
- return pathOut;
- }
-
- public Path getRecurseIntoPath() {
- return recurseIntoPath;
- }
-
- public boolean isFailFast() {
- return failFast;
- }
+@Command(name = "convert")
+public final class Log4j1ConfigurationConverter implements Runnable {
+
+ @Option(
+ names = {"--help", "-h"},
+ usageHelp = true,
+ description = "Usage help.")
+ private boolean help;
+
+ @Option(
+ names = {"--failfast", "-f"},
+ description = "Fails on the first failure in recurse mode.")
+ private boolean failFast;
+
+ @Option(
+ names = {"--in", "-i"},
+ description = "Specifies the input file.")
+ private Path pathIn;
+
+ @Option(
+ names = {"--out", "-o"},
+ description = "Specifies the output file.")
+ private Path pathOut;
+
+ @Option(
+ names = {"--recurse", "-r"},
+ description = "Recurses into this folder looking for the input file")
+ private Path recurseIntoPath;
+
+ @Option(
+ names = {"--verbose", "-v"},
+ description = "Be verbose.")
+ private boolean verbose;
+
+ private Log4j1ConfigurationConverter() {}
+
+ public boolean isHelp() {
+ return help;
+ }
- public boolean isVerbose() {
- return verbose;
- }
+ public Path getPathIn() {
+ return pathIn;
+ }
- public void setFailFast(final boolean failFast) {
- this.failFast = failFast;
- }
+ public Path getPathOut() {
+ return pathOut;
+ }
- public void setPathIn(final Path pathIn) {
- this.pathIn = pathIn;
- }
+ public Path getRecurseIntoPath() {
+ return recurseIntoPath;
+ }
- public void setPathOut(final Path pathOut) {
- this.pathOut = pathOut;
- }
+ public boolean isFailFast() {
+ return failFast;
+ }
- public void setRecurseIntoPath(final Path recurseIntoPath) {
- this.recurseIntoPath = recurseIntoPath;
- }
+ public boolean isVerbose() {
+ return verbose;
+ }
- public void setVerbose(final boolean verbose) {
- this.verbose = verbose;
- }
+ public void setHelp(boolean help) {
+ this.help = help;
+ }
- @Override
- public void run() {
- if (isHelp()) {
- CommandLine.usage(this, System.err);
- return;
- }
- new Log4j1ConfigurationConverter(this).run();
- }
+ public void setFailFast(final boolean failFast) {
+ this.failFast = failFast;
+ }
- @Override
- public String toString() {
- return "CommandLineArguments [recurseIntoPath=" + recurseIntoPath + ", verbose=" + verbose + ", pathIn="
- + pathIn + ", pathOut=" + pathOut + "]";
- }
+ public void setPathIn(final Path pathIn) {
+ this.pathIn = pathIn;
}
- private static final String FILE_EXT_XML = ".xml";
+ public void setPathOut(final Path pathOut) {
+ this.pathOut = pathOut;
+ }
- public static void main(final String[] args) {
- CommandLine.run(new CommandLineArguments(), System.err, args);
+ public void setRecurseIntoPath(final Path recurseIntoPath) {
+ this.recurseIntoPath = recurseIntoPath;
}
- public static Log4j1ConfigurationConverter run(final CommandLineArguments cla) {
- final Log4j1ConfigurationConverter log4j1ConfigurationConverter = new Log4j1ConfigurationConverter(cla);
- log4j1ConfigurationConverter.run();
- return log4j1ConfigurationConverter;
+ public void setVerbose(final boolean verbose) {
+ this.verbose = verbose;
}
- private final CommandLineArguments cla;
+ private static final String FILE_EXT_XML = ".xml";
- private Log4j1ConfigurationConverter(final CommandLineArguments cla) {
- this.cla = cla;
+ public static void main(final String[] args) {
+ final Log4j1ConfigurationConverter command = new Log4j1ConfigurationConverter();
+ new CommandLine(command).execute(args);
}
- protected void convert(final InputStream input, final OutputStream output) throws IOException {
+ private void convert(final InputStream input, final OutputStream output) throws IOException {
final ConfigurationBuilder builder =
new Log4j1ConfigurationParser().buildConfigurationBuilder(input);
builder.writeXmlConfiguration(output);
}
- InputStream getInputStream() throws IOException {
- final Path pathIn = cla.getPathIn();
+ private InputStream getInputStream() throws IOException {
+ final Path pathIn = getPathIn();
return pathIn == null ? System.in : new InputStreamWrapper(Files.newInputStream(pathIn), pathIn.toString());
}
- OutputStream getOutputStream() throws IOException {
- final Path pathOut = cla.getPathOut();
+ private OutputStream getOutputStream() throws IOException {
+ final Path pathOut = getPathOut();
return pathOut == null ? System.out : Files.newOutputStream(pathOut);
}
- private void run() {
- if (cla.getRecurseIntoPath() != null) {
+ @Override
+ public void run() {
+ final Path recurseIntoPath = getRecurseIntoPath();
+ final Path pathIn = getPathIn();
+ if (recurseIntoPath != null) {
final AtomicInteger countOKs = new AtomicInteger();
final AtomicInteger countFails = new AtomicInteger();
try {
- Files.walkFileTree(cla.getRecurseIntoPath(), new SimpleFileVisitor() {
+ Files.walkFileTree(recurseIntoPath, new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs)
throws IOException {
- if (cla.getPathIn() == null || file.getFileName().equals(cla.getPathIn())) {
+ if (pathIn == null || pathIn.equals(file.getFileName())) {
verbose("Reading %s", file);
- String newFile = file.getFileName().toString();
+ String newFile = String.valueOf(file.getFileName());
final int lastIndex = newFile.lastIndexOf(".");
newFile = lastIndex < 0
? newFile + FILE_EXT_XML
@@ -205,13 +194,13 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
countOKs.incrementAndGet();
} catch (ConfigurationException | IOException e) {
countFails.incrementAndGet();
- if (cla.isFailFast()) {
+ if (isFailFast()) {
throw e;
}
e.printStackTrace();
} catch (TransformerException e) {
countFails.incrementAndGet();
- if (cla.isFailFast()) {
+ if (isFailFast()) {
throw new IOException(e);
}
e.printStackTrace();
@@ -230,19 +219,19 @@ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attr
countOKs.get(), countFails.get(), countOKs.get() + countFails.get());
}
} else {
- verbose("Reading %s", cla.getPathIn());
+ verbose("Reading %s", pathIn);
try (final InputStream input = getInputStream();
final OutputStream output = getOutputStream()) {
convert(input, output);
} catch (final IOException e) {
throw new ConfigurationException(e);
}
- verbose("Wrote %s", cla.getPathOut());
+ verbose("Wrote %s", getPathOut());
}
}
private void verbose(final String template, final Object... args) {
- if (cla.isVerbose()) {
+ if (isVerbose()) {
System.err.println(String.format(template, args));
}
}
diff --git a/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/Log4j1ConfigurationParser.java
similarity index 90%
rename from log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
rename to log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/Log4j1ConfigurationParser.java
index 4e8ea686..e7ce75a2 100644
--- a/log4j-config-converter/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-config-converter/src/main/java/org/apache/logging/log4j/config/converter/Log4j1ConfigurationParser.java
@@ -14,16 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.log4j.config;
+package org.apache.logging.log4j.config.converter;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
-import java.util.TreeMap;
+import java.util.*;
+import org.apache.log4j.config.PropertiesConfiguration;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Filter.Result;
@@ -32,13 +28,7 @@
import org.apache.logging.log4j.core.appender.NullAppender;
import org.apache.logging.log4j.core.appender.RollingFileAppender;
import org.apache.logging.log4j.core.config.ConfigurationException;
-import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
-import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
-import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
-import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
-import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
-import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;
-import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.*;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
@@ -85,8 +75,7 @@ public class Log4j1ConfigurationParser {
* @throws ConfigurationException
* if the input does not contain a valid configuration
*/
- public ConfigurationBuilder buildConfigurationBuilder(final InputStream input)
- throws IOException {
+ ConfigurationBuilder buildConfigurationBuilder(final InputStream input) throws IOException {
try {
properties.load(input);
final String rootCategoryValue = getLog4jValue(ROOTCATEGORY);
@@ -299,32 +288,12 @@ private void buildAppenderLayout(final String name, final AppenderComponentBuild
switch (layoutClass) {
case "org.apache.log4j.PatternLayout":
case "org.apache.log4j.EnhancedPatternLayout": {
- String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null);
- if (pattern != null) {
- pattern = pattern
- // Log4j 2 and Log4j 1 level names differ for custom levels
- .replaceAll("%([-\\.\\d]*)p(?!\\w)", "%$1v1Level")
- // Log4j 2's %x (NDC) is not compatible with Log4j 1's
- // %x
- // Log4j 1: "foo bar baz"
- // Log4j 2: "[foo, bar, baz]"
- // Use %ndc to get the Log4j 1 format
- .replaceAll("%([-\\.\\d]*)x(?!\\w)", "%$1ndc")
-
- // Log4j 2's %X (MDC) is not compatible with Log4j 1's
- // %X
- // Log4j 1: "{{foo,bar}{hoo,boo}}"
- // Log4j 2: "{foo=bar,hoo=boo}"
- // Use %properties to get the Log4j 1 format
- .replaceAll("%([-\\.\\d]*)X(?!\\w)", "%$1properties");
- } else {
- pattern = "%m%n";
- }
- appenderBuilder.add(newPatternLayout(pattern));
+ final String pattern = getLog4jAppenderValue(name, "layout.ConversionPattern", null);
+ appenderBuilder.add(newPatternLayout(pattern != null ? pattern : "%m%n"));
break;
}
case "org.apache.log4j.SimpleLayout": {
- appenderBuilder.add(newPatternLayout("%v1Level - %m%n"));
+ appenderBuilder.add(newPatternLayout("%p - %m%n"));
break;
}
case "org.apache.log4j.TTCCLayout": {
diff --git a/pom.xml b/pom.xml
index e28d5d99..930ac6f0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -73,6 +73,7 @@
log4j-transform-parent
+ log4j-config-converter
log4j-transform-maven-plugin
log4j-transform-maven-shade-plugin-extensions
log4j-weaver
@@ -116,6 +117,12 @@
+
+ org.apache.logging.log4j
+ log4j-config-converter
+ ${project.version}
+
+
org.apache.logging.log4j
log4j-transform-maven-plugin