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