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);
>
>     }
>
> }
>