0

Below are the programmatic configurations of consoleAppender and LogAppenders which I have converted for log4j upgrade from 1.. to 2.17.1 version.

    //Programmatic configuration of ConsoleAppender  log4j2
    String pattern = "%d{DATE} [%p|%C{2}] %m%n";
    ConfigurationBuilder<BuiltConfiguration> builder = 
           ConfigurationBuilderFactory.newConfigurationBuilder();
    
    builder.setConfigurationName("DefaultLogger");
    // Create pattern layout
    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
                            .addAttribute("pattern", pattern);
    AppenderComponentBuilder appenderBuilder = builder.newAppender("Console", "CONSOLE")
                    .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
    appenderBuilder.add(layoutBuilder);
    builder.add(appenderBuilder);
    RootLoggerComponentBuilder rootLogger
                    = builder.newRootLogger(Level.DEBUG);
    rootLogger.add(builder.newAppenderRef("Console"));
    
    builder.add(rootLogger);
    Configurator.initialize(builder.build());
    Configurator.reconfigure(builder.build());
    
    //RollingFileAppender Programmatic configuration log4j2:
    
    CdasLogger() {
        // CreateLogger takes a path for each logger from config file
        loadLog = createLogger("load.log");
        updateLog = createLogger("update.log");
        userLog = createLogger("user.log");
    }
    
    private Logger createLogger(String logType) {
    
        String pattern = "%d %M - %m%n";
        String consolePattern = "%d{DATE} [%p|%C{2}] %m%n";
        String fileLogName = "/app/app.log";
        String filePattern = "/app/app.log-%d{MM-dd-yy}.log.gz";
        System.out.println("logtype is::" + logType);
        String path = ConfigReader.getStringValue(logType);
        System.out.println(path);
        String daily = "0 0 12 1/1 * ? *";
        // Initializing the logger context
        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        ConfigurationBuilder<BuiltConfiguration> builder = 
                ConfigurationBuilderFactory.newConfigurationBuilder();
    
    
        builder.setConfigurationName("rollingFileLogger");
        //specifying the pattern layout
        LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
                    .addAttribute("pattern", pattern);
        //specifying the policy for rolling file
        ComponentBuilder triggeringPolicy = builder.newComponent("Policies")                 
    .   addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "10MB"));
    
    //create a rollingfile appender
    AppenderComponentBuilder appenderBuilder = builder.newAppender("rollingFile", "RollingFile")
                    .addAttribute("fileName", path)
                    .addAttribute("filePattern", path+"-%d{MM-dd-yy-HH-mm-ss}.log.")
                    .add(layoutBuilder)
                    .addComponent(triggeringPolicy);
    
    builder.add(appenderBuilder);
    RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.TRACE);
    rootLogger.add(builder.newAppenderRef("rollingFile"));
    builder.add(rootLogger);
    
    ctx = Configurator.initialize(builder.build());
    Configurator.reconfigure(builder.build());
    
    return ctx.getLogger(logType); // return the logger to the caller
}

Console Appender gets initialized first and the logs are written. After Initializing the rollingfileappender. All the logs are getting written to rollingfile Appender. There are no logs to consoleAppender once the rollingfile appender is initalized.

EDIT 1:

As per Piotr comments, I made the below change to have same configuration builder for all the appenders.

 private void configureLogger() {
        ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();

        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        // create a console appender
        AppenderComponentBuilder console
            = builder.newAppender("stdout", "Console").addAttribute("target",
                    ConsoleAppender.Target.SYSTEM_OUT);


        console.add(builder.newLayout("PatternLayout").addAttribute("pattern",
                "%d{DATE} [%p|%C{2}] %m%n"));

        RootLoggerComponentBuilder rootLogger
            = builder.newRootLogger(Level.DEBUG);
        rootLogger.add(builder.newAppenderRef("stdout"));

        builder.add(console);

        // create a rolling file appender

        String pattern = "%d %M - %m%n";
        
        //specifying the pattern layout
        LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
                    .addAttribute("pattern", pattern);
        //specifying the policy for rolling file
        ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
                   .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "10MB"));

        String[] logTypes = {"load.log", "update.log", "user.log"};

        for (String logType : logTypes) {
            System.out.println("logtype is::" + logType);
            String path = ConfigReader.getStringValue(logType);
            System.out.println(path);
            AppenderComponentBuilder appenderBuilder = builder.newAppender(logType, "RollingFile")
                        .addAttribute("fileName", path == null ? "/app1/app.log" : path)
                        .addAttribute("filePattern", path == null ? "/app1/app.log" : path+"-%d{MM-dd-yy-HH-mm-ss}.log.")
                        .add(layoutBuilder)
                        .addComponent(triggeringPolicy);
        
            builder.add(appenderBuilder);
            rootLogger.add(builder.newAppenderRef(logType));
        }


        builder.add(rootLogger);
        Configurator.reconfigure(builder.build());

    }

The logs are not updating still.

calling configureLogger() method during app start up.

In another class I have the code below

public class CdasLogger {

    private final Logger updateLog, loadLog, userLog;
    CdasLogger() {
        loadLog = createLogger("load.log");
        updateLog = createLogger("update.log");
        userLog = createLogger("user.log");
    }
private Logger createLogger(String logType) {

    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    return ctx.getLogger(logType);
 }
}
Piotr P. Karwasz
  • 12,857
  • 3
  • 20
  • 43
sandeep
  • 11
  • 6
  • You are creating multiple `Configuration` objects and replacing the previous one multiple times with `Configurator.reconfigure`. Use a single `ConfigurationBuilder` for all 4 appenders. – Piotr P. Karwasz Feb 12 '22 at 05:41
  • @PiotrP.Karwasz: I have consoleAppender in one file and RollingFileAppender in another file. If I just gave Configurator.initialize(builder.build());. Logs are not getting written to either cosolelog or rollingfile. If I use reconfigure then its logging into rollingFileappender. Can you suggest what is the better way to write the logs into their respective logs. – sandeep Feb 12 '22 at 16:59
  • the problem is that you are not adding a `RollingFileAppender` to your configuration, but replacing the current configuration with one that contains **only** the `RollingFileAppender`. You need to add all the required appenders to the **same** `ConfigurationBuilder`. – Piotr P. Karwasz Feb 12 '22 at 20:40
  • @PiotrP.Karwasz: Can you give an example of how can I add all the appenders into same ConfigurationBuilder. we have appenders in 3 java files ( Two files have console appenders and one has RollingFileAppender for 3 loggers. Please help. Thanks in advance. – sandeep Feb 13 '22 at 03:40
  • @PiotrP.Karwasz: All three files are in different packages too. – sandeep Feb 13 '22 at 03:52
  • @PiotrP.Karwasz: I made the changes according to your suggestion. Still the logs are not being logged. Any pointers where I am missing? – sandeep Feb 15 '22 at 03:30
  • Your updated code seems correct. Maybe you have another software component that configures logging (Spring Boot?). Try running the application with `-Dlog4j2.debug=true` and check for any errors from the status logger (on stderr). – Piotr P. Karwasz Feb 15 '22 at 07:11

0 Answers0