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 <garydgreg...@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 <garydgreg...@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 <remko.po...@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 <garydgreg...@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 <garydgreg...@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 <remko.po...@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, ggreg...@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 <ggreg...@apache.org>
>>>>> > Authored: Wed Aug 3 15:03:26 2016 -0700
>>>>> > Committer: Gary Gregory <ggreg...@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-unsubscr...@logging.apache.org
>>>>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> E-Mail: garydgreg...@gmail.com | ggreg...@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: garydgreg...@gmail.com | ggreg...@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: garydgreg...@gmail.com | ggreg...@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: garydgreg...@gmail.com | ggreg...@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
>

Reply via email to