Spring boot에서의 logback 설정
Spring boot에서는 logback위치를 java-resource의 위치에 있는 logback.xml 위치를 보고 log 위치를 지정합니다.
그러나 이렇게 진행하는 경우 ${LOG_PATH}와 같은 변수가 들어가 있는 경우, 이를 인식하지 못하는 현상이 발생합니다.
<property name="LOG_PATH" value="${log.config.packagename}"/>
물론 이런식으로 logback.xml의 옵션으로 LOG_PATH를 지정할 수 있습니다.
그렇지만, 만약에 LOG_PATH를 특정 파일의 값으로 읽어와 지정하는 경우에는 해당 방식을 사용할 수 없습니다.
그래서 다음과 같은 방식으로 LOG_PATH에 대한 값을 소스코드로 입력할 수 있습니다.
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.putProperty("LOG_PATH", Paths.get(LOG_PATH).toAbsolutePath().normalize().toString());
해당 방식으로 logback을 구현하고, Spring boot 프로젝트를 지정하여 실행하게 된다면
log 폴더와 함께 LOG_PATH_IS_UNDEFIND라는 폴더도 동시에 생성될 것입니다.
LOG_PATH_IS_UNDEFIND이라는 폴더는 logback에 지정한 ${LOG_PATH}의 값을 가져오지 못하여 만들어지는 log 폴더입니다.
해당 문제가 왜 발생을 했느냐? 라고 의문을 가지고 테스트를 진행한 결과 다음과 같은 결론을 얻게 되었습니다.
1. logback을 활용하여 log폴더를 만듬
2. Spring boot가 실행됨
3. Spring boot의 의존성 주입이 이루어짐
4. 의존성 주입이 이루어지는 과정 중에 logback을 활용하여 log 폴더를 만듬
다음과 같이 진행되어. 4번의 과정에서 logback을 활용하여 log폴더를 만드는 과정에서 ${LOG_PATH}의 값을 가져오지 못하여 발생한 현상이였습니다.
다음과 같은 방식의 문제를 해결하기 위하여 Spring boot의 어노테이션을 활용하였습니다.
implements ApplicationRunner을 활용하여 의존성 주입이 이루어지고 나서, 해당 어노테이션이 붙은 함수를 실행시킬 수 있습니다.
@Component
public class logService implements ApplicationRunner {
}
다음과 같은 방법으로 작성하게 된다면, 의존성 주입이 마무리 된 이후에 logback의 변수명에 값을 선언해줄 수 있습니다.
다른 방법으로는 동적으로 log를 만드는 방법이 있습니다.
Main문에 여러가지 함수들을 지정하고 싶지 않았던 저는 다른 방법이 없을까 찾아보던 와중, '정적으로 log를 만드는게 아니라 동적으로 log를 만들면 되지 않을까?' 라는 생각을 하게 되었습니다.
말 그대로, logback.xml 폴더 없이 logback.xml처럼 만들어 log를 실행시키는 방법입니다.
public static void setLog(){
Logger logger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
PatternLayout patternLayout = new PatternLayout();
patternLayout.setContext(loggerContext);
patternLayout.setPattern(PATTERN);
patternLayout.start();
// Create and configure the encoder
LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<>();
encoder.setContext(loggerContext);
encoder.setLayout(patternLayout);
encoder.setCharset(StandardCharsets.UTF_8);
encoder.start();
// Create and configure the console appender
ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<>();
consoleAppender.setContext(loggerContext);
consoleAppender.setEncoder(encoder);
consoleAppender.start();
}
다음과 같은 방법으로 소스코드를 작성하게 되면, 특정 log를 logback.xml이라는 파일 없이 생성할 수 있습니다.