[ 
https://issues.apache.org/jira/browse/LOG4J2-3178?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

yankai zhang updated LOG4J2-3178:
---------------------------------
    Description: 
This is how {{DefaultMergeStrategy#mergConfigurations}} merge logger nodes:

!image-2021-10-19-20-25-16-215.png|width=825,height=648!

{{type}} of the later logger node will not replace previous one.

So, if previous file define a sync root logger, and later file define an async 
root logger, the final logger is sync.

Demo:

file1.xml:
{code:xml}
<Configuration>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>
{code}
 
 file2.xml:
{code:xml}
<Configuration>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - 
%m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <AsyncRoot level="info">
            <AppenderRef ref="Console" />
        </AsyncRoot>
    </Loggers>
</Configuration>
{code}
Command line arg:

-Dlog4j.configurationFile=file1.xml,file2.xml

 

Test code:
{code:java}
@Test
public void test() throws IllegalAccessException {
    Log4jLogger logger = (Log4jLogger) LoggerFactory.getLogger("test");

    Assert.assertEquals(
            AsyncLoggerConfig.class,
            
FieldUtils.readField(FieldUtils.readField(FieldUtils.readField(logger, 
"logger", true), "privateConfig", true), "loggerConfig", true).getClass()
    );
}
{code}

  was:
This is how {{DefaultMergeStrategy#mergConfigurations}} merge logger nodes:

!image-2021-10-19-20-25-16-215.png|width=825,height=648!

{{type}} of the later logger node will not replace previous one.

So, if previous file define a sync root logger, and later file define an async 
root logger, the final logger is sync.

Demo:

file1.xml:
{code:xml}
<Configuration>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>
{code}
 
 file2.xml:
{code:xml}
<Configuration>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - 
%m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <AsyncRoot level="info">
            <AppenderRef ref="Console" />
        </AsyncRoot>
    </Loggers>
</Configuration>
{code}
 

test code:
{code:java}
@Test
public void test() throws IllegalAccessException {
    Log4jLogger logger = (Log4jLogger) LoggerFactory.getLogger("test");

    Assert.assertEquals(
            AsyncLoggerConfig.class,
            
FieldUtils.readField(FieldUtils.readField(FieldUtils.readField(logger, 
"logger", true), "privateConfig", true), "loggerConfig", true).getClass()
    );
}
{code}


> DefaultMergeStrategy do not merge type of logger node
> -----------------------------------------------------
>
>                 Key: LOG4J2-3178
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-3178
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.11.1
>            Reporter: yankai zhang
>            Priority: Major
>         Attachments: image-2021-10-19-20-25-16-215.png
>
>
> This is how {{DefaultMergeStrategy#mergConfigurations}} merge logger nodes:
> !image-2021-10-19-20-25-16-215.png|width=825,height=648!
> {{type}} of the later logger node will not replace previous one.
> So, if previous file define a sync root logger, and later file define an 
> async root logger, the final logger is sync.
> Demo:
> file1.xml:
> {code:xml}
> <Configuration>
>     <Loggers>
>         <Root level="info">
>             <AppenderRef ref="Console" />
>         </Root>
>     </Loggers>
> </Configuration>
> {code}
>  
>  file2.xml:
> {code:xml}
> <Configuration>
>     <Appenders>
>         <Console name="Console" target="SYSTEM_OUT">
>             <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - 
> %m%n" />
>         </Console>
>     </Appenders>
>     <Loggers>
>         <AsyncRoot level="info">
>             <AppenderRef ref="Console" />
>         </AsyncRoot>
>     </Loggers>
> </Configuration>
> {code}
> Command line arg:
> -Dlog4j.configurationFile=file1.xml,file2.xml
>  
> Test code:
> {code:java}
> @Test
> public void test() throws IllegalAccessException {
>     Log4jLogger logger = (Log4jLogger) LoggerFactory.getLogger("test");
>     Assert.assertEquals(
>             AsyncLoggerConfig.class,
>             
> FieldUtils.readField(FieldUtils.readField(FieldUtils.readField(logger, 
> "logger", true), "privateConfig", true), "loggerConfig", true).getClass()
>     );
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to