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 >