SLF4J & Logback

홍당무·2023년 1월 30일
0

스프링에서 로깅하기

초기의 스프링은 JCL(Jakarta Commons Logging)을 사용해서 로깅을 구현했다. 요즘에는 대표적으로 Log4j 와 Logback 으로 스프링 부트의 로그 구현체를 사용한다. Log4j는 가장 오래된 프레임워크이며 Apache의 Java 기반 Logging Framewark다. xml, properties 파일로 로깅 환경을 구성하고 콘솔 및 파일 출력의 형태로 로깅을 할 수 있게 도와준다. 로그 레벨의 경우는 6단계로 구성되어 있다. Logback은 log4j 이후에 출시된 Java 기반 Logging Framework 중 하나로 가장 널리 사용되고 있다. SLF4J의 구현체이며 Spring Boot 환경이라면 별도의 Dependency 추가 없이 기본적으로 포함되어 있다.

Logging 구현체 선택하기

JCL을 사용하면 기본적인 인터페이스인 Log와 Log 객체 생성을 담당하는 LogFactory만 구현하면 언제든지 로깅 구현체 교체가 가능하니 선택은 자유롭다.

SLF4J는 JCL의 가진 문제를 해결하기 위해 클래스 로더 대신에 컴파일 시점에서 구현체를 선택하도록 변경시키기 위해 도입된 것이다. Logback은 LOG4J에 비해 향상된 필터링 정책, 기능, 로그 레벨 변경 등에 대해 서버를 재시작할 필요 없이 자동 리로딩을 지원한다는 장점이 있다.

로그 찍어보기

Java Class를 하나 만들어준다.

그 다음 localhost:8080/log 를 치고 들어간 뒤, 로그를 확인해보자

Info 레벨의 로그로 "LoggerController의 로그- 로깅 발생!"이 콘솔에 출력되는 것을 확인할 수 있다. 그렇다면 이렇게 콘솔에 출력된 로그를 파일로 남기는 방법을 알아보자.

로그 레벨 관련

Logback은 5단계의 로그 레벨을 가진다.

심각도 수준은 Error > Warn > Info > Debug > Trace 이다.

Error : 예상하지 못한 심각한 문제가 발생하는 경우, 즉시 조취를 취해야 할 수준의 레벨

Warn : 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리, 당장 서비스 운영에는 영향이 없지만 주의해야 할 부분

Info : 운영에 참고할만한 사항, 중요한 비즈니스 프로세스가 완료됨

Debug : 개발 단계에서 사용하며, SQL로깅을 할 수 있음

Trace : 모든 레벨에 대한 로깅이 추적되므로 개발 단계에서 사용함

Dubug와 Trace레벨은 많은 양의 로그가 쌓이므로 자칫 운영 단계에서 해당 레벨의 로깅을 할 경우 용량 감당이 안 될 수 있다. 그렇기 때문에 중요하지 않은 정보는 Debug 이하로 설정하고 로깅을 하지 않는 편이 좋다.

Debug, Trace 레벨의 로깅은 개발 단계에서만 사용하고 배포 단계에서는 사용하지 말자

Error Level Logging


위에 나온 두 개의 클래스 파일을 생성하고 SpringApplication을 실행한다. 그리고 localhost:8080/log에 접속하고 콘솔에 출력된 내용을 살려본다.

이를 통해, 로그는 별다른 설정을 하지 않아도 기본 설정된 로그 레벨(INFO)에 맞춰 상위 로그로 출력되는 것을 확인할 수 있다.

로그 파일 작성하기

콘솔 로그의 수준을 변경하는 방법은 application.yml과 logback-spring.xml에서 설정하는 방법이 있다. application.yml은 설정 난이도가 비교적 쉬우나, 실제 제품에 사용하기엔 한계가 있고 세부적인 설정이 불편하기 때문에 logback-spring.xml로 관리하는 편이 더 좋다고 생각한다. 따라서 logback-spring.xml로 로그를 기록해보자.

logback-spring.xml은 콘솔, 파일, DB등 로그를 출력하는 방법을 지정하는 appender와 출력할 곳을 정하는 logger로 나눌 수 있다. 아래 예시를 통해 간단하게 로그를 남기는 연습을 해보자.

경로는 src/main/resources/logback-spring.xml 이다. 해당 예시문은 특정 클래스에서 발생한 특정 레벨의 예외를 기록하는 방법과 특정 라이브러리의 기능을 기록하는 방법에 대한 예시를 다룰 것이다.

1. configuration 설정을 시작한다.

2. appender(어디에 출력할 지)에서 콘솔에 출력되는 형식을 지정한다.

3. Info 레벨의 이름을 가진 로그를 저장할 방식을 지정한다.

INFO_LOG라는 변수명에 여러가지 설정을 한다. 우선 파일을 저장할 경로와 파일명을 지정한다. INFO level의 에러만 기록한다. 기록한 로그를 pattern에서 지정한 방식대로 인코딩한다. 인코딩한 로그기록을 앞서 지정한 파일명에 기록하는 것이다.

파일의 크기가 100MB 혹은 180일이 넘을 경우 앞서 인코딩한 파일을 fileNamePattern에 맞게 .gz로 따로 저장한다는 설정이다. 비슷한 방식으로 WARN_LOG도 만들어 준다.

4. Info level의 로그를 콘솔에 출력한다.

5. 로거가 발생될 때, 설정해둔 대상을 파일에 기록한다.

LogController라는 이름의 로거가 발생할 때 아래 조건을 실행한다. Debug 이상의 레벨에 대해서 각각 , 의 변수에 할당해둔 명령이 실행된다.

6. 예외에 나온 내용 외에도 콘솔에 특정 단어를 감지해 처리할 수 있다.

[2021-08-07 20:03:15:5723][SpringApplicationShutdownHook] DEBUG org.hibernate.SQL - drop table if exists user CASCADE

다음과 같이 출력되는 콘솔 로그를 감지하려면 아래처럼 하면 로그를 쌓을 수 있게 되는 것이다.

7. 위에서 한 모든 작업을 한 파일로 만들면 다음과 같다.

이제 springApplication을 실행 후 접속 등의 다양한 활동을 한 다음 지정해둔 경로(./logs/)에 생성된 로그 파일을 확인해 볼 수 있다.

Referense

https://tecoble.techcourse.co.kr/post/2021-08-07-logback-tutorial/

profile
공부하는 백엔드 개발자

0개의 댓글