Repository: logging-log4j2 Updated Branches: refs/heads/master f6f529a45 -> ea6ad94e6
[LOG4J2-1523] Log4j 1 appenders. Classic DailyRollingFileAppender. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/ea6ad94e Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ea6ad94e Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ea6ad94e Branch: refs/heads/master Commit: ea6ad94e6e1e05ce73fc56417ec7d3bd76f57244 Parents: f6f529a Author: Gary Gregory <ggreg...@apache.org> Authored: Thu Sep 22 00:41:09 2016 -0700 Committer: Gary Gregory <ggreg...@apache.org> Committed: Thu Sep 22 00:41:09 2016 -0700 ---------------------------------------------------------------------- .../log4j/config/Log4j1ConfigurationParser.java | 55 ++++++++++++++------ .../config/Log4j1ConfigurationFactoryTest.java | 52 +++++++++++++++--- .../log4j-DailyRollingFileAppender.properties | 26 +++++++++ .../log4j/core/appender/ConsoleAppender.java | 3 +- .../log4j/core/appender/FileAppender.java | 4 +- .../log4j/core/appender/NullAppender.java | 4 +- .../core/appender/RollingFileAppender.java | 4 +- 7 files changed, 122 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea6ad94e/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/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java index 32c5166..27c7807 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 java.util.Properties; 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 @@ import org.apache.logging.log4j.status.StatusLogger; */ 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 class Log4j1ConfigurationParser { 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 class Log4j1ConfigurationParser { 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 @@ public class Log4j1ConfigurationParser { 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 @@ public class Log4j1ConfigurationParser { } 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 @@ public class Log4j1ConfigurationParser { } } 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 @@ public class Log4j1ConfigurationParser { } 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 @@ public class Log4j1ConfigurationParser { 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 @@ public class Log4j1ConfigurationParser { } 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 @@ public class Log4j1ConfigurationParser { } 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 @@ public class Log4j1ConfigurationParser { 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; } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea6ad94e/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java index 8c6260d..1e5ff36 100644 --- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java +++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/Log4j1ConfigurationFactoryTest.java @@ -37,12 +37,12 @@ import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy; import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy; import org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy; +import org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.layout.HtmlLayout; import org.apache.logging.log4j.core.layout.PatternLayout; -import org.junit.Ignore; import org.junit.Test; public class Log4j1ConfigurationFactoryTest { @@ -56,6 +56,8 @@ public class Log4j1ConfigurationFactoryTest { final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo"); assertNotNull(loggerConfig); assertEquals(Level.DEBUG, loggerConfig.getLevel()); + configuration.start(); + configuration.stop(); return appender.getLayout(); } @@ -68,6 +70,8 @@ public class Log4j1ConfigurationFactoryTest { final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo"); assertNotNull(loggerConfig); assertEquals(Level.DEBUG, loggerConfig.getLevel()); + configuration.start(); + configuration.stop(); return appender.getLayout(); } @@ -136,23 +140,28 @@ public class Log4j1ConfigurationFactoryTest { @Test public void testRollingFileAppender() throws Exception { - testRollingFileAppender("config-1.2/log4j-RollingFileAppender.properties"); + testRollingFileAppender("config-1.2/log4j-RollingFileAppender.properties", "RFA", "./hadoop.log.%i"); + } + + @Test + public void testDailyRollingFileAppender() throws Exception { + testDailyRollingFileAppender("config-1.2/log4j-DailyRollingFileAppender.properties", "DRFA", "./hadoop.log%d{.yyyy-MM-dd}"); } @Test public void testRollingFileAppenderWithProperties() throws Exception { - testRollingFileAppender("config-1.2/log4j-RollingFileAppender-with-props.properties"); + testRollingFileAppender("config-1.2/log4j-RollingFileAppender-with-props.properties", "RFA", "./hadoop.log.%i"); } - private void testRollingFileAppender(final String configResource) throws URISyntaxException { + private void testRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException { final Configuration configuration = configure(configResource); - final Appender appender = configuration.getAppender("RFA"); + final Appender appender = configuration.getAppender(name); assertNotNull(appender); - assertEquals("RFA", appender.getName()); + assertEquals(name, appender.getName()); assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender); final RollingFileAppender rfa = (RollingFileAppender) appender; assertEquals("./hadoop.log", rfa.getFileName()); - assertEquals("./hadoop.log.%i", rfa.getFilePattern()); + assertEquals(filePattern, rfa.getFilePattern()); final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy(); assertNotNull(triggeringPolicy); assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy); @@ -167,6 +176,35 @@ public class Log4j1ConfigurationFactoryTest { assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy); final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy; assertEquals(20, drs.getMaxIndex()); + configuration.start(); + configuration.stop(); + } + + private void testDailyRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException { + final Configuration configuration = configure(configResource); + final Appender appender = configuration.getAppender(name); + assertNotNull(appender); + assertEquals(name, appender.getName()); + assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender); + final RollingFileAppender rfa = (RollingFileAppender) appender; + assertEquals("./hadoop.log", rfa.getFileName()); + assertEquals(filePattern, rfa.getFilePattern()); + final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy(); + assertNotNull(triggeringPolicy); + assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy); + final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy; + final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies(); + assertEquals(1, triggeringPolicies.length); + final TriggeringPolicy tp = triggeringPolicies[0]; + assertTrue(tp.getClass().getName(), tp instanceof TimeBasedTriggeringPolicy); + final TimeBasedTriggeringPolicy tbtp = (TimeBasedTriggeringPolicy) tp; + assertEquals(1, tbtp.getInterval()); + final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy(); + assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy); + final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy; + assertEquals(Integer.MAX_VALUE, drs.getMaxIndex()); + configuration.start(); + configuration.stop(); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea6ad94e/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties new file mode 100644 index 0000000..ccadbc8 --- /dev/null +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-DailyRollingFileAppender.properties @@ -0,0 +1,26 @@ +############################################################################### +# +# Log4J 1.2 Configuration. +# + +hadoop.log.dir=. +hadoop.log.file=hadoop.log + +log4j.rootLogger=TRACE, DRFA + +# +# Daily Rolling File Appender +# + +log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file} + +# Rollover at midnight +log4j.appender.DRFA.DatePattern=.yyyy-MM-dd + +log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout + +# Pattern format: Date LogLevel LoggerName LogMessage +log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +# Debugging Pattern format +#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea6ad94e/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java index 195ecbc..e3f3c31 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java @@ -47,9 +47,10 @@ import org.apache.logging.log4j.util.PropertiesUtil; * encoding. (RG) Encoding is handled within the Layout. Typically, a Layout will generate a String and then call * getBytes which may use a configured encoding or the system default. OTOH, a Writer cannot print byte streams. */ -@Plugin(name = "Console", category = "Core", elementType = "appender", printObject = true) +@Plugin(name = ConsoleAppender.PLUGIN_NAME, category = "Core", elementType = "appender", printObject = true) public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputStreamManager> { + public static final String PLUGIN_NAME = "Console"; private static final String JANSI_CLASS = "org.fusesource.jansi.WindowsAnsiOutputStream"; private static ConsoleManagerFactory factory = new ConsoleManagerFactory(); private static final Target DEFAULT_TARGET = Target.SYSTEM_OUT; http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea6ad94e/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java index 46146f9..860f4e5 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java @@ -36,9 +36,11 @@ import org.apache.logging.log4j.core.util.Integers; /** * File Appender. */ -@Plugin(name = "File", category = "Core", elementType = "appender", printObject = true) +@Plugin(name = FileAppender.PLUGIN_NAME, category = "Core", elementType = "appender", printObject = true) public final class FileAppender extends AbstractOutputStreamAppender<FileManager> { + public static final String PLUGIN_NAME = "File"; + /** * Builds FileAppender instances. * http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea6ad94e/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java index ad89b96..9cd1115 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java @@ -8,9 +8,11 @@ import org.apache.logging.log4j.core.config.plugins.PluginFactory; /** * An Appender that ignores log events. Use for compatibility with version 1.2. */ -@Plugin(name = "Null", category = "Core", elementType = "appender", printObject = true) +@Plugin(name = NullAppender.PLUGIN_NAME, category = "Core", elementType = "appender", printObject = true) public class NullAppender extends AbstractAppender { + public static final String PLUGIN_NAME = "Null"; + @PluginFactory public static NullAppender createAppender(@PluginAttribute("name") final String name) { return new NullAppender(name); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ea6ad94e/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java index 0fc7a52..f317b6b 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java @@ -43,9 +43,11 @@ import org.apache.logging.log4j.core.util.Integers; /** * An appender that writes to files and can roll over at intervals. */ -@Plugin(name = "RollingFile", category = "Core", elementType = "appender", printObject = true) +@Plugin(name = RollingFileAppender.PLUGIN_NAME, category = "Core", elementType = "appender", printObject = true) public final class RollingFileAppender extends AbstractOutputStreamAppender<RollingFileManager> { + public static final String PLUGIN_NAME = "RollingFile"; + /** * Builds FileAppender instances. *