이번에 개발한 프로젝트에 logback
을 적용해 각 환경별 (local, test, real) .xml
의 설정을 구성해 로그를 관리해보았다.
경험하고 학습한 내용을 정리해 보려한다.
필자가 이번에 개발한 프로젝트는 SpringBoot 3.3.2 버전으로 설정이 되어있다.
스프링 부트는 기본적으로 logback
로깅 프레임 워크를 지원한다.
트레픽이 많거나 처리가 많을 것 같은 프로젝트라면 성능이 더 좋다는 log4j2
를 사용하겠지만, 그 정도는 아니라서 logback
을 사용하기로 했다.
spring-boot-starter-web
라이브러리 내부에 내장되어 있어서 스프링 부트 프로젝트를 초기화할 때 넣어주면 자동으로 주입된다.
lombok
어노테이션도 함께 주입하면 아래와 같이 사용할 수 있다.
classpath 에 사용자 정의 logback
설정파일이 없을 경우
org.springframework.boot.logging.logback
경로에 내장된 기본 구성인 base.xml
을 사용한다.
<?xml version="1.0" encoding="UTF-8"?>
<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<included>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
필자는
로컬 환경 에서는 기본 구성을 사용하는 환경
개발 환경 에서는 기본 구성을 사용하되, 테스트(로그 파일저장 등) 를 위한 동적 변경 가능한 환경
운영 환경 에서는 로그 출력을 레벨에 따라 파일저장, 슬랙 봇을 사용한 슬랙 알람 기능 구현
위 목표들에 맞추어 설정을 하려한다.
필자의 프로젝트는 spring profiles
에 따라 로컬(local), 개발(test), 운영(real) 환경들의 설정들을 분리해 놓았다.
스프링 공식문서를 확인하니 친절하게 logback
설정도 profile 별 구성설정을 하는 방법이 나와있어 따라가보았다.
위처럼 클래스패스(resources/)에 logback-spring.xml
파일을 생성 후 각 환경별 틀? 을 잡아주고 로컬 환경 을 적용시켜 보았다.
로컬 환경: 기본 구성 사용 기본 구성을 사용하기 위해 스프링부트에 내장된 base.xml
을 include 하면 되지만
<include resource="org/springframework/boot/logging/logback/base.xml"/>
필요없는 FILE Appender 까지 설정되어서 그 부분은 빼고 가져왔다. (base.xml 을 include 할 경우 아래와같이 컴퓨터에 spring.log 가 생성된다.)
개발 환경 에서는 기본 구성을 사용하되, 테스트(로그 파일저장 등) 를 위한 동적 변경 가능한 환경 을 만들어야 한다.
개발 환경을 짬뽕이라고 표현할 수 있겠다.
기본 구성, 여러 파일에 나눠서 저장, 추후 운영에 반영될 Appender
테스트, ... 등등 여러 Appender
들이 추가되어야 한다.
위 처럼 개발 및 운영 환경 에 반영될 Appender
를 설정해 주었다.
(파일 롤링 Appender
)
이제, 가져다 사용하기만 하면 된다.
Appender
설정 부분을 보면 INFO
레벨 이상의 레벨들은 system-xxx.log 파일에 기록되고,
ERROR
레벨의 로그만 특별히 error-xxx.log 파일에 기록 되도록 설정해 두었다.
프로파일 을 test 로 설정하고 실행 시켜보자!
콘솔에도 잘 나오고, classPath
로 설정한 resources
하위 /logs
안 파일들이 생성되었다!
어라? 나는 분명 ${logDir}/system또는error-%d{MM-dd-yy}_%i.log
로 파일 이름을 설정했는데 적용되지 않았다.
찾아보니 <file></file>
속성과 같이 사용하면 충돌이 발생한다고 한다.
해당 속성을 제거해 주고 <proerty />
속성도 test 환경에서만 사용하니깐 아래와 같이 옮겨주었다.
다시 실행시켜 보면 아래와 같이 파일이 잘 생성되었다!
system-xxx.log 를 열어보면 스프링 부트 배너가 빠진채 기록된 걸 확인할 수 있을텐데 이 문제는 logback
이 초기화되기 전에 배너가 인쇄되므로 표시되지 않는다.
운영 환경 에서는 현재 로그 출력을 레벨에 따라 파일저장, 슬랙 봇을 사용한 슬랙 알람 기능 구현 을 사용하고 있다.
개발 환경 설정과 다른 점은 슬랙 연동 Appender
를 사용한다는 점인데 이 부분은 해당 포스트의 주제와 맞지않아 추후 포스팅 하겠다.
스프링 부트 프로젝트에 logback 설정을 하며 정리한 포스트이다.
다음엔 더욱더 복잡한 설정도 도전해 봐야겠다.