Search code examples
javaloggingweblogiclogback

TimeBasedRollingPolicy logback programmatically


I want to configure logback TimeBasedRollingPolicy programmatically but it does not create my log file in routed folder. here is my code which call the logger creator class:

    CreateLogger LoggerClass=new CreateLogger();
        private final Logger logger = loggerClass.createLoggerFor("foo", "D:\\logback/testLogback.log");
logger.debug("11111");

D:\logback/testLogback.log is the main log file. here is LoggerCreator class:

public class CreateLogger {
    public Logger createLoggerFor(String string, String file) {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        PatternLayoutEncoder ple = new PatternLayoutEncoder();
    ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
    ple.setContext(lc);
    ple.start();
    FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
    fileAppender.setFile(file);
    fileAppender.setEncoder(ple);
    fileAppender.setContext(lc);
    fileAppender.start();

    RollingFileAppender logFileAppender = new RollingFileAppender();
    logFileAppender.setContext(lc);
    logFileAppender.setName("debug");
    logFileAppender.setEncoder(ple);
    logFileAppender.setAppend(true);
    logFileAppender.setFile(file);
    TimeBasedRollingPolicy logFilePolicy = new TimeBasedRollingPolicy();
    logFilePolicy.setContext(lc);
    logFilePolicy.setParent(logFileAppender);
    logFilePolicy.setFileNamePattern("D:\\logback/archived/testLogBack.%d{yyyy-MM-dd}.%i.log");
    logFilePolicy.setMaxHistory(7);
    logFilePolicy.start();

    logFileAppender.setRollingPolicy(logFilePolicy);
    logFileAppender.start();
    Logger logger = (Logger) LoggerFactory.getLogger(string);
    logger.addAppender(fileAppender);
    logger.setLevel(Level.DEBUG);
    logger.setAdditive(false); 


    logger.addAppender(logFileAppender);

    return logger;
}

}

archived files should be in this path using mentioned pattern name: D:\logback/archived/testLogBack.%d{yyyy-MM-dd}.%i.log"

my problem is the created logs are added to main log file and not separated base on date.

I can also see these lines in console:

14:44:16,864 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@15:83 - no applicable action for [rollingPolicy], current ElementPath  is [[configuration][appender][rollingPolicy]]
14:44:16,864 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@17:30 - no applicable action for [fileNamePattern], current ElementPath  is [[configuration][appender][rollingPolicy][fileNamePattern]]

my application server is weblogic 12c


Solution

  • I solved it by myself as below:

    PatternLayoutEncoder logEncoder = new PatternLayoutEncoder();
                logEncoder.setContext(logCtx);
                logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %-5level - %msg%n");
                logEncoder.start();
    
                ConsoleAppender logConsoleAppender = new ConsoleAppender();
                logConsoleAppender.setContext(logCtx);
                logConsoleAppender.setName("console");
                logConsoleAppender.setEncoder(logEncoder);
                logConsoleAppender.start();
    
                logEncoder = new PatternLayoutEncoder();
                logEncoder.setContext(logCtx);
                logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %-5level - %msg%n");
                logEncoder.start();
    
                RollingFileAppender logFileAppender = new RollingFileAppender();
                logFileAppender.setContext(logCtx);
                logFileAppender.setName("logFile");
                logFileAppender.setEncoder(logEncoder);
                logFileAppender.setAppend(true);
                logFileAppender.setFile("logs/logfile.log");
    
                TimeBasedRollingPolicy logFilePolicy = new TimeBasedRollingPolicy();
                logFilePolicy.setContext(logCtx);
                logFilePolicy.setParent(logFileAppender);
                logFilePolicy.setFileNamePattern("logs/archived/logfile-%d{yyyy-MM-dd_HH}.log.zip");
                logFilePolicy.setMaxHistory(7);
                logFilePolicy.start();
    
                logFileAppender.setRollingPolicy(logFilePolicy);
                logFileAppender.start();
    
                Logger log = logCtx.getLogger("Main");
                log.setAdditive(false);
                log.setLevel(Level.INFO);
                log.addAppender(logConsoleAppender);
                log.addAppender(logFileAppender);
    
                return log;
    

    I also activated prefer-application-packages and prefer-application-resources in weblogic-application.xml.

    Hope it would helps others