'Log4j2 - LogManager.getLogger("name") not finding custom loggers

Log4j2 - LogManager.getLogger("name") not finding custom loggers.

All of the following return the same logger - that being the Root logger for the class that this code is in. I would like to think these would all be different and I would get my 3 custom ones back for the first 3 calls. Note the files specified by the appenders are created, but no logs are sent to them.

Logger _l = (Logger) LogManager.getLogger("Global");
       _l = (Logger) LogManager.getLogger("fakeswitch");
       _l = (Logger) LogManager.getLogger("fakeswitch_two");
       _l = (Logger) LogManager.getLogger();

I create custom loggers using the following:

ComponentBuilder triggeringPolicy = configurationBuilder.newComponent("Policies")
        .addComponent(configurationBuilder.newComponent("TimeBasedTriggeringPolicy").
                addAttribute("interval", "1"));

AppenderComponentBuilder log4jFileAppenderBuilder = configurationBuilder.
        newAppender(pName + "_SmdrDailyRollingFileAppender", "RollingFile");
log4jFileAppenderBuilder.addAttribute("filename", pLogFilename);
log4jFileAppenderBuilder.addAttribute("filePattern", pLogFilenamePattern);
log4jFileAppenderBuilder.addComponent(triggeringPolicy);

// Configure the PatternLayout
LayoutComponentBuilder layoutComponentBuilder = configurationBuilder.newLayout("PatternLayout").
        addAttribute("pattern", DEBUG_PATTERN_LAYOUT_STRING);
log4jFileAppenderBuilder.add(layoutComponentBuilder);

// Add it back into configuration
configurationBuilder.add(log4jFileAppenderBuilder);

// https://logging.apache.org/log4j/2.x/manual/customconfig.html
LoggerComponentBuilder logger = configurationBuilder.newLogger(pName, Level.DEBUG);
logger.add(configurationBuilder.newAppenderRef(pName + "_SmdrDailyRollingFileAppender"));
logger.addAttribute("additivity", false);
configurationBuilder.add(logger);

// Actually use it
LoggerContext _loggerContext = Configurator.initialize(configurationBuilder.build());

The equiv XML from writeXmlConfiguration is:

<?xml version="1.0" ?>
<Configuration>
    <Appenders>
        <RollingFile name="Global_SmdrDailyRollingFileAppender" filename="ps/debug/SMDR_DEBUG.txt"
                     filePattern="ps/debug/SMDR_DEBUG_%d{yyyyMMdd}.txt.gz">
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <PatternLayout pattern="%d{MM.DD.yy-HH:mm:ss} %m%n"/>
        </RollingFile>
        <RollingFile name="fakeswitch_SmdrDailyRollingFileAppender" filename="ps/debug/SMDR_DEBUG_fakeswitch.txt"
                     filePattern="ps/debug/SMDR_DEBUG_fakeswitch_%d{yyyyMMdd}.txt.gz">
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <PatternLayout pattern="%d{MM.DD.yy-HH:mm:ss} %m%n"/>
        </RollingFile>
        <RollingFile name="fakeswitch_two_SmdrDailyRollingFileAppender"
                     filename="ps/debug/SMDR_DEBUG_fakeswitch_two.txt"
                     filePattern="ps/debug/SMDR_DEBUG_fakeswitch_two_%d{yyyyMMdd}.txt.gz">
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <PatternLayout pattern="%d{MM.DD.yy-HH:mm:ss} %m%n"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="Global" level="DEBUG" additivity="false">
            <AppenderRef ref="Global_SmdrDailyRollingFileAppender"/>
        </Logger>
        <Logger name="fakeswitch" level="DEBUG" additivity="false">
            <AppenderRef ref="fakeswitch_SmdrDailyRollingFileAppender"/>
        </Logger>
        <Logger name="fakeswitch_two" level="DEBUG" additivity="false">
            <AppenderRef ref="fakeswitch_two_SmdrDailyRollingFileAppender"/>
        </Logger>
    </Loggers>
</Configuration>


Solution 1:[1]

This was answered for me by Piotr P Karwasz.

This only works if the LoggerContext has not been initialized yet. Since every call to a LogManager method initializes a LoggerContext, it is almost certainly too late to use Configurator.initialize.

Use Configuration.reconfigure instead, which works in all cases.

Piotr

--- my code change was

LoggerContext _loggerContext = Configurator.initialize(configurationBuilder.build());

to

Configurator.reconfigure(configurationBuilder.build());

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 SRJ