Dynamically added appender is not logging log4j2

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Dynamically added appender is not logging log4j2

Mike Garcia
I'm trying to add a log4j2 file appender at runtime.  I have a process that has it's own log4j2.xml config file which logs to a rolling file appender and the console.  This process will receive requests from other processes.  It creates an output folder that I want to create a log file in for the output during that run.  So, I add a file appender in code, then remove it when the job is complete.  This worked in log4j 1.x but doesn't work now that I updated to log4j2.  Here's the code to add the appender:

         final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
         final Configuration config = loggerContext.getConfiguration();
         FileAppender appender =
               FileAppender.newBuilder().withName("MyFileAppender").withAppend(false)
               .withFileName(new File(myOutputDirectory, "log.txt").toString())
                     .withLayout(
                           PatternLayout.newBuilder().withPattern("%d [%t] %-5p %c - %m%n").build())
               .setConfiguration(loggerContext.getConfiguration()).build();
         appender.start();
         config.addAppender(appender);
         loggerContext.getRootLogger().addAppender(loggerContext.getConfiguration().getAppender(appender.getName()));
         loggerContext.updateLoggers();

The log.txt file is create but nothing is written to it.  I also close the appender like this:

         if (appender != null && loggerContext != null)
         {
            appender.stop();
            Configuration config = loggerContext.getConfiguration();
            config.getRootLogger().removeAppender("OOEngineFileAppender");
            loggerContext.getRootLogger().removeAppender(appender);
            loggerContext.updateLoggers();
         }

Any idea what I'm doing wrong?

BTW, I turned on log4j2 debug via the command line switch and I see this output when I add the new appender:

    DEBUG StatusLogger Not in a ServletContext environment, thus not loading WebLookup plugin.
    DEBUG StatusLogger PluginManager 'Converter' found 44 plugins
    DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-2
    DEBUG StatusLogger Starting FileManager e:\temp\OutputDir\TaskRun_20190402_215311_122\log.txt

Thanks,
-Mike

Reply | Threaded
Open this post in threaded view
|

Re: Dynamically added appender is not logging log4j2

Gary Gregory-4
Mike,

Did you resolve this issue?

Gary

On Wed, Apr 3, 2019 at 1:57 PM Mike Garcia <[hidden email]>
wrote:

> I'm trying to add a log4j2 file appender at runtime.  I have a process
> that has it's own log4j2.xml config file which logs to a rolling file
> appender and the console.  This process will receive requests from other
> processes.  It creates an output folder that I want to create a log file in
> for the output during that run.  So, I add a file appender in code, then
> remove it when the job is complete.  This worked in log4j 1.x but doesn't
> work now that I updated to log4j2.  Here's the code to add the appender:
>
>          final LoggerContext loggerContext = (LoggerContext)
> LogManager.getContext(false);
>          final Configuration config = loggerContext.getConfiguration();
>          FileAppender appender =
>
>  FileAppender.newBuilder().withName("MyFileAppender").withAppend(false)
>                .withFileName(new File(myOutputDirectory,
> "log.txt").toString())
>                      .withLayout(
>                            PatternLayout.newBuilder().withPattern("%d [%t]
> %-5p %c - %m%n").build())
>                .setConfiguration(loggerContext.getConfiguration()).build();
>          appender.start();
>          config.addAppender(appender);
>
>  loggerContext.getRootLogger().addAppender(loggerContext.getConfiguration().getAppender(appender.getName()));
>          loggerContext.updateLoggers();
>
> The log.txt file is create but nothing is written to it.  I also close the
> appender like this:
>
>          if (appender != null && loggerContext != null)
>          {
>             appender.stop();
>             Configuration config = loggerContext.getConfiguration();
>             config.getRootLogger().removeAppender("OOEngineFileAppender");
>             loggerContext.getRootLogger().removeAppender(appender);
>             loggerContext.updateLoggers();
>          }
>
> Any idea what I'm doing wrong?
>
> BTW, I turned on log4j2 debug via the command line switch and I see this
> output when I add the new appender:
>
>     DEBUG StatusLogger Not in a ServletContext environment, thus not
> loading WebLookup plugin.
>     DEBUG StatusLogger PluginManager 'Converter' found 44 plugins
>     DEBUG StatusLogger Starting OutputStreamManager
> SYSTEM_OUT.false.false-2
>     DEBUG StatusLogger Starting FileManager
> e:\temp\OutputDir\TaskRun_20190402_215311_122\log.txt
>
> Thanks,
> -Mike
>
>