개요
log4j 이후에 출시된 Java 기반 Logging Framework 중 하나로 SLF4j 의 구현체이고
Spring Boot 라면 기본적으로 포함되어 있다. log4j와 성능을 비교했을 때도 logback이 월등하다는 평가가 많다
사용방법
- .yml 또는 .properties파일에 프로필을 아래와 같이 설정해야 합니다.
- # 프로필 설정 spring.profiles.active=dev #spring.profiles.active=prod #루트 레벨(전체 레벨) 전체 로깅 레벨 지정 logging.level.root=info #profiles에 있는 이름으로 .xml사 logging.config=classpath:logback-${spring.profiles.active}.xml
- 프로필에 해당하는 .yml(.properties) 파일 생성 1번에서 dev로 설정을 했기 때문에 dev에 해당하는 .yml 또는 .properties 파일을 추가로 만들다 아래와 같이 logback-dev.properties 파일 생성
- #로그파일 경로 log.config.path=/logs/local #로그파일 이름 log.config.filename=local_log
- resources 밑에 logback-dev.xml 파일을 만들어서 참조 할 수 있게 한다.
- <?xml version="1.0" encoding="UTF-8"?> <!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 --> <configuration scan="true" scanPeriod="60 seconds"> <!-- 이 곳에 추가할 기능을 넣는다. --> </configuration>
logback-dev.xml 코드 작성
profile과 관련 코드
profile의 이름에 따라 어떤 resource를 참조하면 되는지 설정해둔 것으로 이 예시의 경우 dev로 설정 했으므로, 이전에 dev 전용으로 추가적으로 만든 logback-dev.properties를 찾도록 설정되어 있다.
<!--springProfile 태그를 사용하면 logback 설정파일에서 복수개의 프로파일을 설정할 수 있다.-->
<springProfile name="dev">
<property resource="logback-dev.properties"/>
</springProfile>
<springProfile name="prod">
<property resource="logback-prod.properties"/>
</springProfile>
property와 관련된 코드
<!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.-->
<springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/>
<!-- log file path -->
<property name="LOG_PATH" value="${log.config.path}"/>
<!-- log file name -->
<property name="LOG_FILE_NAME" value="${log.config.filename}"/>
<!-- err log file name -->
<property name="ERR_LOG_FILE_NAME" value="err_log"/>
<!-- pattern -->
<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>
1. .yml(.properties) 파일에 정의한 log level 혹은 dir(경로)를 설정할 수 있다.
위 경우 LOG_LEVEL로 .yml(.properties) 파일에 정의한 루트 레벨 로그 설정을 따라간다고 한 것이다.
2. logback-local.properties에서 설정해둔
log.config.path와 log.config.filename등을 property에 각각 담아둔다.
에러 로그 이름과 같이 XML 파일에서 바로 값을 기입할 수도 있다.
3. 로그 패턴을 설정해준다.
참고로 패턴에 사용되는 내용은 아래와 같다.
- %-5level : 로그 레벨, -5는 출력의 고정폭 값(5글자)
- %msg : - 로그 메시지 (=%message)
- ${PID:-} : 프로세스 아이디
- %d : 로그 기록시간
- %p : 로깅 레벨
- %F : 로깅이 발생한 프로그램 파일명
- %M : 로깅일 발생한 메소드의 명
- %l : 로깅이 발생한 호출지의 정보
- %L : 로깅이 발생한 호출지의 라인 수
- %thread : 현재 Thread 명
- %t : 로깅이 발생한 Thread 명
- %c : 로깅이 발생한 카테고리
- %C : 로깅이 발생한 클래스 명
- %m : 로그 메시지
- %n : 줄바꿈(new line)
- %% : %를 출력
- %r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)
아래처럼 console에 로그를 출력할 수도 있다.
<!-- 콘솔에 로그를 남기는 것 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 위에 PROPERTY로 정의한 LOG_PATTERN 가져다 사용하기 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
또 아래와 같이 로그를 설정해서 출력 할 수 있다.
<!-- File Appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 파일경로 설정 -->
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
<!-- 출력패턴 설정-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- Rolling 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 로그 파일을 압축 하고싶다면 .log 대신 .zip이나 .gz을 끝에 붙이면 된다 -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일당 최대 용량 kb, mb, gb -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>30</maxHistory>
<!--10개가 넘어가면 오래된순으로 덮어쓰여진다-->
<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>
</rollingPolicy>
</appender>
- 여기서 ROLLING 정책은 파일로 로그를 저장하게 될 경우 그 용량이 계속 늘어나기 때문에 적용하는 정책으로
- 압축할 것인지, 파일 당 최대 용량이 몇 인지, 몇일 후에 로그를 지울 것인지 설정할 수 있다.
- 10MB단위로 로그 압축 파일이 생성되고 Index에 설정한대로 (1 ~ 10)
- 10개가 넘어가면 오래 된 순으로 덮어 쓰여진다.
- 즉, 하루에 생길 수 있는 로그는 무조건 10mb이며 이를 초과하게 되면 오래된 로그부터 없어지는 것.
- 추가로 저장 된 지 30일 이 지난 로그는 자동 제거되는 것이다
에러 관련 파일 로그 출력은 위 파일 로그 출력과 그 포맷이 동일하다.
<!-- 에러의 경우 파일에 로그 처리 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- Rolling 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일당 최고 용량 kb, mb, gb -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>60</maxHistory>
</rollingPolicy>
</appender>
root레벨 설정
#루트 레벨(전체 레벨) 전체 logging 레벨 지정
</springproperty scope="context" name="LOG_LEVEL" source="logging.level.root">
아래 root레벨 설정에서 받아서
<!-- root레벨 설정 -->
<root level="${LOG_LEVEL}">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR"/>
</root>
root 레벨이 info 일 경우 아래 3가지
CONSOLE,FILE,ERROR등을 출력한다고 볼 수 있다.
- CONSOLE,FILE,ERROR는 각각 Appender의 이름으로 설정해둔 것이다.
그래서 만약 커스터마이징을 하여 console만 찍고 싶다면 아래와 같이 할 수 있을 것이다.
<!-- root레벨 설정 -->
<root level="${LOG_LEVEL}">
<appender-ref ref="CONSOLE"/>
<!-- <appender-ref ref="FILE"/> -->
<!-- <appender-ref ref="ERROR"/> -->
</root>
참고로 CASE 별 컴파일 순서는 다음과 같다.
- resources밑에 logback-spring.xml파일이 있으면 => logback-spring.xml 파일 적용
2) resources밑에 logback-spring.xml파일이 없으면 => .yml(.properties) 파일 적용
3) logback-spring.xml 파일과 .yml(.properties)파일 둘다 있으면 =>.yml(.properties) 파일을 먼저 적용 후 logback-spring.xml 파일 적용.
❗이렇게 로그를 파일에 저장할 때는 gitignore에 log 파일을 꼭 추가해주세요. 그렇지 않으면 불필요한 로그 파일들이 github에 올라가게 됩니다.
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
**/*.log # 추가 할 부분
참조 링크 : https://breakcoding.tistory.com/400, https://samori.tistory.com/69
'Spring boot > Spring boot library' 카테고리의 다른 글
Springboot 3.x에 swagger 적용 ( With. SpringDocs ) (0) | 2024.09.05 |
---|---|
Swagger, Springfox, Springdoc의 차이점 (1) | 2024.09.04 |
Spring Data JPA (0) | 2024.07.12 |
spring-boot-devtools (1) | 2024.07.11 |