[
https://issues.apache.org/jira/browse/LOG4J2-3404?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Piotr P. Karwasz updated LOG4J2-3404:
-------------------------------------
Description:
If an appender does not specify a layout a default {{PatternLayout}} is created
*together* with a {{{}DefaultConfiguration{}}}, which is never stopped nor
attached to a {{{}LoggerContext{}}}.
For example, if we using a simple file appender:
{code:java}
appenders:
File:
name: FILE
fileName: logs/myfile.log {code}
and running:
{code:java}
LogManager.getLogger("test");{code}
will result in the following (redacted and commented) status logger output:
{code:java}
# DefaultConfiguration from LoggerContext constructor
DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-1
DEBUG StatusLogger Starting LoggerContext[name=2437c6dc,
org.apache.logging.log4j.core.LoggerContext@45752059]...
DEBUG StatusLogger Reconfiguration started for context[name=2437c6dc] at URI
null (org.apache.logging.log4j.core.LoggerContext@45752059) with optional
ClassLoader: null
# Spurious DefaultConfiguration used to create default PatternLayout
# This manager will **never** stop
DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-2
# My appender
DEBUG StatusLogger Starting FileManager logs/myfile.log
DEBUG StatusLogger Starting configuration
YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml]
DEBUG StatusLogger Started configuration
YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml] OK.
# The first DefaultConfiguration stops
#
TRACE StatusLogger Stopping
org.apache.logging.log4j.core.config.DefaultConfiguration@145f66e3...
DEBUG StatusLogger Shutting down OutputStreamManager SYSTEM_OUT.false.false-1
DEBUG StatusLogger OutputStream closed
DEBUG StatusLogger Shut down OutputStreamManager SYSTEM_OUT.false.false-1, all
resources released: true
DEBUG StatusLogger Appender DefaultConsole-1 stopped with status true
TRACE StatusLogger DefaultConfiguration stopped 1 remaining Appenders.
TRACE StatusLogger DefaultConfiguration cleaning Appenders from 1 LoggerConfigs.
DEBUG StatusLogger Stopped
org.apache.logging.log4j.core.config.DefaultConfiguration@145f66e3 OK
# At JVM shutdown
TRACE StatusLogger Stopping
YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml]...
TRACE StatusLogger YamlConfiguration notified 2 ReliabilityStrategies that
config will be stopped.
TRACE StatusLogger YamlConfiguration stopping 1 LoggerConfigs.
TRACE StatusLogger YamlConfiguration stopping root LoggerConfig.
TRACE StatusLogger YamlConfiguration notifying ReliabilityStrategies that
appenders will be stopped.
TRACE StatusLogger YamlConfiguration stopping remaining Appenders.
DEBUG StatusLogger Appender CONSOLE stopped with status true
TRACE StatusLogger YamlConfiguration stopped 1 remaining Appenders.
TRACE StatusLogger YamlConfiguration cleaning Appenders from 2 LoggerConfigs.
DEBUG StatusLogger Stopped
YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml] OK{code}
I can provide a PR to prevent the leaking of {{DefaultConfiguration}} s.
was:
If an appender does not specify a layout a default {{PatternLayout}} is created
*together* with a {{{}DefaultConfiguration{}}}, which is never stopped nor
attached to a {{{}LoggerContext{}}}.
For example, if we using a simple file appender:
{code:java}
appenders:
File:
name: FILE
fileName: logs/myfile.log {code}
and running:
{code:java}
LogManager.getLogger("test");{code}
will result in the following (redacted and commented) status logger output:
{code:java}
# DefaultConfiguration from LoggerContext constructor
DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-1
# Spurious DefaultConfiguration used to create default PatternLayout
# This manager will **never** stop
DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-2
# My appender
DEBUG StatusLogger Starting FileManager logs/myfile.log
# The first DefaultConfiguration stops
DEBUG StatusLogger Shutting down OutputStreamManager SYSTEM_OUT.false.false-1
DEBUG StatusLogger OutputStream closed
DEBUG StatusLogger Shut down OutputStreamManager SYSTEM_OUT.false.false-1, all
resources released: true
DEBUG StatusLogger Appender DefaultConsole-1 stopped with status true
TRACE StatusLogger DefaultConfiguration stopped 1 remaining Appenders.
TRACE StatusLogger DefaultConfiguration cleaning Appenders from 1 LoggerConfigs.
DEBUG StatusLogger Stopped
org.apache.logging.log4j.core.config.DefaultConfiguration@145f66e3 OK
# At JVM shutdown
TRACE StatusLogger Stopping
YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml]...
TRACE StatusLogger YamlConfiguration notified 2 ReliabilityStrategies that
config will be stopped.
TRACE StatusLogger YamlConfiguration stopping 1 LoggerConfigs.
TRACE StatusLogger YamlConfiguration stopping root LoggerConfig.
TRACE StatusLogger YamlConfiguration notifying ReliabilityStrategies that
appenders will be stopped.
TRACE StatusLogger YamlConfiguration stopping remaining Appenders.
DEBUG StatusLogger Appender CONSOLE stopped with status true
TRACE StatusLogger YamlConfiguration stopped 1 remaining Appenders.
TRACE StatusLogger YamlConfiguration cleaning Appenders from 2 LoggerConfigs.
DEBUG StatusLogger Stopped
YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml] OK{code}
I can provide a PR to prevent the leaking of {{DefaultConfiguration}}s.
> Leak of DefaultConfiguration instances
> --------------------------------------
>
> Key: LOG4J2-3404
> URL: https://issues.apache.org/jira/browse/LOG4J2-3404
> Project: Log4j 2
> Issue Type: Bug
> Components: Configuration
> Affects Versions: 2.17.1
> Reporter: Piotr P. Karwasz
> Priority: Major
>
> If an appender does not specify a layout a default {{PatternLayout}} is
> created *together* with a {{{}DefaultConfiguration{}}}, which is never
> stopped nor attached to a {{{}LoggerContext{}}}.
> For example, if we using a simple file appender:
> {code:java}
> appenders:
> File:
> name: FILE
> fileName: logs/myfile.log {code}
> and running:
> {code:java}
> LogManager.getLogger("test");{code}
> will result in the following (redacted and commented) status logger output:
> {code:java}
> # DefaultConfiguration from LoggerContext constructor
> DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-1
> DEBUG StatusLogger Starting LoggerContext[name=2437c6dc,
> org.apache.logging.log4j.core.LoggerContext@45752059]...
> DEBUG StatusLogger Reconfiguration started for context[name=2437c6dc] at URI
> null (org.apache.logging.log4j.core.LoggerContext@45752059) with optional
> ClassLoader: null
> # Spurious DefaultConfiguration used to create default PatternLayout
> # This manager will **never** stop
> DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-2
> # My appender
> DEBUG StatusLogger Starting FileManager logs/myfile.log
> DEBUG StatusLogger Starting configuration
> YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml]
> DEBUG StatusLogger Started configuration
> YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml] OK.
> # The first DefaultConfiguration stops
> #
> TRACE StatusLogger Stopping
> org.apache.logging.log4j.core.config.DefaultConfiguration@145f66e3...
> DEBUG StatusLogger Shutting down OutputStreamManager SYSTEM_OUT.false.false-1
> DEBUG StatusLogger OutputStream closed
> DEBUG StatusLogger Shut down OutputStreamManager SYSTEM_OUT.false.false-1,
> all resources released: true
> DEBUG StatusLogger Appender DefaultConsole-1 stopped with status true
> TRACE StatusLogger DefaultConfiguration stopped 1 remaining Appenders.
> TRACE StatusLogger DefaultConfiguration cleaning Appenders from 1
> LoggerConfigs.
> DEBUG StatusLogger Stopped
> org.apache.logging.log4j.core.config.DefaultConfiguration@145f66e3 OK
> # At JVM shutdown
> TRACE StatusLogger Stopping
> YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml]...
> TRACE StatusLogger YamlConfiguration notified 2 ReliabilityStrategies that
> config will be stopped.
> TRACE StatusLogger YamlConfiguration stopping 1 LoggerConfigs.
> TRACE StatusLogger YamlConfiguration stopping root LoggerConfig.
> TRACE StatusLogger YamlConfiguration notifying ReliabilityStrategies that
> appenders will be stopped.
> TRACE StatusLogger YamlConfiguration stopping remaining Appenders.
> DEBUG StatusLogger Appender CONSOLE stopped with status true
> TRACE StatusLogger YamlConfiguration stopped 1 remaining Appenders.
> TRACE StatusLogger YamlConfiguration cleaning Appenders from 2 LoggerConfigs.
> DEBUG StatusLogger Stopped
> YamlConfiguration[location=D:\Examples\log4j\target\classes\log4j2.yml]
> OK{code}
> I can provide a PR to prevent the leaking of {{DefaultConfiguration}} s.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)