user1110977
user1110977

Reputation: 170

logback add appendar Programmatically

i want to logappendar Programmatically , but this code is not correcty work

this is my configuration code...

public enum Logger {
    INSTANCE;

    Logger logger;
    LoggerContext loggerContext;

    public final String CONSOLE_APPENDER_NAME="CONSOLE_";
    public final String FILE_APPENDER_NAME="FILE_";
    public final String LOGGER_NAME="LOGGER";
    public final String LOG_FILE_NAME="log.log";

    Logger(){
        loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

        String patternRf = "%d{HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n";
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setPattern(patternRf);
        encoder.setContext(loggerContext);
        encoder.start();

        ConsoleAppender<ILoggingEvent> soutAppender = new ConsoleAppender<ILoggingEvent>();
        soutAppender.setName(CONSOLE_APPENDER_NAME);
        soutAppender.setEncoder(encoder);

        loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).detachAndStopAllAppenders();
        logger = loggerContext.getLogger(LOGGER_NAME);
        logger.detachAndStopAllAppenders();


        IPath logDirPath = new Path("/log");
        File logDir = new File(logDirPath.toOSString());
        if(!logDir.exists()){
            logDir.mkdir();
        }
        RollingFileAppender<ILoggingEvent> rfAppender = rollingFileLog(logDirPath, loggerContext, encoder);

        rfAppender.start();
        soutAppender.start();

        logger.addAppender(soutAppender);
        logger.addAppender(rfAppender);

    }

    private RollingFileAppender<ILoggingEvent> rollingFileLog(IPath logDirPath, LoggerContext loggerContext, PatternLayoutEncoder encoder) {
        RollingFileAppender<ILoggingEvent> logFileAppender = new RollingFileAppender<ILoggingEvent>();
        logFileAppender.setContext(loggerContext);
        logFileAppender.setName(FILE_APPENDER_NAME);
        logFileAppender.setEncoder(encoder);
        logFileAppender.setAppend(true);
        logFileAppender.setFile(logDirPath.append(LOG_FILE_NAME).toOSString());

        TimeBasedRollingPolicy<ILoggingEvent> logFilePolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
        logFilePolicy.setContext(loggerContext);
        logFilePolicy.setParent(logFileAppender);
        logFilePolicy.setFileNamePattern("./log/%d{yyyy,aux}/%d{MM,aux}/%d{dd,aux}/service_rolling.log.%d{yyyy-MM-dd_hhmmss}");
        logFilePolicy.setMaxHistory(7);
        logFilePolicy.start();

        logFileAppender.setRollingPolicy(logFilePolicy);

        return logFileAppender;
    }   

    public void debug(String msg){
        logger.debug(msg);
    }



}

and this is my test code

public class test {
    public static void main(String[] args) {
        Logger.INSTANCE.debug("a");
        Logger.INSTANCE.debug("b");
        Logger.INSTANCE.debug("c");
        Logger.INSTANCE.debug("d");
        Logger.INSTANCE.debug("e");
        Logger.INSTANCE.debug("f");
        Logger.INSTANCE.debug("g");
        Logger.INSTANCE.debug("h");

    }
}

after test my console wrriten this message 11:14:53 DEBUG [Thread-1] LOGGER - a

and my log file wrriten this messages

11:14:53 DEBUG [Thread-1] LOGGER - a
11:14:53 DEBUG [Thread-1] LOGGER - b
11:14:53 DEBUG [Thread-1] LOGGER - b
11:14:53 DEBUG [Thread-1] LOGGER - c
11:14:53 DEBUG [Thread-1] LOGGER - c
11:14:53 DEBUG [Thread-1] LOGGER - d
11:14:53 DEBUG [Thread-1] LOGGER - d
11:14:53 DEBUG [Thread-1] LOGGER - e
11:14:53 DEBUG [Thread-1] LOGGER - e
11:14:53 DEBUG [Thread-1] LOGGER - f
.....

i think first log is writen to console

and others is writen to file

what's this program's problem..

thanks

Upvotes: 1

Views: 405

Answers (1)

Kulu Limpa
Kulu Limpa

Reputation: 3541

I couldn't fully reproduce this behavior: Taking your code (and making it compile) either wrote everything (twice) to file, or everything (twice) to console, but not the first statement to console and all subsequent to file.

However, the problem with your code is that, apparently, you cannot share encoders. If you set the same encoder to the file appender and the console appender, everything gets written either to file, or to console. Try creating a second Encoder instance (you can use the same configuration) for your file appender.

By the way: Instead of

loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).detachAndStopAllAppenders();

you could also use

loggerContext.reset();

which, I think, should have the same effect.

Upvotes: 1

Related Questions