Support FileAppender
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3aceb2a3 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3aceb2a3 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3aceb2a3 Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext Commit: 3aceb2a327bdade228ec15662bce4cf541f82239 Parents: fadd676 Author: Mikael Ståldal <mik...@staldal.nu> Authored: Thu Aug 25 22:29:08 2016 +0200 Committer: Mikael Ståldal <mik...@staldal.nu> Committed: Thu Aug 25 22:29:08 2016 +0200 ---------------------------------------------------------------------- .../log4j/config/Log4j1ConfigurationParser.java | 48 ++++++++++++++++++-- .../config/Log4j1ConfigurationFactoryTest.java | 25 +++++++++- ...g4j-console-EnhancedPatternLayout.properties | 1 - .../log4j-console-HtmlLayout.properties | 1 - .../log4j-console-PatternLayout.properties | 1 - .../log4j-console-SimpleLayout.properties | 1 - .../log4j-console-TTCCLayout.properties | 1 - .../log4j-console-XmlLayout.properties | 1 - .../log4j-file-SimpleLayout.properties | 17 +++++++ 9 files changed, 83 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/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 11f7f76..84b8533 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 @@ 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.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 @@ public class Log4j1ConfigurationParser { 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 @@ public class Log4j1ConfigurationParser { 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 @@ public class Log4j1ConfigurationParser { } + 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); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/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 9f34563..43d7b14 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 @@ -23,6 +23,7 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.appender.ConsoleAppender.Target; +import org.apache.logging.log4j.core.appender.FileAppender; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.layout.HtmlLayout; @@ -41,8 +42,6 @@ public class Log4j1ConfigurationFactoryTest { assertNotNull(configuration); final ConsoleAppender appender = configuration.getAppender("Console"); assertNotNull(appender); - // Can't set ImmediateFlush for a Console Appender in Log4j 2 like you can in 1.2 - assertTrue(appender.getImmediateFlush()); assertEquals(Target.SYSTEM_ERR, appender.getTarget()); // final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo"); @@ -51,6 +50,22 @@ public class Log4j1ConfigurationFactoryTest { return appender.getLayout(); } + private Layout<?> testFile(final String configResource) throws Exception { + final URL configLocation = ClassLoader.getSystemResource(configResource); + assertNotNull(configLocation); + final Configuration configuration = new Log4j1ConfigurationFactory().getConfiguration("test", + configLocation.toURI()); + assertNotNull(configuration); + final FileAppender appender = configuration.getAppender("File"); + assertNotNull(appender); + assertEquals("target/mylog.txt", appender.getFileName()); + // + final LoggerConfig loggerConfig = configuration.getLoggerConfig("com.example.foo"); + assertNotNull(loggerConfig); + assertEquals(Level.DEBUG, loggerConfig.getLevel()); + return appender.getLayout(); + } + @Test public void testConsoleEnhancedPatternLayout() throws Exception { final PatternLayout layout = (PatternLayout) testConsole("config-1.2/log4j-console-EnhancedPatternLayout.properties"); @@ -88,4 +103,10 @@ public class Log4j1ConfigurationFactoryTest { assertTrue(layout.isLocationInfo()); assertFalse(layout.isProperties()); } + + @Test + public void testFileSimpleLayout() throws Exception { + final PatternLayout layout = (PatternLayout) testFile("config-1.2/log4j-file-SimpleLayout.properties"); + assertEquals("%level - %m%n", layout.getConversionPattern()); + } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties index 01a4463..6793eb2 100644 --- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-EnhancedPatternLayout.properties @@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console # log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.ImmediateFlush=false log4j.appender.Console.Target=System.err log4j.appender.Console.layout=org.apache.log4j.EnhancedPatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ISO8601} [%t][%c] %-5p %X %x: %m%n http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties index 304180c..216a12e 100644 --- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-HtmlLayout.properties @@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console # log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.ImmediateFlush=false log4j.appender.Console.Target=System.err log4j.appender.Console.layout=org.apache.log4j.HTMLLayout log4j.appender.Console.layout.Title=Headline http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties index fab7070..810a494 100644 --- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-PatternLayout.properties @@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console # log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.ImmediateFlush=false log4j.appender.Console.Target=System.err log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ISO8601} [%t][%c] %-5p: %m%n http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties index 5e915f8..5a8ac4e 100644 --- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-SimpleLayout.properties @@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console # log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.ImmediateFlush=false log4j.appender.Console.Target=System.err log4j.appender.Console.layout=org.apache.log4j.SimpleLayout http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties index 9f91789..80d38c2 100644 --- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-TTCCLayout.properties @@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console # log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.ImmediateFlush=false log4j.appender.Console.Target=System.err log4j.appender.Console.layout=org.apache.log4j.TTCCLayout log4j.appender.Console.layout.ThreadPrinting=true http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties index 96302a2..c8190ec 100644 --- a/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-console-XmlLayout.properties @@ -11,7 +11,6 @@ log4j.rootLogger=TRACE, Console # log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.ImmediateFlush=false log4j.appender.Console.Target=System.err log4j.appender.Console.layout=org.apache.log4j.xml.XMLLayout log4j.appender.Console.layout.LocationInfo=true http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3aceb2a3/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties ---------------------------------------------------------------------- diff --git a/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties b/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties new file mode 100644 index 0000000..4d3ec0d --- /dev/null +++ b/log4j-1.2-api/src/test/resources/config-1.2/log4j-file-SimpleLayout.properties @@ -0,0 +1,17 @@ +############################################################################### +# +# Log4J 1.2 Configuration. +# + +log4j.rootLogger=TRACE, File + +############################################################################## +# +# The Console log +# + +log4j.appender.File=org.apache.log4j.FileAppender +log4j.appender.File.File=target/mylog.txt +log4j.appender.File.layout=org.apache.log4j.SimpleLayout + +log4j.logger.com.example.foo = DEBUG