Search code examples
configurationlog4jconfiglog4j2builder

How Can I Add The OutputStream Using Programmatical Configuration in Log4j2?


Any idea how I can add my output stream to the build config?

ConfigurationBuilder<BuiltConfiguration> builder = 
ConfigurationBuilderFactory.newConfigurationBuilder();
    
AppenderComponentBuilder osAppender = builder.newAppender("os", "OutputStream");
osAppender.addAttribute("target", myStream);
builder.add(osAppender);
    
BuiltConfiguration config = builder.build();
Configurator.initialize(config);

This is the Error message I get:

2022-01-27 15:04:41,203 main ERROR OutputStream contains an invalid element or attribute "target"
2022-01-27 15:04:41,227 main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.OutputStreamAppender for element OutputStream: java.lang.NullPointerException java.lang.NullPointerException
at org.apache.logging.log4j.core.appender.OutputStreamAppender.getManager(OutputStreamAppender.java:159)

Thanks


Solution

  • The ConfigurationBuilder API does not allow you to set attributes which can not be serialized to a String. Therefore you'll need to use OutputSreamAppender's builder directly:

      final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
      final Configuration config = ctx.getConfiguration();
      final Appender appender = OutputStreamAppender.newBuilder()//
                                                    .setTarget(myStream)
                                                    .setConfiguration(ctx.getConfiguration())
                                                    .build();
      config.addLoggerAppender(ctx.getRootLogger(), appender);
    

    See this question for another example of ConfigurationBuilder API vs direct instantiation of Log4j components.

    Check also Log4j's architecture, which explains how all these components work together.