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().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-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