You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by Remko Popma <re...@gmail.com> on 2016/08/03 23:09:43 UTC

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Why is this fixed in AbstactStringLayout, with ripple effect to JSON and YAML layouts? 

The problem seems to be in Serializer. It is still unclear to me why Serializer needs a LogEvent, (away from PC now) but I assume it is because of StrSubstitutor. 

I would like it much better if StrSubstitutor could be fixed so that a LogEvent becomes optional, or, if that is not feasible, 

Sent from my iPhone

> On 2016/08/04, at 7:03, ggregory@apache.org wrote:
> 
> 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 <gg...@apache.org>
> Authored: Wed Aug 3 15:03:26 2016 -0700
> Committer: Gary Gregory <gg...@apache.org>
> 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>
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org


Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Remko Popma <re...@gmail.com>.
(Sorry, accidentally hit Send on phone)

Why is this fixed in AbstactStringLayout, with ripple effect to JSON and
YAML layouts?

The problem seems to be in Serializer. It is still unclear to me why
Serializer needs a LogEvent, (away from PC now) but I assume it is because
of StrSubstitutor.

I would like it much better if StrSubstitutor could be fixed so that a
LogEvent becomes optional, or, if that is not feasible, localize
creating the LogEvent to the Serializer.


On Thursday, 4 August 2016, Remko Popma <re...@gmail.com> wrote:

> Why is this fixed in AbstactStringLayout, with ripple effect to JSON and
> YAML layouts?
>
> The problem seems to be in Serializer. It is still unclear to me why
> Serializer needs a LogEvent, (away from PC now) but I assume it is because
> of StrSubstitutor.
>
> I would like it much better if StrSubstitutor could be fixed so that a
> LogEvent becomes optional, or, if that is not feasible,
>
> Sent from my iPhone
>
> > On 2016/08/04, at 7:03, ggregory@apache.org <javascript:;> wrote:
> >
> > 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 <ggregory@apache.org <javascript:;>>
> > Authored: Wed Aug 3 15:03:26 2016 -0700
> > Committer: Gary Gregory <ggregory@apache.org <javascript:;>>
> > 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>
> >
>

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Gary Gregory <ga...@gmail.com>.
On Sun, Aug 7, 2016 at 9:22 AM, Remko Popma <re...@gmail.com> wrote:

> Gary,
> I would keep the AbstractStringLayout::getLogEventFactory method private,
> otherwise looks good, thanks for the quick turnaround!
> Remko
>

Done! Thank you for the review.

Gary


>
> On Fri, Aug 5, 2016 at 9:15 AM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> Remko,
>>
>> Done. Would you mind going through another code review?
>>
>> Thank you,
>> Gary
>>
>> On Thu, Aug 4, 2016 at 5:02 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> Remko,
>>>
>>> Thank you for the feedback. I will perform the code fiddling, this will
>>> simplify the current solution.
>>>
>>> Gary
>>>
>>> On Thu, Aug 4, 2016 at 4:30 PM, Remko Popma <re...@gmail.com>
>>> wrote:
>>>
>>>> I did take a quick look yesterday. I was wrong about StrSubstitutor,
>>>> looks like the full range of PatternLayout converters needs to be
>>>> supported.
>>>>
>>>> Layouts may be used concurrently by multiple threads and creating a new
>>>> LogEvent for each header/footer is the easiest way to deal with that.
>>>>
>>>> I would prefer the creation to happen in a single place, with
>>>> subclasses being unaware of this, like it was before. This would give more
>>>> flexibility if we ever want to make changes like making it garbagefree.
>>>>
>>>> So I would use the DefaultLogEventFactory where it used to say
>>>> rootLogger.getLogEventFactory(), and let subclasses be unaware that a
>>>> LogEventFactory is in play.
>>>>
>>>> Sent from my iPhone
>>>>
>>>> On 2016/08/05, at 2:34, Gary Gregory <ga...@gmail.com> wrote:
>>>>
>>>> Hi Remko,
>>>>
>>>> Where you planning on seeing what it would take to avoid creating a
>>>> temporary log event?
>>>>
>>>> Gary
>>>>
>>>> On Wed, Aug 3, 2016 at 6:27 PM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>> I implemented the fix this way because it seems wrong to have the
>>>>> default log event factory coded in the AbstactStringLayout. Right now this
>>>>> use case is only for headers and footers. So the changes make that explicit
>>>>> by accessing the default log event factory from the header and footer
>>>>> methods.
>>>>>
>>>>> Yes, it would be nice if we did not need a dummy log event in the
>>>>> first place to create headers and footers. I was worried that going down
>>>>> that road would be too big of a change.
>>>>>
>>>>> I am open to fixing this differently of course. At least, we now have
>>>>> unit tests :-)
>>>>>
>>>>> > The problem seems to be in Serializer. It is still unclear to me why
>>>>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>>>>> of StrSubstitutor.
>>>>>
>>>>> Yeah, needs a bit more digging.
>>>>>
>>>>> > I would like it much better if StrSubstitutor could be fixed so that
>>>>> a LogEvent becomes optional, or, if that is not feasible,
>>>>>
>>>>> Yeah, maybe it's a matter of passing null for the log event and making
>>>>> sure we have null checks in the right places.
>>>>>
>>>>> Gary
>>>>>
>>>>> On Wed, Aug 3, 2016 at 4:09 PM, Remko Popma <re...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Why is this fixed in AbstactStringLayout, with ripple effect to JSON
>>>>>> and YAML layouts?
>>>>>>
>>>>>> The problem seems to be in Serializer. It is still unclear to me why
>>>>>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>>>>>> of StrSubstitutor.
>>>>>>
>>>>>> I would like it much better if StrSubstitutor could be fixed so that
>>>>>> a LogEvent becomes optional, or, if that is not feasible,
>>>>>>
>>>>>> Sent from my iPhone
>>>>>>
>>>>>> > On 2016/08/04, at 7:03, ggregory@apache.org wrote:
>>>>>> >
>>>>>> > 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/r
>>>>>> epos/asf/logging-log4j2/commit/ffc6c8f6
>>>>>> > Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f
>>>>>> fc6c8f6
>>>>>> > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f
>>>>>> fc6c8f6
>>>>>> >
>>>>>> > Branch: refs/heads/master
>>>>>> > Commit: ffc6c8f68d260e8e14b140f0f05cbc77081efc2c
>>>>>> > Parents: 0f1b0dc
>>>>>> > Author: Gary Gregory <gg...@apache.org>
>>>>>> > Authored: Wed Aug 3 15:03:26 2016 -0700
>>>>>> > Committer: Gary Gregory <gg...@apache.org>
>>>>>> > 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/f
>>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>>> re/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/imp
>>>>>> l/DefaultLogEventFactory.java
>>>>>> > index ef74c50..127b02a 100644
>>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>>>>> l/DefaultLogEventFactory.java
>>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>>>>> l/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/f
>>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>>> re/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/lay
>>>>>> out/AbstractStringLayout.java
>>>>>> > index 9e6270e..5ac98e7 100644
>>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>>> out/AbstractStringLayout.java
>>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>>> out/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/f
>>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>>> re/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/lay
>>>>>> out/JsonLayout.java
>>>>>> > index e9d87ae..239a59f 100644
>>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>>> out/JsonLayout.java
>>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>>> out/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.PluginConfigura
>>>>>> tion;
>>>>>> > 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(getHeaderSer
>>>>>> ializer());
>>>>>> > +        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(getFooterSer
>>>>>> ializer());
>>>>>> > +        final String str = serializeToString(getFooterSerializer(),
>>>>>> DefaultLogEventFactory.getInstance());
>>>>>> >         if (str != null) {
>>>>>> >             buf.append(str);
>>>>>> >         }
>>>>>> >
>>>>>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>>> re/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/lay
>>>>>> out/YamlLayout.java
>>>>>> > index 6f3e103..4b7a0c6 100644
>>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>>> out/YamlLayout.java
>>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>>> out/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.PluginConfigura
>>>>>> tion;
>>>>>> > 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(getHeaderSer
>>>>>> ializer());
>>>>>> > +        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(getFooterSer
>>>>>> ializer());
>>>>>> > +        final String str = serializeToString(getFooterSerializer(),
>>>>>> DefaultLogEventFactory.getInstance());
>>>>>> >         if (str != null) {
>>>>>> >             buf.append(str);
>>>>>> >         }
>>>>>> >
>>>>>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>>>>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>>>>> re/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/lay
>>>>>> out/Log4j2_1482_CoreTest.java
>>>>>> > new file mode 100644
>>>>>> > index 0000000..24a38b6
>>>>>> > --- /dev/null
>>>>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>>>>> out/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("auditcsv
>>>>>> file");
>>>>>> > +        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/f
>>>>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>>>>> re/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/lay
>>>>>> out/Log4j2_1482_Test.java
>>>>>> > new file mode 100644
>>>>>> > index 0000000..d25a6ac
>>>>>> > --- /dev/null
>>>>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>>>>> out/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/f
>>>>>> fc6c8f6/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,para
>>>>>> m2,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.cs
>>>>>> v">
>>>>>> > +      <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/f
>>>>>> fc6c8f6/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/f
>>>>>> fc6c8f6/log4j-slf4j-impl/src/test/java/org/apache/logging/sl
>>>>>> f4j/Log4j2_1482_Slf4jTest.java
>>>>>> > ------------------------------------------------------------
>>>>>> ----------
>>>>>> > diff --git a/log4j-slf4j-impl/src/test/ja
>>>>>> va/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
>>>>>> b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>>>>> g4j2_1482_Slf4jTest.java
>>>>>> > new file mode 100644
>>>>>> > index 0000000..d621e76
>>>>>> > --- /dev/null
>>>>>> > +++ b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>>>>> g4j2_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("audit
>>>>>> csvfile");
>>>>>> > +        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/f
>>>>>> fc6c8f6/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,para
>>>>>> m2,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.cs
>>>>>> v">
>>>>>> > +      <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/f
>>>>>> fc6c8f6/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>
>>>>>> >
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>>>>>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>>>> Java Persistence with Hibernate, Second Edition
>>>>> <http://www.manning.com/bauer3/>
>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>> Blog: http://garygregory.wordpress.com
>>>>> Home: http://garygregory.com/
>>>>> Tweet! http://twitter.com/GaryGregory
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>>> Java Persistence with Hibernate, Second Edition
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com
>>>> Home: http://garygregory.com/
>>>> Tweet! http://twitter.com/GaryGregory
>>>>
>>>>
>>>
>>>
>>> --
>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>
>>
>>
>> --
>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>
>


-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Remko Popma <re...@gmail.com>.
Gary,
I would keep the AbstractStringLayout::getLogEventFactory method private,
otherwise looks good, thanks for the quick turnaround!
Remko

On Fri, Aug 5, 2016 at 9:15 AM, Gary Gregory <ga...@gmail.com> wrote:

> Remko,
>
> Done. Would you mind going through another code review?
>
> Thank you,
> Gary
>
> On Thu, Aug 4, 2016 at 5:02 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> Remko,
>>
>> Thank you for the feedback. I will perform the code fiddling, this will
>> simplify the current solution.
>>
>> Gary
>>
>> On Thu, Aug 4, 2016 at 4:30 PM, Remko Popma <re...@gmail.com>
>> wrote:
>>
>>> I did take a quick look yesterday. I was wrong about StrSubstitutor,
>>> looks like the full range of PatternLayout converters needs to be
>>> supported.
>>>
>>> Layouts may be used concurrently by multiple threads and creating a new
>>> LogEvent for each header/footer is the easiest way to deal with that.
>>>
>>> I would prefer the creation to happen in a single place, with subclasses
>>> being unaware of this, like it was before. This would give more flexibility
>>> if we ever want to make changes like making it garbagefree.
>>>
>>> So I would use the DefaultLogEventFactory where it used to say
>>> rootLogger.getLogEventFactory(), and let subclasses be unaware that a
>>> LogEventFactory is in play.
>>>
>>> Sent from my iPhone
>>>
>>> On 2016/08/05, at 2:34, Gary Gregory <ga...@gmail.com> wrote:
>>>
>>> Hi Remko,
>>>
>>> Where you planning on seeing what it would take to avoid creating a
>>> temporary log event?
>>>
>>> Gary
>>>
>>> On Wed, Aug 3, 2016 at 6:27 PM, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>> I implemented the fix this way because it seems wrong to have the
>>>> default log event factory coded in the AbstactStringLayout. Right now this
>>>> use case is only for headers and footers. So the changes make that explicit
>>>> by accessing the default log event factory from the header and footer
>>>> methods.
>>>>
>>>> Yes, it would be nice if we did not need a dummy log event in the first
>>>> place to create headers and footers. I was worried that going down that
>>>> road would be too big of a change.
>>>>
>>>> I am open to fixing this differently of course. At least, we now have
>>>> unit tests :-)
>>>>
>>>> > The problem seems to be in Serializer. It is still unclear to me why
>>>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>>>> of StrSubstitutor.
>>>>
>>>> Yeah, needs a bit more digging.
>>>>
>>>> > I would like it much better if StrSubstitutor could be fixed so that
>>>> a LogEvent becomes optional, or, if that is not feasible,
>>>>
>>>> Yeah, maybe it's a matter of passing null for the log event and making
>>>> sure we have null checks in the right places.
>>>>
>>>> Gary
>>>>
>>>> On Wed, Aug 3, 2016 at 4:09 PM, Remko Popma <re...@gmail.com>
>>>> wrote:
>>>>
>>>>> Why is this fixed in AbstactStringLayout, with ripple effect to JSON
>>>>> and YAML layouts?
>>>>>
>>>>> The problem seems to be in Serializer. It is still unclear to me why
>>>>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>>>>> of StrSubstitutor.
>>>>>
>>>>> I would like it much better if StrSubstitutor could be fixed so that a
>>>>> LogEvent becomes optional, or, if that is not feasible,
>>>>>
>>>>> Sent from my iPhone
>>>>>
>>>>> > On 2016/08/04, at 7:03, ggregory@apache.org wrote:
>>>>> >
>>>>> > 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/f
>>>>> fc6c8f6
>>>>> > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f
>>>>> fc6c8f6
>>>>> >
>>>>> > Branch: refs/heads/master
>>>>> > Commit: ffc6c8f68d260e8e14b140f0f05cbc77081efc2c
>>>>> > Parents: 0f1b0dc
>>>>> > Author: Gary Gregory <gg...@apache.org>
>>>>> > Authored: Wed Aug 3 15:03:26 2016 -0700
>>>>> > Committer: Gary Gregory <gg...@apache.org>
>>>>> > 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/f
>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>> re/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/imp
>>>>> l/DefaultLogEventFactory.java
>>>>> > index ef74c50..127b02a 100644
>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>>>> l/DefaultLogEventFactory.java
>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>>>> l/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/f
>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>> re/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/lay
>>>>> out/AbstractStringLayout.java
>>>>> > index 9e6270e..5ac98e7 100644
>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>> out/AbstractStringLayout.java
>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>> out/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/f
>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>> re/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/lay
>>>>> out/JsonLayout.java
>>>>> > index e9d87ae..239a59f 100644
>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>> out/JsonLayout.java
>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>> out/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.PluginConfigura
>>>>> tion;
>>>>> > 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(getHeaderSer
>>>>> ializer());
>>>>> > +        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(getFooterSer
>>>>> ializer());
>>>>> > +        final String str = serializeToString(getFooterSerializer(),
>>>>> DefaultLogEventFactory.getInstance());
>>>>> >         if (str != null) {
>>>>> >             buf.append(str);
>>>>> >         }
>>>>> >
>>>>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>>> re/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/lay
>>>>> out/YamlLayout.java
>>>>> > index 6f3e103..4b7a0c6 100644
>>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>> out/YamlLayout.java
>>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>>> out/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.PluginConfigura
>>>>> tion;
>>>>> > 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(getHeaderSer
>>>>> ializer());
>>>>> > +        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(getFooterSer
>>>>> ializer());
>>>>> > +        final String str = serializeToString(getFooterSerializer(),
>>>>> DefaultLogEventFactory.getInstance());
>>>>> >         if (str != null) {
>>>>> >             buf.append(str);
>>>>> >         }
>>>>> >
>>>>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>>>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>>>> re/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/lay
>>>>> out/Log4j2_1482_CoreTest.java
>>>>> > new file mode 100644
>>>>> > index 0000000..24a38b6
>>>>> > --- /dev/null
>>>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>>>> out/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/f
>>>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>>>> re/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/lay
>>>>> out/Log4j2_1482_Test.java
>>>>> > new file mode 100644
>>>>> > index 0000000..d25a6ac
>>>>> > --- /dev/null
>>>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>>>> out/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/f
>>>>> fc6c8f6/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,para
>>>>> m2,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.cs
>>>>> v">
>>>>> > +      <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/f
>>>>> fc6c8f6/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/f
>>>>> fc6c8f6/log4j-slf4j-impl/src/test/java/org/apache/logging/sl
>>>>> f4j/Log4j2_1482_Slf4jTest.java
>>>>> > ------------------------------------------------------------
>>>>> ----------
>>>>> > diff --git a/log4j-slf4j-impl/src/test/ja
>>>>> va/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
>>>>> b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>>>> g4j2_1482_Slf4jTest.java
>>>>> > new file mode 100644
>>>>> > index 0000000..d621e76
>>>>> > --- /dev/null
>>>>> > +++ b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>>>> g4j2_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("audit
>>>>> csvfile");
>>>>> > +        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/f
>>>>> fc6c8f6/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,para
>>>>> m2,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.cs
>>>>> v">
>>>>> > +      <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/f
>>>>> fc6c8f6/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>
>>>>> >
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>>>>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>>> Java Persistence with Hibernate, Second Edition
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com
>>>> Home: http://garygregory.com/
>>>> Tweet! http://twitter.com/GaryGregory
>>>>
>>>
>>>
>>>
>>> --
>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>>
>>
>>
>> --
>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Gary Gregory <ga...@gmail.com>.
Remko,

Done. Would you mind going through another code review?

Thank you,
Gary

On Thu, Aug 4, 2016 at 5:02 PM, Gary Gregory <ga...@gmail.com> wrote:

> Remko,
>
> Thank you for the feedback. I will perform the code fiddling, this will
> simplify the current solution.
>
> Gary
>
> On Thu, Aug 4, 2016 at 4:30 PM, Remko Popma <re...@gmail.com> wrote:
>
>> I did take a quick look yesterday. I was wrong about StrSubstitutor,
>> looks like the full range of PatternLayout converters needs to be
>> supported.
>>
>> Layouts may be used concurrently by multiple threads and creating a new
>> LogEvent for each header/footer is the easiest way to deal with that.
>>
>> I would prefer the creation to happen in a single place, with subclasses
>> being unaware of this, like it was before. This would give more flexibility
>> if we ever want to make changes like making it garbagefree.
>>
>> So I would use the DefaultLogEventFactory where it used to say
>> rootLogger.getLogEventFactory(), and let subclasses be unaware that a
>> LogEventFactory is in play.
>>
>> Sent from my iPhone
>>
>> On 2016/08/05, at 2:34, Gary Gregory <ga...@gmail.com> wrote:
>>
>> Hi Remko,
>>
>> Where you planning on seeing what it would take to avoid creating a
>> temporary log event?
>>
>> Gary
>>
>> On Wed, Aug 3, 2016 at 6:27 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> I implemented the fix this way because it seems wrong to have the
>>> default log event factory coded in the AbstactStringLayout. Right now this
>>> use case is only for headers and footers. So the changes make that explicit
>>> by accessing the default log event factory from the header and footer
>>> methods.
>>>
>>> Yes, it would be nice if we did not need a dummy log event in the first
>>> place to create headers and footers. I was worried that going down that
>>> road would be too big of a change.
>>>
>>> I am open to fixing this differently of course. At least, we now have
>>> unit tests :-)
>>>
>>> > The problem seems to be in Serializer. It is still unclear to me why
>>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>>> of StrSubstitutor.
>>>
>>> Yeah, needs a bit more digging.
>>>
>>> > I would like it much better if StrSubstitutor could be fixed so that a
>>> LogEvent becomes optional, or, if that is not feasible,
>>>
>>> Yeah, maybe it's a matter of passing null for the log event and making
>>> sure we have null checks in the right places.
>>>
>>> Gary
>>>
>>> On Wed, Aug 3, 2016 at 4:09 PM, Remko Popma <re...@gmail.com>
>>> wrote:
>>>
>>>> Why is this fixed in AbstactStringLayout, with ripple effect to JSON
>>>> and YAML layouts?
>>>>
>>>> The problem seems to be in Serializer. It is still unclear to me why
>>>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>>>> of StrSubstitutor.
>>>>
>>>> I would like it much better if StrSubstitutor could be fixed so that a
>>>> LogEvent becomes optional, or, if that is not feasible,
>>>>
>>>> Sent from my iPhone
>>>>
>>>> > On 2016/08/04, at 7:03, ggregory@apache.org wrote:
>>>> >
>>>> > 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/f
>>>> fc6c8f6
>>>> > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f
>>>> fc6c8f6
>>>> >
>>>> > Branch: refs/heads/master
>>>> > Commit: ffc6c8f68d260e8e14b140f0f05cbc77081efc2c
>>>> > Parents: 0f1b0dc
>>>> > Author: Gary Gregory <gg...@apache.org>
>>>> > Authored: Wed Aug 3 15:03:26 2016 -0700
>>>> > Committer: Gary Gregory <gg...@apache.org>
>>>> > 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/f
>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>> re/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/imp
>>>> l/DefaultLogEventFactory.java
>>>> > index ef74c50..127b02a 100644
>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>>> l/DefaultLogEventFactory.java
>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>>> l/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/f
>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>> re/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/lay
>>>> out/AbstractStringLayout.java
>>>> > index 9e6270e..5ac98e7 100644
>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>> out/AbstractStringLayout.java
>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>> out/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().getRootLogg
>>>> er();
>>>> >         // 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/f
>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>> re/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/lay
>>>> out/JsonLayout.java
>>>> > index e9d87ae..239a59f 100644
>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>> out/JsonLayout.java
>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>> out/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.PluginConfigura
>>>> tion;
>>>> > 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/f
>>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>>> re/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/lay
>>>> out/YamlLayout.java
>>>> > index 6f3e103..4b7a0c6 100644
>>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>> out/YamlLayout.java
>>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>>> out/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.PluginConfigura
>>>> tion;
>>>> > 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/f
>>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>>> re/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/lay
>>>> out/Log4j2_1482_CoreTest.java
>>>> > new file mode 100644
>>>> > index 0000000..24a38b6
>>>> > --- /dev/null
>>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>>> out/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/f
>>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>>> re/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/lay
>>>> out/Log4j2_1482_Test.java
>>>> > new file mode 100644
>>>> > index 0000000..d25a6ac
>>>> > --- /dev/null
>>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>>> out/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/f
>>>> fc6c8f6/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,para
>>>> m2,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.cs
>>>> v">
>>>> > +      <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/f
>>>> fc6c8f6/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/f
>>>> fc6c8f6/log4j-slf4j-impl/src/test/java/org/apache/logging/sl
>>>> f4j/Log4j2_1482_Slf4jTest.java
>>>> > ------------------------------------------------------------
>>>> ----------
>>>> > diff --git a/log4j-slf4j-impl/src/test/ja
>>>> va/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
>>>> b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>>> g4j2_1482_Slf4jTest.java
>>>> > new file mode 100644
>>>> > index 0000000..d621e76
>>>> > --- /dev/null
>>>> > +++ b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>>> g4j2_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("audit
>>>> csvfile");
>>>> > +        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/f
>>>> fc6c8f6/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,para
>>>> m2,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.cs
>>>> v">
>>>> > +      <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/f
>>>> fc6c8f6/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>
>>>> >
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>>>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>>>
>>>>
>>>
>>>
>>> --
>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>
>>
>>
>> --
>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Gary Gregory <ga...@gmail.com>.
Remko,

Thank you for the feedback. I will perform the code fiddling, this will
simplify the current solution.

Gary

On Thu, Aug 4, 2016 at 4:30 PM, Remko Popma <re...@gmail.com> wrote:

> I did take a quick look yesterday. I was wrong about StrSubstitutor, looks
> like the full range of PatternLayout converters needs to be supported.
>
> Layouts may be used concurrently by multiple threads and creating a new
> LogEvent for each header/footer is the easiest way to deal with that.
>
> I would prefer the creation to happen in a single place, with subclasses
> being unaware of this, like it was before. This would give more flexibility
> if we ever want to make changes like making it garbagefree.
>
> So I would use the DefaultLogEventFactory where it used to say rootLogger.
> getLogEventFactory(), and let subclasses be unaware that a
> LogEventFactory is in play.
>
> Sent from my iPhone
>
> On 2016/08/05, at 2:34, Gary Gregory <ga...@gmail.com> wrote:
>
> Hi Remko,
>
> Where you planning on seeing what it would take to avoid creating a
> temporary log event?
>
> Gary
>
> On Wed, Aug 3, 2016 at 6:27 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> I implemented the fix this way because it seems wrong to have the default
>> log event factory coded in the AbstactStringLayout. Right now this use case
>> is only for headers and footers. So the changes make that explicit by
>> accessing the default log event factory from the header and footer methods.
>>
>> Yes, it would be nice if we did not need a dummy log event in the first
>> place to create headers and footers. I was worried that going down that
>> road would be too big of a change.
>>
>> I am open to fixing this differently of course. At least, we now have
>> unit tests :-)
>>
>> > The problem seems to be in Serializer. It is still unclear to me why
>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>> of StrSubstitutor.
>>
>> Yeah, needs a bit more digging.
>>
>> > I would like it much better if StrSubstitutor could be fixed so that a
>> LogEvent becomes optional, or, if that is not feasible,
>>
>> Yeah, maybe it's a matter of passing null for the log event and making
>> sure we have null checks in the right places.
>>
>> Gary
>>
>> On Wed, Aug 3, 2016 at 4:09 PM, Remko Popma <re...@gmail.com>
>> wrote:
>>
>>> Why is this fixed in AbstactStringLayout, with ripple effect to JSON and
>>> YAML layouts?
>>>
>>> The problem seems to be in Serializer. It is still unclear to me why
>>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>>> of StrSubstitutor.
>>>
>>> I would like it much better if StrSubstitutor could be fixed so that a
>>> LogEvent becomes optional, or, if that is not feasible,
>>>
>>> Sent from my iPhone
>>>
>>> > On 2016/08/04, at 7:03, ggregory@apache.org wrote:
>>> >
>>> > 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/f
>>> fc6c8f6
>>> > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f
>>> fc6c8f6
>>> >
>>> > Branch: refs/heads/master
>>> > Commit: ffc6c8f68d260e8e14b140f0f05cbc77081efc2c
>>> > Parents: 0f1b0dc
>>> > Author: Gary Gregory <gg...@apache.org>
>>> > Authored: Wed Aug 3 15:03:26 2016 -0700
>>> > Committer: Gary Gregory <gg...@apache.org>
>>> > 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/f
>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>> re/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/imp
>>> l/DefaultLogEventFactory.java
>>> > index ef74c50..127b02a 100644
>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>> l/DefaultLogEventFactory.java
>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/imp
>>> l/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/f
>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>> re/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/lay
>>> out/AbstractStringLayout.java
>>> > index 9e6270e..5ac98e7 100644
>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>> out/AbstractStringLayout.java
>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>> out/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().getRootLogg
>>> er();
>>> >         // 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/f
>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>> re/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/lay
>>> out/JsonLayout.java
>>> > index e9d87ae..239a59f 100644
>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>> out/JsonLayout.java
>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>> out/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.PluginConfigura
>>> tion;
>>> > 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/f
>>> fc6c8f6/log4j-core/src/main/java/org/apache/logging/log4j/co
>>> re/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/lay
>>> out/YamlLayout.java
>>> > index 6f3e103..4b7a0c6 100644
>>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>> out/YamlLayout.java
>>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay
>>> out/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.PluginConfigura
>>> tion;
>>> > 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/f
>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>> re/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/lay
>>> out/Log4j2_1482_CoreTest.java
>>> > new file mode 100644
>>> > index 0000000..24a38b6
>>> > --- /dev/null
>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>> out/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/f
>>> fc6c8f6/log4j-core/src/test/java/org/apache/logging/log4j/co
>>> re/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/lay
>>> out/Log4j2_1482_Test.java
>>> > new file mode 100644
>>> > index 0000000..d25a6ac
>>> > --- /dev/null
>>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay
>>> out/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/f
>>> fc6c8f6/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,para
>>> m2,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/f
>>> fc6c8f6/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/f
>>> fc6c8f6/log4j-slf4j-impl/src/test/java/org/apache/logging/sl
>>> f4j/Log4j2_1482_Slf4jTest.java
>>> > ----------------------------------------------------------------------
>>> > diff --git a/log4j-slf4j-impl/src/test/ja
>>> va/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
>>> b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>> g4j2_1482_Slf4jTest.java
>>> > new file mode 100644
>>> > index 0000000..d621e76
>>> > --- /dev/null
>>> > +++ b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Lo
>>> g4j2_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("audit
>>> csvfile");
>>> > +        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/f
>>> fc6c8f6/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,para
>>> m2,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/f
>>> fc6c8f6/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>
>>> >
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>>
>>>
>>
>>
>> --
>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>
>


-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Remko Popma <re...@gmail.com>.
I did take a quick look yesterday. I was wrong about StrSubstitutor, looks like the full range of PatternLayout converters needs to be supported. 

Layouts may be used concurrently by multiple threads and creating a new LogEvent for each header/footer is the easiest way to deal with that. 

I would prefer the creation to happen in a single place, with subclasses being unaware of this, like it was before. This would give more flexibility if we ever want to make changes like making it garbagefree. 

So I would use the DefaultLogEventFactory where it used to say rootLogger.getLogEventFactory(), and let subclasses be unaware that a LogEventFactory is in play. 

Sent from my iPhone

> On 2016/08/05, at 2:34, Gary Gregory <ga...@gmail.com> wrote:
> 
> Hi Remko,
> 
> Where you planning on seeing what it would take to avoid creating a temporary log event?
> 
> Gary
> 
>> On Wed, Aug 3, 2016 at 6:27 PM, Gary Gregory <ga...@gmail.com> wrote:
>> I implemented the fix this way because it seems wrong to have the default log event factory coded in the AbstactStringLayout. Right now this use case is only for headers and footers. So the changes make that explicit by accessing the default log event factory from the header and footer methods.
>> 
>> Yes, it would be nice if we did not need a dummy log event in the first place to create headers and footers. I was worried that going down that road would be too big of a change.
>> 
>> I am open to fixing this differently of course. At least, we now have unit tests :-)
>> 
>> > The problem seems to be in Serializer. It is still unclear to me why Serializer needs a LogEvent, (away from PC now) but I assume it is because of StrSubstitutor.
>> 
>> Yeah, needs a bit more digging.
>> 
>> > I would like it much better if StrSubstitutor could be fixed so that a LogEvent becomes optional, or, if that is not feasible,
>> 
>> Yeah, maybe it's a matter of passing null for the log event and making sure we have null checks in the right places.
>> 
>> Gary
>> 
>>> On Wed, Aug 3, 2016 at 4:09 PM, Remko Popma <re...@gmail.com> wrote:
>>> Why is this fixed in AbstactStringLayout, with ripple effect to JSON and YAML layouts?
>>> 
>>> The problem seems to be in Serializer. It is still unclear to me why Serializer needs a LogEvent, (away from PC now) but I assume it is because of StrSubstitutor.
>>> 
>>> I would like it much better if StrSubstitutor could be fixed so that a LogEvent becomes optional, or, if that is not feasible,
>>> 
>>> Sent from my iPhone
>>> 
>>> > On 2016/08/04, at 7:03, ggregory@apache.org wrote:
>>> >
>>> > 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 <gg...@apache.org>
>>> > Authored: Wed Aug 3 15:03:26 2016 -0700
>>> > Committer: Gary Gregory <gg...@apache.org>
>>> > 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>
>>> >
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>> 
>> 
>> 
>> 
>> -- 
>> E-Mail: garydgregory@gmail.com | ggregory@apache.org 
>> Java Persistence with Hibernate, Second Edition
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com 
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
> 
> 
> 
> -- 
> E-Mail: garydgregory@gmail.com | ggregory@apache.org 
> Java Persistence with Hibernate, Second Edition
> JUnit in Action, Second Edition
> Spring Batch in Action
> Blog: http://garygregory.wordpress.com 
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Gary Gregory <ga...@gmail.com>.
Hi Remko,

Where you planning on seeing what it would take to avoid creating a
temporary log event?

Gary

On Wed, Aug 3, 2016 at 6:27 PM, Gary Gregory <ga...@gmail.com> wrote:

> I implemented the fix this way because it seems wrong to have the default
> log event factory coded in the AbstactStringLayout. Right now this use case
> is only for headers and footers. So the changes make that explicit by
> accessing the default log event factory from the header and footer methods.
>
> Yes, it would be nice if we did not need a dummy log event in the first
> place to create headers and footers. I was worried that going down that
> road would be too big of a change.
>
> I am open to fixing this differently of course. At least, we now have unit
> tests :-)
>
> > The problem seems to be in Serializer. It is still unclear to me why
> Serializer needs a LogEvent, (away from PC now) but I assume it is because
> of StrSubstitutor.
>
> Yeah, needs a bit more digging.
>
> > I would like it much better if StrSubstitutor could be fixed so that a
> LogEvent becomes optional, or, if that is not feasible,
>
> Yeah, maybe it's a matter of passing null for the log event and making
> sure we have null checks in the right places.
>
> Gary
>
> On Wed, Aug 3, 2016 at 4:09 PM, Remko Popma <re...@gmail.com> wrote:
>
>> Why is this fixed in AbstactStringLayout, with ripple effect to JSON and
>> YAML layouts?
>>
>> The problem seems to be in Serializer. It is still unclear to me why
>> Serializer needs a LogEvent, (away from PC now) but I assume it is because
>> of StrSubstitutor.
>>
>> I would like it much better if StrSubstitutor could be fixed so that a
>> LogEvent becomes optional, or, if that is not feasible,
>>
>> Sent from my iPhone
>>
>> > On 2016/08/04, at 7:03, ggregory@apache.org wrote:
>> >
>> > 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 <gg...@apache.org>
>> > Authored: Wed Aug 3 15:03:26 2016 -0700
>> > Committer: Gary Gregory <gg...@apache.org>
>> > 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>
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>
>>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: [LOG4J2-1482] Improper header in CsvParameterLayout.

Posted by Gary Gregory <ga...@gmail.com>.
I implemented the fix this way because it seems wrong to have the default
log event factory coded in the AbstactStringLayout. Right now this use case
is only for headers and footers. So the changes make that explicit by
accessing the default log event factory from the header and footer methods.

Yes, it would be nice if we did not need a dummy log event in the first
place to create headers and footers. I was worried that going down that
road would be too big of a change.

I am open to fixing this differently of course. At least, we now have unit
tests :-)

> The problem seems to be in Serializer. It is still unclear to me why
Serializer needs a LogEvent, (away from PC now) but I assume it is because
of StrSubstitutor.

Yeah, needs a bit more digging.

> I would like it much better if StrSubstitutor could be fixed so that a
LogEvent becomes optional, or, if that is not feasible,

Yeah, maybe it's a matter of passing null for the log event and making sure
we have null checks in the right places.

Gary

On Wed, Aug 3, 2016 at 4:09 PM, Remko Popma <re...@gmail.com> wrote:

> Why is this fixed in AbstactStringLayout, with ripple effect to JSON and
> YAML layouts?
>
> The problem seems to be in Serializer. It is still unclear to me why
> Serializer needs a LogEvent, (away from PC now) but I assume it is because
> of StrSubstitutor.
>
> I would like it much better if StrSubstitutor could be fixed so that a
> LogEvent becomes optional, or, if that is not feasible,
>
> Sent from my iPhone
>
> > On 2016/08/04, at 7:03, ggregory@apache.org wrote:
> >
> > 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 <gg...@apache.org>
> > Authored: Wed Aug 3 15:03:26 2016 -0700
> > Committer: Gary Gregory <gg...@apache.org>
> > 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>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>
>


-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory