본문 바로가기
dev/java

JAVA로 동적 logback 설정하기

by NCJ 2023. 6. 12.
728x90
반응형
SMALL

안녕하세요. 

이번 데몬 프로젝트를 진행하면서 로그를 데몬별로 별도 파일로 로그를 뽑아내야하는 경우가 생겼습니다. 

하나의 jar 파일에 설정만 다른게 여려개를 올려야 하는 경우가 발생하여 기존 XML방식의 logback설정이 아닌 

동적으로 설정할 수 있도록 변경했습니다. 

 

setLogger에 본인이 원하는 파라미터를 추가하여 설정을 변경 할 수 있습니다.

- 파일이름, 패턴 다른 설정들을 변경하여 같은 데몬을 돌리지만 서로 다른 logback 설정을 하여 

경로, 내용, 레벨 등 다른 환경에서 구동할 수 있도록 합니다. 

private static void setLogger(){
    String dir = System.getProperty("user.dir"); // 현재 데몬 위치
    // 로그 경로 property 추가 
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    loggerContext.putProperty("LOG_DIR", String.format("%s/LOG/", dir));
    String logDir = loggerContext.getProperty("LOG_DIR");
    
    //최상위 ROOT logger에 설정
    ch.qos.logback.classic.Logger log = loggerContext.getLogger("ROOT");
    LoggerContext context = log.getLoggerContext();

    // 시간이 지나 날짜별로 만들기 위해 설정
    TimeBasedRollingPolicy<ILoggingEvent> policy = new TimeBasedRollingPolicy<>();
    policy.setFileNamePattern(OptionHelper.substVars(
            logDir + "history/sms.%d{yyyy-MM-dd}.log", context));
    policy.setMaxHistory(30); // 최대 30일까지 로그 파일
    policy.setContext(context);

    // 로그작성 패턴
    PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    encoder.setContext(context);
    encoder.setPattern("%d{yyyy.MM.dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%class{36}] - %msg%n");
    
    RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
    appender.setContext(context);
    appender.setName("echo_log");
    appender.setFile(OptionHelper.substVars(logDir + "/echo_log.log", context));
    appender.setAppend(true);

    appender.setPrudent(false);
    appender.setRollingPolicy(policy);
    appender.setEncoder(encoder);
    policy.setParent(appender);

    policy.start();
    encoder.start();
    appender.start();

    log.setLevel(Level.INFO);
    log.setAdditive(true);
    log.addAppender(appender);
    logger.info(">>> LOG DIR :::  [{}]", logDir);
}

 

728x90
반응형
LIST