[
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)