Sorry. I haven't been able to fix this. It passes on my Windows machine. It has something to do with the path of the log file, I don't understand why target/test-json-layout.log can't be found on unix systems... I'm thinking to just comment out that part of the test...
Sent from my iPhone > On Jan 10, 2017, at 13:42, Apache <ralph.go...@dslextreme.com> wrote: > > ConcurrentLoggingWithJsonLayoutTest is failing for me. I don’t understand why. > > 2017-01-09 21:41:06,174 main DEBUG Starting > LoggerContext[name=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest] > from configuration at log4j2-json-layout.xml > 2017-01-09 21:41:06,176 main DEBUG Starting > LoggerContext[name=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest, > org.apache.logging.log4j.core.LoggerContext@14acaea5] with configuration > XmlConfiguration[location=/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml]... > 2017-01-09 21:41:06,177 main DEBUG Shutdown hook enabled. Registering a new > one. > 2017-01-09 21:41:06,187 main DEBUG Initializing configuration > XmlConfiguration[location=/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml] > 2017-01-09 21:41:06,193 main DEBUG Installed script engines > 2017-01-09 21:41:06,208 main DEBUG Groovy Scripting Engine Version: 2.0, > Language: Groovy, Threading: MULTITHREADED, Compile: true, Names: {groovy, > Groovy} > 2017-01-09 21:41:06,499 main DEBUG Oracle Nashorn Version: 1.8.0_65, > Language: ECMAScript, Threading: Not Thread Safe, Compile: true, Names: > {nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript} > 2017-01-09 21:41:06,538 main DEBUG BeanShell Engine Version: 1.0, Language: > BeanShell, Threading: MULTITHREADED, Compile: true, Names: {beanshell, bsh, > java} > 2017-01-09 21:41:06,539 main DEBUG PluginManager 'Core' found 121 plugins > 2017-01-09 21:41:06,539 main DEBUG PluginManager 'Level' found 1 plugins > 2017-01-09 21:41:06,543 main DEBUG PluginManager 'Lookup' found 13 plugins > 2017-01-09 21:41:06,545 main DEBUG Building Plugin[name=layout, > class=org.apache.logging.log4j.core.layout.JsonLayout]. > 2017-01-09 21:41:06,556 main DEBUG PluginManager 'TypeConverter' found 26 > plugins > 2017-01-09 21:41:06,575 main DEBUG JsonLayout$Builder(locationInfo="null", > properties="null", propertiesAsList="null", includeStacktrace="null", > eventEol="true", compact="true", complete="null", charset="null", > footerSerializer=null, headerSerializer=null, > Configuration(/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml), > footer="null", header="null") > 2017-01-09 21:41:06,710 main DEBUG PluginManager 'Converter' found 41 plugins > 2017-01-09 21:41:06,710 main DEBUG Building Plugin[name=appender, > class=org.apache.logging.log4j.core.appender.FileAppender]. > 2017-01-09 21:41:06,718 main DEBUG > FileAppender$Builder(fileName="target/test-json-layout.log", append="false", > locking="null", advertise="null", advertiseUri="null", createOnDemand="null", > bufferedIo="null", bufferSize="null", immediateFlush="null", > ignoreExceptions="false", > JsonLayout(org.apache.logging.log4j.core.layout.JsonLayout@37654521), > name="stdout", > Configuration(/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml), > Filter=null) > 2017-01-09 21:41:06,719 main DEBUG Starting FileManager > target/test-json-layout.log > 2017-01-09 21:41:06,720 main DEBUG Building Plugin[name=appenders, > class=org.apache.logging.log4j.core.config.AppendersPlugin]. > 2017-01-09 21:41:06,721 main DEBUG createAppenders(={stdout}) > 2017-01-09 21:41:06,722 main DEBUG Building Plugin[name=AppenderRef, > class=org.apache.logging.log4j.core.config.AppenderRef]. > 2017-01-09 21:41:06,725 main DEBUG createAppenderRef(ref="stdout", > level="null", Filter=null) > 2017-01-09 21:41:06,726 main DEBUG Building Plugin[name=root, > class=org.apache.logging.log4j.core.config.LoggerConfig$RootLogger]. > 2017-01-09 21:41:06,727 main DEBUG createLogger(additivity="null", > level="INFO", includeLocation="null", ={stdout}, ={}, > Configuration(/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml), > Filter=null) > 2017-01-09 21:41:06,729 main DEBUG Building Plugin[name=loggers, > class=org.apache.logging.log4j.core.config.LoggersPlugin]. > 2017-01-09 21:41:06,729 main DEBUG createLoggers(={root}) > 2017-01-09 21:41:06,730 main DEBUG Configuration > XmlConfiguration[location=/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml] > initialized > 2017-01-09 21:41:06,730 main DEBUG Starting configuration > XmlConfiguration[location=/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml] > 2017-01-09 21:41:06,731 main DEBUG Started configuration > XmlConfiguration[location=/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml] > OK. > 2017-01-09 21:41:06,732 main DEBUG Shutting down OutputStreamManager > SYSTEM_OUT.false.false-1 > 2017-01-09 21:41:06,732 main DEBUG Shut down OutputStreamManager > SYSTEM_OUT.false.false-1, all resources released: true > 2017-01-09 21:41:06,732 main DEBUG Stopped > org.apache.logging.log4j.core.config.DefaultConfiguration@66d2e7d9 OK > 2017-01-09 21:41:06,784 main DEBUG Registering MBean > org.apache.logging.log4j2:type=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest > 2017-01-09 21:41:06,786 main DEBUG Registering MBean > org.apache.logging.log4j2:type=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest,component=StatusLogger > 2017-01-09 21:41:06,787 main DEBUG Registering MBean > org.apache.logging.log4j2:type=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest,component=ContextSelector > 2017-01-09 21:41:06,789 main DEBUG Registering MBean > org.apache.logging.log4j2:type=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest,component=Loggers,name= > 2017-01-09 21:41:06,790 main DEBUG Registering MBean > org.apache.logging.log4j2:type=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest,component=Appenders,name=stdout > 2017-01-09 21:41:06,791 main DEBUG > LoggerContext[name=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest, > org.apache.logging.log4j.core.LoggerContext@14acaea5] started OK with > configuration > XmlConfiguration[location=/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml]. > Running > org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest > 2017-01-09 21:41:06,976 main DEBUG Stopping > LoggerContext[name=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest, > org.apache.logging.log4j.core.LoggerContext@14acaea5]... > 2017-01-09 21:41:06,978 main DEBUG Shutting down FileManager > target/test-json-layout.log > 2017-01-09 21:41:06,980 main DEBUG Shut down FileManager > target/test-json-layout.log, all resources released: true > 2017-01-09 21:41:06,980 main DEBUG Stopped > XmlConfiguration[location=/Users/rgoers/projects/apache/logging/log4j/log4j2/current/log4j-core/target/test-classes/log4j2-json-layout.xml] > OK > 2017-01-09 21:41:06,981 main DEBUG Stopped > LoggerContext[name=org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest, > org.apache.logging.log4j.core.LoggerContext@14acaea5]... > Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.187 sec <<< > FAILURE! - in > org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest > testConcurrentLogging(org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest) > Time elapsed: 0.182 sec <<< ERROR! > java.nio.file.NoSuchFileException: target/test-json-layout.log > at > org.apache.logging.log4j.core.layout.ConcurrentLoggingWithJsonLayoutTest.testConcurrentLogging(ConcurrentLoggingWithJsonLayoutTest.java:86) > > > Results : > > Tests in error: > ConcurrentLoggingWithJsonLayoutTest.testConcurrentLogging:86 » NoSuchFile > targ... > > Tests run: 1, Failures: 0, Errors: 1, Skipped: 0 > > > Ralph > > >> On Jan 7, 2017, at 6:51 AM, rpo...@apache.org wrote: >> >> Repository: logging-log4j2 >> Updated Branches: >> refs/heads/master 9397da66f -> 34a41236f >> >> >> Fixed concurrency issue affecting all layouts except PatternLayout and >> GelfLayout, which caused scrambled output and exceptions when logging >> synchronously from multiple threads. >> >> >> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2f8b6651 >> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2f8b6651 >> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2f8b6651 >> >> Branch: refs/heads/master >> Commit: 2f8b66510747a1d485cfd3597ea34c9071e1384a >> Parents: 0bca4ca >> Author: rpopma <rpo...@apache.org> >> Authored: Sat Jan 7 22:51:24 2017 +0900 >> Committer: rpopma <rpo...@apache.org> >> Committed: Sat Jan 7 22:51:24 2017 +0900 >> >> ---------------------------------------------------------------------- >> .../log4j/core/layout/AbstractLayout.java | 24 ++-- >> .../ConcurrentLoggingWithJsonLayoutTest.java | 115 +++++++++++++++++++ >> src/changes/changes.xml | 3 + >> 3 files changed, 131 insertions(+), 11 deletions(-) >> ---------------------------------------------------------------------- >> >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2f8b6651/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java >> ---------------------------------------------------------------------- >> diff --git >> a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java >> >> b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java >> index e1e419d..393f8c1 100644 >> --- >> a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java >> +++ >> b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java >> @@ -49,7 +49,7 @@ public abstract class AbstractLayout<T extends >> Serializable> implements Layout<T >> >> @PluginBuilderAttribute >> private byte[] footer; >> - >> + >> @PluginBuilderAttribute >> private byte[] header; >> >> @@ -222,15 +222,17 @@ public abstract class AbstractLayout<T extends >> Serializable> implements Layout<T >> */ >> public static void writeTo(final byte[] data, int offset, int length, >> final ByteBufferDestination destination) { >> int chunk = 0; >> - ByteBuffer buffer = destination.getByteBuffer(); >> - do { >> - if (length > buffer.remaining()) { >> - buffer = destination.drain(buffer); >> - } >> - chunk = Math.min(length, buffer.remaining()); >> - buffer.put(data, offset, chunk); >> - offset += chunk; >> - length -= chunk; >> - } while (length > 0); >> + synchronized (destination) { >> + ByteBuffer buffer = destination.getByteBuffer(); >> + do { >> + if (length > buffer.remaining()) { >> + buffer = destination.drain(buffer); >> + } >> + chunk = Math.min(length, buffer.remaining()); >> + buffer.put(data, offset, chunk); >> + offset += chunk; >> + length -= chunk; >> + } while (length > 0); >> + } >> } >> } >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2f8b6651/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithJsonLayoutTest.java >> ---------------------------------------------------------------------- >> diff --git >> a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithJsonLayoutTest.java >> >> b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithJsonLayoutTest.java >> new file mode 100644 >> index 0000000..7b4bb4c >> --- /dev/null >> +++ >> b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithJsonLayoutTest.java >> @@ -0,0 +1,115 @@ >> +/* >> + * 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.nio.charset.Charset; >> +import java.nio.file.Files; >> +import java.nio.file.Paths; >> +import java.util.ArrayList; >> +import java.util.Collections; >> +import java.util.HashSet; >> +import java.util.List; >> +import java.util.Set; >> + >> +import org.apache.logging.log4j.Logger; >> +import org.apache.logging.log4j.junit.LoggerContextRule; >> +import org.junit.Before; >> +import org.junit.ClassRule; >> +import org.junit.Test; >> + >> +import static org.hamcrest.CoreMatchers.*; >> + >> +import static org.junit.Assert.*; >> + >> +/** >> + * Test for LOG4J2-1769. >> + * >> + * @since 2.8 >> + */ >> +public class ConcurrentLoggingWithJsonLayoutTest { >> + @ClassRule >> + public static LoggerContextRule context = new >> LoggerContextRule("log4j2-json-layout.xml"); >> + private static final String PATH = "target/test-json-layout.log"; >> + >> + @Before >> + public void before() { >> + new File(PATH).delete(); >> + } >> + >> + @Test >> + public void testConcurrentLogging() throws Throwable { >> + final Logger log = >> context.getLogger(ConcurrentLoggingWithJsonLayoutTest.class); >> + final Set<Thread> threads = Collections.synchronizedSet(new >> HashSet<Thread>()); >> + final List<Throwable> thrown = Collections.synchronizedList(new >> ArrayList<Throwable>()); >> + >> + for (int x = 0; x < Runtime.getRuntime().availableProcessors() * 2; >> x++) { >> + final Thread t = new LoggingThread(threads, log); >> + threads.add(t); >> + >> + // Appender is configured with ignoreExceptions="false"; >> + // any exceptions are propagated to the caller, so we can catch >> them here. >> + t.setUncaughtExceptionHandler(new >> Thread.UncaughtExceptionHandler() { >> + @Override >> + public void uncaughtException(final Thread t, final >> Throwable e) { >> + thrown.add(e); >> + } >> + }); >> + t.start(); >> + } >> + >> + while (!threads.isEmpty()) { >> + log.info("not done going to sleep..."); >> + Thread.sleep(10); >> + } >> + >> + // if any error occurred, fail this test >> + if (!thrown.isEmpty()) { >> + throw thrown.get(0); >> + } >> + >> + // simple test to ensure content is not corrupted >> + final List<String> lines = Files.readAllLines(Paths.get(PATH), >> Charset.defaultCharset()); >> + for (final String line : lines) { >> + assertThat(line, startsWith("{\"timeMillis\":")); >> + assertThat(line, endsWith("\"threadPriority\":5}")); >> + } >> + } >> + >> + private class LoggingThread extends Thread { >> + private final Set<Thread> threads; >> + private final Logger log; >> + >> + LoggingThread(final Set<Thread> threads, final Logger log) { >> + this.threads = threads; >> + this.log = log; >> + } >> + >> + @Override >> + public void run() { >> + log.info(threads.size()); >> + try { >> + for (int i = 0; i < 64; i++) { >> + log.info("First message."); >> + log.info("Second message."); >> + } >> + } finally { >> + threads.remove(this); >> + } >> + } >> + } >> +} >> >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2f8b6651/src/changes/changes.xml >> ---------------------------------------------------------------------- >> diff --git a/src/changes/changes.xml b/src/changes/changes.xml >> index bfefc24..789882c 100644 >> --- a/src/changes/changes.xml >> +++ b/src/changes/changes.xml >> @@ -24,6 +24,9 @@ >> </properties> >> <body> >> <release version="2.8" date="2017-MM-DD" description="GA Release 2.8"> >> + <action issue="LOG4J2-1769" dev="rpopma" type="fix" due-to="Brandon >> Goodin"> >> + Fixed concurrency issue affecting all layouts except PatternLayout >> and GelfLayout, which caused scrambled output and exceptions when logging >> synchronously from multiple threads. >> + </action> >> <action issue="LOG4J2-1724" dev="mikes" type="fix" due-to="Alexander >> K"> >> Using variables in GelfLayout's additional fields at runtime. >> </action> >> >> >