[
https://issues.apache.org/jira/browse/IGNITE-19063?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ilya Shishkov updated IGNITE-19063:
-----------------------------------
Description:
Since 2.6 version by default Log4j2 utilizes {{MutableLogEvent}} [1], which is
a reusable implementation of {{LogEvent}}.
Test Log4j2 appender {{MemorizingAppener}} in Ignite captures such events "as
is", which can lead to mutation of captured events.
Currently, it is not happened, because Log4j2 implicitly considers, that it is
initialized in web application environment, as we can see in static
initialization of Log4j2 {{ReusableLogEventFactory}} and configuration
constants and here: [2-5].
As we can see in [5], availability of {{javax.servlet.Servlet}} or
{{jakarta.servlet.Servlet}} (the first one is available in Ignite) classes is a
sufficient condition _to eliminate utilization of_ {{ReusableLogEventFactory}}.
If we turn off "web app mode" by setting up system property "log4j2.is.webapp"
to "false", than events in {{MemorizingAppener}} will be mutated after some
invocations of logger methods.
Here is a reproducer patch: [^MemorizingAppenderTest.patch]
Problem can be fixed by if we will store immutable version of events
({{LogEvent#toImmutable}}) in {{MemorizingAppender#append}}.
Links:
# https://issues.apache.org/jira/browse/LOG4J2-1334
#
[https://github.com/apache/logging-log4j2/blob/e8fba8caf1ffab6dc0161f8f48611dadedb86b2c/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java#L101]
#
[https://github.com/apache/logging-log4j2/blob/b69b7b802539d87aab6b51aca0a0df8a669ce6ee/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java#L90]
#
[https://github.com/apache/logging-log4j2/blob/c6fd104ebc14d53ea2adce9f9e6fde9a167529b4/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java#L41]
#
[https://github.com/apache/logging-log4j2/blob/c6fd104ebc14d53ea2adce9f9e6fde9a167529b4/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java#L30]
was:
Since 2.6 version by default Log4j2 utilizes {{MutableLogEvent}} [1], which is
a reusable implementation of {{LogEvent}}.
Test Log4j2 appender {{MemorizingAppener}} in Ignite captures such events "as
is", which can lead to mutation of captured events.
Currently, it is not happened, because Log4j2 implicitly considers, that it is
initialized in web application environment, as we can see in static
initialization of Log4j2 {{ReusableLogEventFactory}} and configuration
constants and here: [2-5].
As we can see in [5], availability of {{javax.servlet.Servlet}} or
{{jakarta.servlet.Servlet}} (the first one is available in Ignite) classes is a
sufficient condition _to eliminate utilization of_ {{ReusableLogEventFactory}}.
If we turn off "web app mode" by setting up system property "log4j2.is.webapp"
to "false", than events in {{MemorizingAppener}} will be mutated after some
invocations of logger methods.
Here is a reproducer patch: [^MemorizingAppenderTest.patch]
Problem is resolved by if we will store immutable version of events
({{LogEvent#toImmutable}}) in {{MemorizingAppender#append}}.
Links:
# https://issues.apache.org/jira/browse/LOG4J2-1334
#
[https://github.com/apache/logging-log4j2/blob/e8fba8caf1ffab6dc0161f8f48611dadedb86b2c/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java#L101]
#
[https://github.com/apache/logging-log4j2/blob/b69b7b802539d87aab6b51aca0a0df8a669ce6ee/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java#L90]
#
[https://github.com/apache/logging-log4j2/blob/c6fd104ebc14d53ea2adce9f9e6fde9a167529b4/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java#L41]
#
[https://github.com/apache/logging-log4j2/blob/c6fd104ebc14d53ea2adce9f9e6fde9a167529b4/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java#L30]
> Fix incorrect behaviour of MemorizingAppender with MutableLogEvent
> ------------------------------------------------------------------
>
> Key: IGNITE-19063
> URL: https://issues.apache.org/jira/browse/IGNITE-19063
> Project: Ignite
> Issue Type: Test
> Reporter: Ilya Shishkov
> Priority: Minor
> Labels: ise
> Attachments: MemorizingAppenderTest.patch
>
>
> Since 2.6 version by default Log4j2 utilizes {{MutableLogEvent}} [1], which
> is a reusable implementation of {{LogEvent}}.
> Test Log4j2 appender {{MemorizingAppener}} in Ignite captures such events "as
> is", which can lead to mutation of captured events.
> Currently, it is not happened, because Log4j2 implicitly considers, that it
> is initialized in web application environment, as we can see in static
> initialization of Log4j2 {{ReusableLogEventFactory}} and configuration
> constants and here: [2-5].
> As we can see in [5], availability of {{javax.servlet.Servlet}} or
> {{jakarta.servlet.Servlet}} (the first one is available in Ignite) classes is
> a sufficient condition _to eliminate utilization of_
> {{ReusableLogEventFactory}}.
> If we turn off "web app mode" by setting up system property
> "log4j2.is.webapp" to "false", than events in {{MemorizingAppener}} will be
> mutated after some invocations of logger methods.
> Here is a reproducer patch: [^MemorizingAppenderTest.patch]
> Problem can be fixed by if we will store immutable version of events
> ({{LogEvent#toImmutable}}) in {{MemorizingAppender#append}}.
> Links:
> # https://issues.apache.org/jira/browse/LOG4J2-1334
> #
> [https://github.com/apache/logging-log4j2/blob/e8fba8caf1ffab6dc0161f8f48611dadedb86b2c/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java#L101]
> #
> [https://github.com/apache/logging-log4j2/blob/b69b7b802539d87aab6b51aca0a0df8a669ce6ee/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java#L90]
> #
> [https://github.com/apache/logging-log4j2/blob/c6fd104ebc14d53ea2adce9f9e6fde9a167529b4/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java#L41]
> #
> [https://github.com/apache/logging-log4j2/blob/c6fd104ebc14d53ea2adce9f9e6fde9a167529b4/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java#L30]
--
This message was sent by Atlassian Jira
(v8.20.10#820010)