Repository: logging-log4j2 Updated Branches: refs/heads/master 0f1b0dc00 -> ffc6c8f68
[LOG4J2-1482] Improper header in CsvParameterLayout. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/ffc6c8f6 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ffc6c8f6 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ffc6c8f6 Branch: refs/heads/master Commit: ffc6c8f68d260e8e14b140f0f05cbc77081efc2c Parents: 0f1b0dc Author: Gary Gregory <[email protected]> Authored: Wed Aug 3 15:03:26 2016 -0700 Committer: Gary Gregory <[email protected]> Committed: Wed Aug 3 15:03:26 2016 -0700 ---------------------------------------------------------------------- .../log4j/core/impl/DefaultLogEventFactory.java | 5 ++ .../log4j/core/layout/AbstractStringLayout.java | 14 +-- .../logging/log4j/core/layout/JsonLayout.java | 5 +- .../logging/log4j/core/layout/YamlLayout.java | 5 +- .../log4j/core/layout/Log4j2_1482_CoreTest.java | 20 +++++ .../log4j/core/layout/Log4j2_1482_Test.java | 89 ++++++++++++++++++++ log4j-core/src/test/resources/log4j2-1482.xml | 27 ++++++ log4j-slf4j-impl/pom.xml | 5 ++ .../logging/slf4j/Log4j2_1482_Slf4jTest.java | 41 +++++++++ .../src/test/resources/log4j2-1482.xml | 27 ++++++ src/changes/changes.xml | 3 + 11 files changed, 231 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultLogEventFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultLogEventFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultLogEventFactory.java index ef74c50..127b02a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultLogEventFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultLogEventFactory.java @@ -29,6 +29,11 @@ import org.apache.logging.log4j.message.Message; */ public class DefaultLogEventFactory implements LogEventFactory { + private static final DefaultLogEventFactory instance = new DefaultLogEventFactory(); + + public static DefaultLogEventFactory getInstance() { + return instance; + } /** * Creates a log event. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java index 9e6270e..5ac98e7 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java @@ -20,6 +20,8 @@ import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.StringLayout; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.core.impl.DefaultLogEventFactory; +import org.apache.logging.log4j.core.impl.LogEventFactory; import org.apache.logging.log4j.core.util.Constants; import org.apache.logging.log4j.core.util.StringEncoder; import org.apache.logging.log4j.util.PropertiesUtil; @@ -202,7 +204,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> implem */ @Override public byte[] getFooter() { - return serializeToBytes(footerSerializer, super.getFooter()); + return serializeToBytes(footerSerializer, super.getFooter(), DefaultLogEventFactory.getInstance()); } public Serializer getFooterSerializer() { @@ -216,28 +218,28 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> implem */ @Override public byte[] getHeader() { - return serializeToBytes(headerSerializer, super.getHeader()); + return serializeToBytes(headerSerializer, super.getHeader(), DefaultLogEventFactory.getInstance()); } public Serializer getHeaderSerializer() { return headerSerializer; } - protected byte[] serializeToBytes(final Serializer serializer, final byte[] defaultValue) { - final String serializable = serializeToString(serializer); + protected byte[] serializeToBytes(final Serializer serializer, final byte[] defaultValue, final LogEventFactory logEventFactory) { + final String serializable = serializeToString(serializer, logEventFactory); if (serializer == null) { return defaultValue; } return StringEncoder.toBytes(serializable, getCharset()); } - protected String serializeToString(final Serializer serializer) { + protected String serializeToString(final Serializer serializer, final LogEventFactory logEventFactory) { if (serializer == null) { return null; } final LoggerConfig rootLogger = getConfiguration().getRootLogger(); // Using "" for the FQCN, does it matter? - final LogEvent logEvent = rootLogger.getLogEventFactory().createEvent(rootLogger.getName(), null, Strings.EMPTY, + final LogEvent logEvent = logEventFactory.createEvent(rootLogger.getName(), null, Strings.EMPTY, rootLogger.getLevel(), null, null, null); return serializer.toSerializable(logEvent); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java index e9d87ae..239a59f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java @@ -32,6 +32,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.impl.DefaultLogEventFactory; /** * Appends a series of JSON events as strings serialized as bytes. @@ -828,7 +829,7 @@ public final class JsonLayout extends AbstractJacksonLayout { return null; } final StringBuilder buf = new StringBuilder(); - final String str = serializeToString(getHeaderSerializer()); + final String str = serializeToString(getHeaderSerializer(), DefaultLogEventFactory.getInstance()); if (str != null) { buf.append(str); } @@ -848,7 +849,7 @@ public final class JsonLayout extends AbstractJacksonLayout { } final StringBuilder buf = new StringBuilder(); buf.append(this.eol); - final String str = serializeToString(getFooterSerializer()); + final String str = serializeToString(getFooterSerializer(), DefaultLogEventFactory.getInstance()); if (str != null) { buf.append(str); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java index 6f3e103..4b7a0c6 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java @@ -32,6 +32,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.impl.DefaultLogEventFactory; import org.apache.logging.log4j.util.Strings; /** @@ -728,7 +729,7 @@ public final class YamlLayout extends AbstractJacksonLayout { return null; } final StringBuilder buf = new StringBuilder(); - final String str = serializeToString(getHeaderSerializer()); + final String str = serializeToString(getHeaderSerializer(), DefaultLogEventFactory.getInstance()); if (str != null) { buf.append(str); } @@ -748,7 +749,7 @@ public final class YamlLayout extends AbstractJacksonLayout { } final StringBuilder buf = new StringBuilder(); buf.append(this.eol); - final String str = serializeToString(getFooterSerializer()); + final String str = serializeToString(getFooterSerializer(), DefaultLogEventFactory.getInstance()); if (str != null) { buf.append(str); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_CoreTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_CoreTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_CoreTest.java new file mode 100644 index 0000000..24a38b6 --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_CoreTest.java @@ -0,0 +1,20 @@ +package org.apache.logging.log4j.core.layout; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class Log4j2_1482_CoreTest extends Log4j2_1482_Test { + + @Override + protected void log(int runNumber) { + if (runNumber == 2) { + // System.out.println("Set a breakpoint here."); + } + final Logger logger = LogManager.getLogger("auditcsvfile"); + final int val1 = 9, val2 = 11, val3 = 12; + logger.info("Info Message!", val1, val2, val3); + logger.info("Info Message!", val1, val2, val3); + logger.info("Info Message!", val1, val2, val3); + } + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java new file mode 100644 index 0000000..d25a6ac --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java @@ -0,0 +1,89 @@ +/* + * 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.logging.log4j.core.layout; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; + +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.junit.CleanFolders; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; + +/** + * Tests https://issues.apache.org/jira/browse/LOG4J2-1482 + */ +public abstract class Log4j2_1482_Test { + + static final String CONFIG_LOCATION = "log4j2-1482.xml"; + + static final String FOLDER = "target/log4j2-1482"; + + private static final int LOOP_COUNT = 10; + + static void assertFileContents(int runNumber) throws IOException { + Path path = Paths.get(FOLDER + "/audit.tmp"); + List<String> lines = Files.readAllLines(path, Charset.defaultCharset()); + int i = 1; + final int size = lines.size(); + for (String string : lines) { + if (string.startsWith(",,")) { + Path folder = Paths.get(FOLDER); + File[] files = folder.toFile().listFiles(); + Arrays.sort(files); + System.out.println("Run " + runNumber + ": " + Arrays.toString(files)); + Assert.fail( + String.format("Run %,d, line %,d of %,d: \"%s\" in %s", runNumber, i++, size, string, lines)); + } + } + } + + @Rule + public CleanFolders cleanFolders = new CleanFolders(FOLDER); + + protected abstract void log(int runNumber) ; + + private void loopingRun(int loopCount) throws IOException { + for (int i = 1; i <= loopCount; i++) { + try (LoggerContext loggerContext = Configurator.initialize(getClass().getName(), + CONFIG_LOCATION)) { + log(i); + } + assertFileContents(i); + } + } + + @Test + public void testLoopingRun() throws IOException { + loopingRun(LOOP_COUNT); + } + + @Test + public void testSingleRun() throws IOException { + loopingRun(1); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-core/src/test/resources/log4j2-1482.xml ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/resources/log4j2-1482.xml b/log4j-core/src/test/resources/log4j2-1482.xml new file mode 100644 index 0000000..e17953c --- /dev/null +++ b/log4j-core/src/test/resources/log4j2-1482.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration status="warn" name="MyApp" packages=""> + <Properties> + <Property name="audit-path">target/log4j2-1482</Property> + <Property name="file-name">audit</Property> + <Property name="file-header">param1,param2,param3${sys:line.separator} + </Property> + </Properties> + + <Appenders> + <RollingFile name="auditfile" fileName="${audit-path}/${file-name}.tmp" + filePattern="${audit-path}/${file-name}-%d{yyyy-MM-dd}-%i.csv"> + <CsvParameterLayout delimiter="," header="${file-header}"> + </CsvParameterLayout> + <Policies> + <SizeBasedTriggeringPolicy size="80 B" /> + </Policies> + <DefaultRolloverStrategy max="2" /> + </RollingFile> + </Appenders> + + <Loggers> + <Root level="info"> + <AppenderRef ref="auditfile" /> + </Root> + </Loggers> +</Configuration> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-slf4j-impl/pom.xml ---------------------------------------------------------------------- diff --git a/log4j-slf4j-impl/pom.xml b/log4j-slf4j-impl/pom.xml index aca5799..21b02b1 100644 --- a/log4j-slf4j-impl/pom.xml +++ b/log4j-slf4j-impl/pom.xml @@ -58,6 +58,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-csv</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java ---------------------------------------------------------------------- diff --git a/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java new file mode 100644 index 0000000..d621e76 --- /dev/null +++ b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.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.logging.slf4j; + +import org.apache.logging.log4j.core.layout.Log4j2_1482_Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Tests https://issues.apache.org/jira/browse/LOG4J2-1482 + */ +public class Log4j2_1482_Slf4jTest extends Log4j2_1482_Test { + + @Override + protected void log(int runNumber) { + if (runNumber == 2) { + // System.out.println("Set a breakpoint here."); + } + final Logger logger = LoggerFactory.getLogger("auditcsvfile"); + final int val1 = 9, val2 = 11, val3 = 12; + logger.info("Info Message!", val1, val2, val3); + logger.info("Info Message!", val1, val2, val3); + logger.info("Info Message!", val1, val2, val3); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/log4j-slf4j-impl/src/test/resources/log4j2-1482.xml ---------------------------------------------------------------------- diff --git a/log4j-slf4j-impl/src/test/resources/log4j2-1482.xml b/log4j-slf4j-impl/src/test/resources/log4j2-1482.xml new file mode 100644 index 0000000..e17953c --- /dev/null +++ b/log4j-slf4j-impl/src/test/resources/log4j2-1482.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration status="warn" name="MyApp" packages=""> + <Properties> + <Property name="audit-path">target/log4j2-1482</Property> + <Property name="file-name">audit</Property> + <Property name="file-header">param1,param2,param3${sys:line.separator} + </Property> + </Properties> + + <Appenders> + <RollingFile name="auditfile" fileName="${audit-path}/${file-name}.tmp" + filePattern="${audit-path}/${file-name}-%d{yyyy-MM-dd}-%i.csv"> + <CsvParameterLayout delimiter="," header="${file-header}"> + </CsvParameterLayout> + <Policies> + <SizeBasedTriggeringPolicy size="80 B" /> + </Policies> + <DefaultRolloverStrategy max="2" /> + </RollingFile> + </Appenders> + + <Loggers> + <Root level="info"> + <AppenderRef ref="auditfile" /> + </Root> + </Loggers> +</Configuration> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ffc6c8f6/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b451094..31f280d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -24,6 +24,9 @@ </properties> <body> <release version="2.7" date="2016-MM-DD" description="GA Release 2.7"> + <action issue="LOG4J2-1482" dev="ggregory" type="fix" due-to="Gary Gregory, Sumit Singhal"> + Improper header in CsvParameterLayout. + </action> <action issue="LOG4J2-1199" dev="rpopma" type="fix"> Document that JVM Input Arguments Lookup (JMX) is not available on Google App Engine. </action>
