On Sun, Aug 7, 2016 at 9:22 AM, Remko Popma <remko.po...@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 <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/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 <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("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-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
>>
>
>


-- 
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