You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@logging.apache.org by Volkan Yazıcı <vo...@gmail.com> on 2021/11/08 12:08:37 UTC
Unexpected concurrent LoggerContext initialization
Hello! Does anybody have an idea why the following test fails for
CONCURRENT execution mode, whereas it works for SAME_THREAD?
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.util.Strings;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import java.io.File;
import java.nio.file.Paths;
import static org.assertj.core.api.Assertions.assertThat;
@Execution(ExecutionMode.SAME_THREAD)
class ParallelRunTest {
@ParameterizedTest
@ValueSource(chars = {'A', 'B', 'C', 'D'})
void test(final char letter) {
// Create the configuration builder.
final ConfigurationBuilder<?> configBuilder =
ConfigurationBuilderFactory
.newConfigurationBuilder()
.setStatusLevel(Level.ERROR)
.setConfigurationName("Letter-" + letter);
// Create the configuration.
final String appenderName = "File";
final String appenderFilepath = Paths
.get(
System.getProperty("java.io.tmpdir"),
"ParallelRunTest-" + letter + ".log")
.toAbsolutePath()
.toString();
final Configuration config = configBuilder
.add(configBuilder
.newAppender(appenderName, "File")
.addAttribute("fileName", appenderFilepath)
.addAttribute("append", false)
.addAttribute("immediateFlush", false)
.addAttribute("ignoreExceptions", false)
.add(configBuilder
.newLayout("PatternLayout")
.addAttribute("pattern", "%m\n")))
.add(configBuilder
.newRootLogger(Level.ALL)
.add(configBuilder.newAppenderRef(appenderName)))
.build(false);
// Initialize the configuration.
try (final LoggerContext loggerContext =
Configurator.initialize(config)) {
final Logger logger =
loggerContext.getLogger(ParallelRunTest.class);
// Write logs.
final String message = Strings.repeat(String.valueOf(letter), 999);
for (int i = 0; i < 1_000; i++) {
logger.info(message);
}
}
// Verify the file content.
final long appenderFileLength = new File(appenderFilepath).length();
assertThat(appenderFileLength).isEqualTo(1_000_000L);
}
}
Re: Unexpected concurrent LoggerContext initialization
Posted by Volkan Yazıcı <vo...@yazi.ci>.
I have created LOG4J2-3188
<https://issues.apache.org/jira/browse/LOG4J2-3188> for this issue.
On Fri, Nov 12, 2021 at 2:46 PM Volkan Yazıcı <vo...@yazi.ci> wrote:
> *[Note that the shared `ParallelRunTest` is a self-sufficient code, that
> is, one can simply copy-paste it into a Log4j test and run it.]*
>
> When `ExecutionMode.SAME_THREAD` is used, everything works as expected:
>
> wc -l /tmp/ParallelRunTest-*
> 1000 /tmp/ParallelRunTest-A.log
> 1000 /tmp/ParallelRunTest-B.log
> 1000 /tmp/ParallelRunTest-C.log
> 1000 /tmp/ParallelRunTest-D.log
> 4000 total
>
> for log_file in /tmp/ParallelRunTest-*; do
> echo "file: $log_file"
> echo "line lengths:"
> awk "{print length}" $log_file | sort | uniq
> echo "distinct lines:"
> sort $log_file | uniq
> echo
> done
>
> file: /tmp/ParallelRunTest-A.log
> line lengths:
> 999
> distinct lines:
> AAA...A
>
> file: /tmp/ParallelRunTest-B.log
> line lengths:
> 999
> distinct lines:
> BBB...B
>
> file: /tmp/ParallelRunTest-C.log
> line lengths:
> 999
> distinct lines:
> CCC...C
>
> file: /tmp/ParallelRunTest-D.log
> line lengths:
> 999
> distinct lines:
> DDD...D
>
> When `ExecutionMode.CONCURRENT` is used, tests fail due to unexpected
> `appenderFileLength`:
>
> wc -l /tmp/ParallelRunTest-*
> 96 /tmp/ParallelRunTest-A.log
> 1 /tmp/ParallelRunTest-B.log
> 96 /tmp/ParallelRunTest-C.log
> 3577 /tmp/ParallelRunTest-D.log
> 3770 total
>
> for log_file in /tmp/ParallelRunTest-*; do
> echo "file: $log_file"
> echo "line lengths:"
> awk "{print length}" $log_file | sort | uniq
> echo "distinct lines:"
> sort $log_file | uniq
> echo
> done
>
> file: /tmp/ParallelRunTest-A.log
> line lengths:
> 999
> distinct lines:
> AAA...A
> BBB...B
> CCC...C
>
> file: /tmp/ParallelRunTest-B.log
> line lengths:
> 999
> distinct lines:
> BBB...B
>
> file: /tmp/ParallelRunTest-C.log
> line lengths:
> 999
> distinct lines:
> BBB...B
> CCC...C
>
> file: /tmp/ParallelRunTest-D.log
> line lengths:
> 999
> distinct lines:
> AAA...A
> BBB...B
> CCC...C
> DDD...D
>
> Note that `AAA...A`, `BBB...B`, etc. snippets shared above are truncated
> for display purposes, otherwise each line has 999 *_unscrambled_*
> characters.
>
> Given 1) the total number of logged lines is less than 4000, 2) letters
> are scattered between files, and 3) lines are not scrambled, I have the
> feeling that produced `LogEvent`s either got lost or sent to wrong
> appenders.
>
> On Fri, Nov 12, 2021 at 7:49 AM Remko Popma <re...@gmail.com> wrote:
>
>> What do the generated files look like?
>> Is the output that is generated in concurrent mode longer or shorter than
>> the expected length?
>> Also, does it contain one entry (one log message) per line, or is it
>> scrambled? Are entries ordered by time?
>>
>> On Fri, Nov 12, 2021 at 12:34 AM Ralph Goers <ra...@dslextreme.com>
>> wrote:
>>
>> > How does it fail?
>> >
>> > Ralph
>> >
>> > > On Nov 11, 2021, at 1:42 AM, Volkan Yazıcı <vo...@yazi.ci> wrote:
>> > >
>> > > They sort of do exist, see JsonTemplateLayoutConcurrentEncodeTest
>> > > <
>> >
>> https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutConcurrentEncodeTest.java#L58
>> > >
>> > > .
>> > > But I can add a dedicated test too.
>> > > Nevertheless, I still wonder what the problem is.
>> > >
>> > > On Wed, Nov 10, 2021 at 9:15 PM Gary Gregory <ga...@gmail.com>
>> > wrote:
>> > >
>> > >> Should this test be added to the repo with a TODO comment?
>> > >>
>> > >> Gary
>> > >>
>> > >> On Mon, Nov 8, 2021, 07:09 Volkan Yazıcı <vo...@gmail.com>
>> > wrote:
>> > >>
>> > >>> Hello! Does anybody have an idea why the following test fails for
>> > >>> CONCURRENT execution mode, whereas it works for SAME_THREAD?
>> > >>>
>> > >>> import org.apache.logging.log4j.Level;
>> > >>> import org.apache.logging.log4j.Logger;
>> > >>> import org.apache.logging.log4j.core.LoggerContext;
>> > >>> import org.apache.logging.log4j.core.config.Configuration;
>> > >>> import org.apache.logging.log4j.core.config.Configurator;
>> > >>> import
>> > >>>
>> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
>> > >>> import
>> > >>>
>> > >>
>> >
>> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
>> > >>> import org.apache.logging.log4j.util.Strings;
>> > >>> import org.junit.jupiter.api.parallel.Execution;
>> > >>> import org.junit.jupiter.api.parallel.ExecutionMode;
>> > >>> import org.junit.jupiter.params.ParameterizedTest;
>> > >>> import org.junit.jupiter.params.provider.ValueSource;
>> > >>>
>> > >>> import java.io.File;
>> > >>> import java.nio.file.Paths;
>> > >>>
>> > >>> import static org.assertj.core.api.Assertions.assertThat;
>> > >>>
>> > >>> @Execution(ExecutionMode.SAME_THREAD)
>> > >>> class ParallelRunTest {
>> > >>>
>> > >>> @ParameterizedTest
>> > >>> @ValueSource(chars = {'A', 'B', 'C', 'D'})
>> > >>> void test(final char letter) {
>> > >>>
>> > >>> // Create the configuration builder.
>> > >>> final ConfigurationBuilder<?> configBuilder =
>> > >>> ConfigurationBuilderFactory
>> > >>> .newConfigurationBuilder()
>> > >>> .setStatusLevel(Level.ERROR)
>> > >>> .setConfigurationName("Letter-" + letter);
>> > >>>
>> > >>> // Create the configuration.
>> > >>> final String appenderName = "File";
>> > >>> final String appenderFilepath = Paths
>> > >>> .get(
>> > >>> System.getProperty("java.io.tmpdir"),
>> > >>> "ParallelRunTest-" + letter + ".log")
>> > >>> .toAbsolutePath()
>> > >>> .toString();
>> > >>> final Configuration config = configBuilder
>> > >>> .add(configBuilder
>> > >>> .newAppender(appenderName, "File")
>> > >>> .addAttribute("fileName", appenderFilepath)
>> > >>> .addAttribute("append", false)
>> > >>> .addAttribute("immediateFlush", false)
>> > >>> .addAttribute("ignoreExceptions", false)
>> > >>> .add(configBuilder
>> > >>> .newLayout("PatternLayout")
>> > >>> .addAttribute("pattern", "%m\n")))
>> > >>> .add(configBuilder
>> > >>> .newRootLogger(Level.ALL)
>> > >>>
>> > .add(configBuilder.newAppenderRef(appenderName)))
>> > >>> .build(false);
>> > >>>
>> > >>> // Initialize the configuration.
>> > >>> try (final LoggerContext loggerContext =
>> > >>> Configurator.initialize(config)) {
>> > >>> final Logger logger =
>> > >>> loggerContext.getLogger(ParallelRunTest.class);
>> > >>>
>> > >>> // Write logs.
>> > >>> final String message =
>> > Strings.repeat(String.valueOf(letter),
>> > >>> 999);
>> > >>> for (int i = 0; i < 1_000; i++) {
>> > >>> logger.info(message);
>> > >>> }
>> > >>>
>> > >>> }
>> > >>>
>> > >>> // Verify the file content.
>> > >>> final long appenderFileLength = new
>> > >>> File(appenderFilepath).length();
>> > >>> assertThat(appenderFileLength).isEqualTo(1_000_000L);
>> > >>>
>> > >>> }
>> > >>>
>> > >>> }
>> > >>>
>> > >>
>> >
>> >
>> >
>>
>
Re: Unexpected concurrent LoggerContext initialization
Posted by Volkan Yazıcı <vo...@yazi.ci>.
*[Note that the shared `ParallelRunTest` is a self-sufficient code, that
is, one can simply copy-paste it into a Log4j test and run it.]*
When `ExecutionMode.SAME_THREAD` is used, everything works as expected:
wc -l /tmp/ParallelRunTest-*
1000 /tmp/ParallelRunTest-A.log
1000 /tmp/ParallelRunTest-B.log
1000 /tmp/ParallelRunTest-C.log
1000 /tmp/ParallelRunTest-D.log
4000 total
for log_file in /tmp/ParallelRunTest-*; do
echo "file: $log_file"
echo "line lengths:"
awk "{print length}" $log_file | sort | uniq
echo "distinct lines:"
sort $log_file | uniq
echo
done
file: /tmp/ParallelRunTest-A.log
line lengths:
999
distinct lines:
AAA...A
file: /tmp/ParallelRunTest-B.log
line lengths:
999
distinct lines:
BBB...B
file: /tmp/ParallelRunTest-C.log
line lengths:
999
distinct lines:
CCC...C
file: /tmp/ParallelRunTest-D.log
line lengths:
999
distinct lines:
DDD...D
When `ExecutionMode.CONCURRENT` is used, tests fail due to unexpected
`appenderFileLength`:
wc -l /tmp/ParallelRunTest-*
96 /tmp/ParallelRunTest-A.log
1 /tmp/ParallelRunTest-B.log
96 /tmp/ParallelRunTest-C.log
3577 /tmp/ParallelRunTest-D.log
3770 total
for log_file in /tmp/ParallelRunTest-*; do
echo "file: $log_file"
echo "line lengths:"
awk "{print length}" $log_file | sort | uniq
echo "distinct lines:"
sort $log_file | uniq
echo
done
file: /tmp/ParallelRunTest-A.log
line lengths:
999
distinct lines:
AAA...A
BBB...B
CCC...C
file: /tmp/ParallelRunTest-B.log
line lengths:
999
distinct lines:
BBB...B
file: /tmp/ParallelRunTest-C.log
line lengths:
999
distinct lines:
BBB...B
CCC...C
file: /tmp/ParallelRunTest-D.log
line lengths:
999
distinct lines:
AAA...A
BBB...B
CCC...C
DDD...D
Note that `AAA...A`, `BBB...B`, etc. snippets shared above are truncated
for display purposes, otherwise each line has 999 *_unscrambled_*
characters.
Given 1) the total number of logged lines is less than 4000, 2) letters are
scattered between files, and 3) lines are not scrambled, I have the feeling
that produced `LogEvent`s either got lost or sent to wrong appenders.
On Fri, Nov 12, 2021 at 7:49 AM Remko Popma <re...@gmail.com> wrote:
> What do the generated files look like?
> Is the output that is generated in concurrent mode longer or shorter than
> the expected length?
> Also, does it contain one entry (one log message) per line, or is it
> scrambled? Are entries ordered by time?
>
> On Fri, Nov 12, 2021 at 12:34 AM Ralph Goers <ra...@dslextreme.com>
> wrote:
>
> > How does it fail?
> >
> > Ralph
> >
> > > On Nov 11, 2021, at 1:42 AM, Volkan Yazıcı <vo...@yazi.ci> wrote:
> > >
> > > They sort of do exist, see JsonTemplateLayoutConcurrentEncodeTest
> > > <
> >
> https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutConcurrentEncodeTest.java#L58
> > >
> > > .
> > > But I can add a dedicated test too.
> > > Nevertheless, I still wonder what the problem is.
> > >
> > > On Wed, Nov 10, 2021 at 9:15 PM Gary Gregory <ga...@gmail.com>
> > wrote:
> > >
> > >> Should this test be added to the repo with a TODO comment?
> > >>
> > >> Gary
> > >>
> > >> On Mon, Nov 8, 2021, 07:09 Volkan Yazıcı <vo...@gmail.com>
> > wrote:
> > >>
> > >>> Hello! Does anybody have an idea why the following test fails for
> > >>> CONCURRENT execution mode, whereas it works for SAME_THREAD?
> > >>>
> > >>> import org.apache.logging.log4j.Level;
> > >>> import org.apache.logging.log4j.Logger;
> > >>> import org.apache.logging.log4j.core.LoggerContext;
> > >>> import org.apache.logging.log4j.core.config.Configuration;
> > >>> import org.apache.logging.log4j.core.config.Configurator;
> > >>> import
> > >>>
> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
> > >>> import
> > >>>
> > >>
> >
> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
> > >>> import org.apache.logging.log4j.util.Strings;
> > >>> import org.junit.jupiter.api.parallel.Execution;
> > >>> import org.junit.jupiter.api.parallel.ExecutionMode;
> > >>> import org.junit.jupiter.params.ParameterizedTest;
> > >>> import org.junit.jupiter.params.provider.ValueSource;
> > >>>
> > >>> import java.io.File;
> > >>> import java.nio.file.Paths;
> > >>>
> > >>> import static org.assertj.core.api.Assertions.assertThat;
> > >>>
> > >>> @Execution(ExecutionMode.SAME_THREAD)
> > >>> class ParallelRunTest {
> > >>>
> > >>> @ParameterizedTest
> > >>> @ValueSource(chars = {'A', 'B', 'C', 'D'})
> > >>> void test(final char letter) {
> > >>>
> > >>> // Create the configuration builder.
> > >>> final ConfigurationBuilder<?> configBuilder =
> > >>> ConfigurationBuilderFactory
> > >>> .newConfigurationBuilder()
> > >>> .setStatusLevel(Level.ERROR)
> > >>> .setConfigurationName("Letter-" + letter);
> > >>>
> > >>> // Create the configuration.
> > >>> final String appenderName = "File";
> > >>> final String appenderFilepath = Paths
> > >>> .get(
> > >>> System.getProperty("java.io.tmpdir"),
> > >>> "ParallelRunTest-" + letter + ".log")
> > >>> .toAbsolutePath()
> > >>> .toString();
> > >>> final Configuration config = configBuilder
> > >>> .add(configBuilder
> > >>> .newAppender(appenderName, "File")
> > >>> .addAttribute("fileName", appenderFilepath)
> > >>> .addAttribute("append", false)
> > >>> .addAttribute("immediateFlush", false)
> > >>> .addAttribute("ignoreExceptions", false)
> > >>> .add(configBuilder
> > >>> .newLayout("PatternLayout")
> > >>> .addAttribute("pattern", "%m\n")))
> > >>> .add(configBuilder
> > >>> .newRootLogger(Level.ALL)
> > >>>
> > .add(configBuilder.newAppenderRef(appenderName)))
> > >>> .build(false);
> > >>>
> > >>> // Initialize the configuration.
> > >>> try (final LoggerContext loggerContext =
> > >>> Configurator.initialize(config)) {
> > >>> final Logger logger =
> > >>> loggerContext.getLogger(ParallelRunTest.class);
> > >>>
> > >>> // Write logs.
> > >>> final String message =
> > Strings.repeat(String.valueOf(letter),
> > >>> 999);
> > >>> for (int i = 0; i < 1_000; i++) {
> > >>> logger.info(message);
> > >>> }
> > >>>
> > >>> }
> > >>>
> > >>> // Verify the file content.
> > >>> final long appenderFileLength = new
> > >>> File(appenderFilepath).length();
> > >>> assertThat(appenderFileLength).isEqualTo(1_000_000L);
> > >>>
> > >>> }
> > >>>
> > >>> }
> > >>>
> > >>
> >
> >
> >
>
Re: Unexpected concurrent LoggerContext initialization
Posted by Remko Popma <re...@gmail.com>.
What do the generated files look like?
Is the output that is generated in concurrent mode longer or shorter than
the expected length?
Also, does it contain one entry (one log message) per line, or is it
scrambled? Are entries ordered by time?
On Fri, Nov 12, 2021 at 12:34 AM Ralph Goers <ra...@dslextreme.com>
wrote:
> How does it fail?
>
> Ralph
>
> > On Nov 11, 2021, at 1:42 AM, Volkan Yazıcı <vo...@yazi.ci> wrote:
> >
> > They sort of do exist, see JsonTemplateLayoutConcurrentEncodeTest
> > <
> https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutConcurrentEncodeTest.java#L58
> >
> > .
> > But I can add a dedicated test too.
> > Nevertheless, I still wonder what the problem is.
> >
> > On Wed, Nov 10, 2021 at 9:15 PM Gary Gregory <ga...@gmail.com>
> wrote:
> >
> >> Should this test be added to the repo with a TODO comment?
> >>
> >> Gary
> >>
> >> On Mon, Nov 8, 2021, 07:09 Volkan Yazıcı <vo...@gmail.com>
> wrote:
> >>
> >>> Hello! Does anybody have an idea why the following test fails for
> >>> CONCURRENT execution mode, whereas it works for SAME_THREAD?
> >>>
> >>> import org.apache.logging.log4j.Level;
> >>> import org.apache.logging.log4j.Logger;
> >>> import org.apache.logging.log4j.core.LoggerContext;
> >>> import org.apache.logging.log4j.core.config.Configuration;
> >>> import org.apache.logging.log4j.core.config.Configurator;
> >>> import
> >>> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
> >>> import
> >>>
> >>
> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
> >>> import org.apache.logging.log4j.util.Strings;
> >>> import org.junit.jupiter.api.parallel.Execution;
> >>> import org.junit.jupiter.api.parallel.ExecutionMode;
> >>> import org.junit.jupiter.params.ParameterizedTest;
> >>> import org.junit.jupiter.params.provider.ValueSource;
> >>>
> >>> import java.io.File;
> >>> import java.nio.file.Paths;
> >>>
> >>> import static org.assertj.core.api.Assertions.assertThat;
> >>>
> >>> @Execution(ExecutionMode.SAME_THREAD)
> >>> class ParallelRunTest {
> >>>
> >>> @ParameterizedTest
> >>> @ValueSource(chars = {'A', 'B', 'C', 'D'})
> >>> void test(final char letter) {
> >>>
> >>> // Create the configuration builder.
> >>> final ConfigurationBuilder<?> configBuilder =
> >>> ConfigurationBuilderFactory
> >>> .newConfigurationBuilder()
> >>> .setStatusLevel(Level.ERROR)
> >>> .setConfigurationName("Letter-" + letter);
> >>>
> >>> // Create the configuration.
> >>> final String appenderName = "File";
> >>> final String appenderFilepath = Paths
> >>> .get(
> >>> System.getProperty("java.io.tmpdir"),
> >>> "ParallelRunTest-" + letter + ".log")
> >>> .toAbsolutePath()
> >>> .toString();
> >>> final Configuration config = configBuilder
> >>> .add(configBuilder
> >>> .newAppender(appenderName, "File")
> >>> .addAttribute("fileName", appenderFilepath)
> >>> .addAttribute("append", false)
> >>> .addAttribute("immediateFlush", false)
> >>> .addAttribute("ignoreExceptions", false)
> >>> .add(configBuilder
> >>> .newLayout("PatternLayout")
> >>> .addAttribute("pattern", "%m\n")))
> >>> .add(configBuilder
> >>> .newRootLogger(Level.ALL)
> >>>
> .add(configBuilder.newAppenderRef(appenderName)))
> >>> .build(false);
> >>>
> >>> // Initialize the configuration.
> >>> try (final LoggerContext loggerContext =
> >>> Configurator.initialize(config)) {
> >>> final Logger logger =
> >>> loggerContext.getLogger(ParallelRunTest.class);
> >>>
> >>> // Write logs.
> >>> final String message =
> Strings.repeat(String.valueOf(letter),
> >>> 999);
> >>> for (int i = 0; i < 1_000; i++) {
> >>> logger.info(message);
> >>> }
> >>>
> >>> }
> >>>
> >>> // Verify the file content.
> >>> final long appenderFileLength = new
> >>> File(appenderFilepath).length();
> >>> assertThat(appenderFileLength).isEqualTo(1_000_000L);
> >>>
> >>> }
> >>>
> >>> }
> >>>
> >>
>
>
>
Re: Unexpected concurrent LoggerContext initialization
Posted by Ralph Goers <ra...@dslextreme.com>.
How does it fail?
Ralph
> On Nov 11, 2021, at 1:42 AM, Volkan Yazıcı <vo...@yazi.ci> wrote:
>
> They sort of do exist, see JsonTemplateLayoutConcurrentEncodeTest
> <https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutConcurrentEncodeTest.java#L58>
> .
> But I can add a dedicated test too.
> Nevertheless, I still wonder what the problem is.
>
> On Wed, Nov 10, 2021 at 9:15 PM Gary Gregory <ga...@gmail.com> wrote:
>
>> Should this test be added to the repo with a TODO comment?
>>
>> Gary
>>
>> On Mon, Nov 8, 2021, 07:09 Volkan Yazıcı <vo...@gmail.com> wrote:
>>
>>> Hello! Does anybody have an idea why the following test fails for
>>> CONCURRENT execution mode, whereas it works for SAME_THREAD?
>>>
>>> import org.apache.logging.log4j.Level;
>>> import org.apache.logging.log4j.Logger;
>>> import org.apache.logging.log4j.core.LoggerContext;
>>> import org.apache.logging.log4j.core.config.Configuration;
>>> import org.apache.logging.log4j.core.config.Configurator;
>>> import
>>> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
>>> import
>>>
>> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
>>> import org.apache.logging.log4j.util.Strings;
>>> import org.junit.jupiter.api.parallel.Execution;
>>> import org.junit.jupiter.api.parallel.ExecutionMode;
>>> import org.junit.jupiter.params.ParameterizedTest;
>>> import org.junit.jupiter.params.provider.ValueSource;
>>>
>>> import java.io.File;
>>> import java.nio.file.Paths;
>>>
>>> import static org.assertj.core.api.Assertions.assertThat;
>>>
>>> @Execution(ExecutionMode.SAME_THREAD)
>>> class ParallelRunTest {
>>>
>>> @ParameterizedTest
>>> @ValueSource(chars = {'A', 'B', 'C', 'D'})
>>> void test(final char letter) {
>>>
>>> // Create the configuration builder.
>>> final ConfigurationBuilder<?> configBuilder =
>>> ConfigurationBuilderFactory
>>> .newConfigurationBuilder()
>>> .setStatusLevel(Level.ERROR)
>>> .setConfigurationName("Letter-" + letter);
>>>
>>> // Create the configuration.
>>> final String appenderName = "File";
>>> final String appenderFilepath = Paths
>>> .get(
>>> System.getProperty("java.io.tmpdir"),
>>> "ParallelRunTest-" + letter + ".log")
>>> .toAbsolutePath()
>>> .toString();
>>> final Configuration config = configBuilder
>>> .add(configBuilder
>>> .newAppender(appenderName, "File")
>>> .addAttribute("fileName", appenderFilepath)
>>> .addAttribute("append", false)
>>> .addAttribute("immediateFlush", false)
>>> .addAttribute("ignoreExceptions", false)
>>> .add(configBuilder
>>> .newLayout("PatternLayout")
>>> .addAttribute("pattern", "%m\n")))
>>> .add(configBuilder
>>> .newRootLogger(Level.ALL)
>>> .add(configBuilder.newAppenderRef(appenderName)))
>>> .build(false);
>>>
>>> // Initialize the configuration.
>>> try (final LoggerContext loggerContext =
>>> Configurator.initialize(config)) {
>>> final Logger logger =
>>> loggerContext.getLogger(ParallelRunTest.class);
>>>
>>> // Write logs.
>>> final String message = Strings.repeat(String.valueOf(letter),
>>> 999);
>>> for (int i = 0; i < 1_000; i++) {
>>> logger.info(message);
>>> }
>>>
>>> }
>>>
>>> // Verify the file content.
>>> final long appenderFileLength = new
>>> File(appenderFilepath).length();
>>> assertThat(appenderFileLength).isEqualTo(1_000_000L);
>>>
>>> }
>>>
>>> }
>>>
>>
Re: Unexpected concurrent LoggerContext initialization
Posted by Volkan Yazıcı <vo...@yazi.ci>.
They sort of do exist, see JsonTemplateLayoutConcurrentEncodeTest
<https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutConcurrentEncodeTest.java#L58>
.
But I can add a dedicated test too.
Nevertheless, I still wonder what the problem is.
On Wed, Nov 10, 2021 at 9:15 PM Gary Gregory <ga...@gmail.com> wrote:
> Should this test be added to the repo with a TODO comment?
>
> Gary
>
> On Mon, Nov 8, 2021, 07:09 Volkan Yazıcı <vo...@gmail.com> wrote:
>
> > Hello! Does anybody have an idea why the following test fails for
> > CONCURRENT execution mode, whereas it works for SAME_THREAD?
> >
> > import org.apache.logging.log4j.Level;
> > import org.apache.logging.log4j.Logger;
> > import org.apache.logging.log4j.core.LoggerContext;
> > import org.apache.logging.log4j.core.config.Configuration;
> > import org.apache.logging.log4j.core.config.Configurator;
> > import
> > org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
> > import
> >
> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
> > import org.apache.logging.log4j.util.Strings;
> > import org.junit.jupiter.api.parallel.Execution;
> > import org.junit.jupiter.api.parallel.ExecutionMode;
> > import org.junit.jupiter.params.ParameterizedTest;
> > import org.junit.jupiter.params.provider.ValueSource;
> >
> > import java.io.File;
> > import java.nio.file.Paths;
> >
> > import static org.assertj.core.api.Assertions.assertThat;
> >
> > @Execution(ExecutionMode.SAME_THREAD)
> > class ParallelRunTest {
> >
> > @ParameterizedTest
> > @ValueSource(chars = {'A', 'B', 'C', 'D'})
> > void test(final char letter) {
> >
> > // Create the configuration builder.
> > final ConfigurationBuilder<?> configBuilder =
> > ConfigurationBuilderFactory
> > .newConfigurationBuilder()
> > .setStatusLevel(Level.ERROR)
> > .setConfigurationName("Letter-" + letter);
> >
> > // Create the configuration.
> > final String appenderName = "File";
> > final String appenderFilepath = Paths
> > .get(
> > System.getProperty("java.io.tmpdir"),
> > "ParallelRunTest-" + letter + ".log")
> > .toAbsolutePath()
> > .toString();
> > final Configuration config = configBuilder
> > .add(configBuilder
> > .newAppender(appenderName, "File")
> > .addAttribute("fileName", appenderFilepath)
> > .addAttribute("append", false)
> > .addAttribute("immediateFlush", false)
> > .addAttribute("ignoreExceptions", false)
> > .add(configBuilder
> > .newLayout("PatternLayout")
> > .addAttribute("pattern", "%m\n")))
> > .add(configBuilder
> > .newRootLogger(Level.ALL)
> > .add(configBuilder.newAppenderRef(appenderName)))
> > .build(false);
> >
> > // Initialize the configuration.
> > try (final LoggerContext loggerContext =
> > Configurator.initialize(config)) {
> > final Logger logger =
> > loggerContext.getLogger(ParallelRunTest.class);
> >
> > // Write logs.
> > final String message = Strings.repeat(String.valueOf(letter),
> > 999);
> > for (int i = 0; i < 1_000; i++) {
> > logger.info(message);
> > }
> >
> > }
> >
> > // Verify the file content.
> > final long appenderFileLength = new
> > File(appenderFilepath).length();
> > assertThat(appenderFileLength).isEqualTo(1_000_000L);
> >
> > }
> >
> > }
> >
>
Re: Unexpected concurrent LoggerContext initialization
Posted by Gary Gregory <ga...@gmail.com>.
Should this test be added to the repo with a TODO comment?
Gary
On Mon, Nov 8, 2021, 07:09 Volkan Yazıcı <vo...@gmail.com> wrote:
> Hello! Does anybody have an idea why the following test fails for
> CONCURRENT execution mode, whereas it works for SAME_THREAD?
>
> import org.apache.logging.log4j.Level;
> import org.apache.logging.log4j.Logger;
> import org.apache.logging.log4j.core.LoggerContext;
> import org.apache.logging.log4j.core.config.Configuration;
> import org.apache.logging.log4j.core.config.Configurator;
> import
> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
> import
> org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
> import org.apache.logging.log4j.util.Strings;
> import org.junit.jupiter.api.parallel.Execution;
> import org.junit.jupiter.api.parallel.ExecutionMode;
> import org.junit.jupiter.params.ParameterizedTest;
> import org.junit.jupiter.params.provider.ValueSource;
>
> import java.io.File;
> import java.nio.file.Paths;
>
> import static org.assertj.core.api.Assertions.assertThat;
>
> @Execution(ExecutionMode.SAME_THREAD)
> class ParallelRunTest {
>
> @ParameterizedTest
> @ValueSource(chars = {'A', 'B', 'C', 'D'})
> void test(final char letter) {
>
> // Create the configuration builder.
> final ConfigurationBuilder<?> configBuilder =
> ConfigurationBuilderFactory
> .newConfigurationBuilder()
> .setStatusLevel(Level.ERROR)
> .setConfigurationName("Letter-" + letter);
>
> // Create the configuration.
> final String appenderName = "File";
> final String appenderFilepath = Paths
> .get(
> System.getProperty("java.io.tmpdir"),
> "ParallelRunTest-" + letter + ".log")
> .toAbsolutePath()
> .toString();
> final Configuration config = configBuilder
> .add(configBuilder
> .newAppender(appenderName, "File")
> .addAttribute("fileName", appenderFilepath)
> .addAttribute("append", false)
> .addAttribute("immediateFlush", false)
> .addAttribute("ignoreExceptions", false)
> .add(configBuilder
> .newLayout("PatternLayout")
> .addAttribute("pattern", "%m\n")))
> .add(configBuilder
> .newRootLogger(Level.ALL)
> .add(configBuilder.newAppenderRef(appenderName)))
> .build(false);
>
> // Initialize the configuration.
> try (final LoggerContext loggerContext =
> Configurator.initialize(config)) {
> final Logger logger =
> loggerContext.getLogger(ParallelRunTest.class);
>
> // Write logs.
> final String message = Strings.repeat(String.valueOf(letter),
> 999);
> for (int i = 0; i < 1_000; i++) {
> logger.info(message);
> }
>
> }
>
> // Verify the file content.
> final long appenderFileLength = new
> File(appenderFilepath).length();
> assertThat(appenderFileLength).isEqualTo(1_000_000L);
>
> }
>
> }
>