로그를 작성하기 위해서 자주 사용하는 로그백의 대한 내용을 정리하려고 합니다.
처음에는 하나의 글로 정리하면서 작성을 하였는데 내용이 커지면서 나중에 찾아보기 쉽게 구성하기 위해서 아래와 같이 목차를 나눠서 정리를 하였습니다.
- [Logback] 1.SpringBoot에서 Logback 사용하기 - 주의점, 구성, 상속, 파라미터 처리
- [Logback] 2.SpringBoot에서 Logback 사용하기 - 환경설정 파일
- [Logback] 3.SpringBoot에서 Logback 사용하기 - Appender와 Policy
- [Logback] 4.SpringBoot에서 Logback 사용하기 - Encoder
- [Logback] 5.SpringBoot에서 Logback 사용하기 - MDC
- [Logback] 6.SpringBoot에서 Logback 사용하기 - Filter
- [Logback] 7.SpringBoot에서 Logback 사용하기 - 웹 어플리케이션 구성
해당 내용은 로그를 사용하면 주의할 점에 대해서 알아보고 로그백을 구성하기 위한 방법과 로그 상속, 로그 파라미터 처리에 대해서 알아보도록 하겠습니다.
로그 사용시 주의할 점
- Avoid side effects
- logging으로 인해 애플리케이션 기능의 동작에 영향을 미치지 않아야 합니다.
- 예를 들어 logging하는 시점에 NullPointerException이 발생해 프로그램이 정상적으로 동작하지 않는 상황이 발생하면 안됩니다.
- Be concise and descriptive
- 각 Logging에는 데이터와 설명이 모두 포함되어야 합니다.
- Log method arguments and return values
- 메소드의 input과 output을 로그로 남기면 debugger를 사용해 디버깅하지 않아도 됩니다. 특히 debugger를 사용할 수 없는 상황에서는 상당히 유용하게 사용할 수 있습니다.
- 이를 구현하려면 메소드 앞 부분과 뒷 부분에 지저분한 중복 코드가 계속해서 발생하는 상황이 발생하는데 이는 AOP를 통해 해결할 수 있습니다.
- Delete personal information
- 로그에 사용자의 전화번호, 계좌번호, 패스워드, 주소, 전화번호와 같은 개인정보를 남기지 않습니다.
스프링 부트에서 로그백 구성
log4j 이후에 출시된 Java 기반 Logging Framework 중 하나로 가장 널리 사용되고 있습니다.
Spring Boot 환경에서 사용하려면 아래 dependency를 추가하면 로그백이 포함되어 있습니다. Spring에서 Reactive
와 Web
으로 분리되어 있기 때문에 둘 중에 하나를 선택하면 됩니다.
Reactive
implementation 'org.springframework.boot:spring-boot-starter-webflux'
Web
implementation 'org.springframework.boot:spring-boot-starter-web'
로그백 구성 모듈
로그백은 3개의 모듈로 나뉘어집니다.
- logback-core
logback-classic
,logback-access
두 모듈의 기반 역할을 담당하며,appender
,layout
인터페이스가 이 모듈에 속해 있습니다.
- logback-classic
- SLF4J API를 구현하여 log4j 또는 java.util.logging(JUL)과 같은 다른 로깅 프레임워크 간에 쉽게 전환 가능하도록 하며,
Logger
클래스가 이 모듈에 속해 있습니다.
- SLF4J API를 구현하여 log4j 또는 java.util.logging(JUL)과 같은 다른 로깅 프레임워크 간에 쉽게 전환 가능하도록 하며,
- logback-access
- Tomcat 및 Jetty 등 Servlet 컨테이너에 HTTP Access 로그 기능을 제공합니다.
상위 로거의 상속
모든 로거가 루트 로거를 상속받을 수 있도록 기본 설정이 되어 있습니다.
- Logger Level :
INFO
로거 상속에 대해서 케이스를 나눠보면 다음과 같습니다.
- 루트 로거 설정으로 인한 모든 하위 로거 상속
- 루트 로거와 다른 로그 레벨 설정인 상위 로거 상속
- 루트 로거 미설정으로 인한 상위 로거 상속
각 케이스에 대하여 예시를 보면서 이해해보도록 하겠습니다.
X
, X.Y
, X.Y.Z
로거는 설정된 로그가 없기 때문에 루트 로거를 상속 받게 됩니다.
로거 이름 | 설정된 로그 레벨 | 영향받은 로그 레벨 |
---|---|---|
root | DEBUG | DEBUG |
X | none | DEBUG |
X.Y | none | DEBUG |
X.Y.Z | none | DEBUG |
로거가 설정된 X
, X.Y.Z
를 제외한 X.Y
는 상위 로거인 X
의 로거를 상속 받게 됩니다.
로거 이름 | 설정된 로그 레벨 | 영향받은 로그 레벨 |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | none | INFO |
X.Y.Z | ERROR | ERROR |
루트 로거가 OFF
인 경우 상위 로거의 영향을 게 됩니다.
로거 이름 | 설정된 로그 레벨 | 영향받은 로그 레벨 |
---|---|---|
root | OFF | OFF |
X | INFO | INFO |
X.Y | none | INFO |
X.Y.Z | ERROR | ERROR |
출력 메소드와 규칙
로거의 레벨은 다음과 같습니다. TRACE
로 갈수록 더 많은 양의 로그를 포함하고 있습니다. 로그백에서는 FATAL
레벨은 없으며 ERROR
에 포함되어 있습니다.
TRACE > DEBUG > INFO > WARN > ERROR
Level of Reuqest | TRACE | DEBUG | INFO | WARN | ERROR | OFF |
---|---|---|---|---|---|---|
TRACE | YES | NO | NO | NO | NO | NO |
DEBUG | YES | YES | NO | NO | NO | NO |
INFO | YES | YES | YES | NO | NO | NO |
WARN | YES | YES | YES | YES | NO | NO |
ERROR | YES | YES | YES | YES | YES | NO |
- 기본 로그 레벨이
INFO
이라면 요청할 수 있는 로그 레벨은 다음과 같습니다.INFO
,WARN
,ERROR
- 기본 로그 레벨이
WARN
이라면 요청할 수 있는 로그 레벨은 다음과 같습니다.WARN
,ERROR
로깅에서 파라미터 출력
로그백에서는 input과 output을 로그로 남기기 위해서 추천하는 방식을 가이드하고 있습니다. 그전에 추천하지 않는 방식은 어떤 것인지 확인을 해보겠습니다.
추천하지 않는 방식
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
위의 로그를 처리하는 순서는 다음과 같습니다.
- 매개변수 생성 비용 발생
- i와 문자열 변환(
String.valueOf(entry[i])
) 의 대한 문자열 연결 및 출력 구성
- i와 문자열 변환(
- 로깅 레벨을 판단
매개변수 생성하는데 비용을 발생한 다음 로깅 레벨을 판단하기 때문에 불필요한 리소스가 낭비되게 됩니다.
추천하는 방식
Object entry = new SomeObject(); logger.debug("The entry is {}.", entry);
위의 로그를 처리하는 순서는 다음과 같습니다.
- 로깅 레벨을 판단
- 매개변수 생성 비용
object
출력 처리
- 파라미터를
{}
항목의 문자열 값으로 변경
로깅 레벨을 먼저 판단하기 때문에 매개변수를 생성하는데 비용의 대한 낭비가 생기지 않습니다.
정리
- 스프링 부트에서 로그백을 사용하기 위해서는 Starter 모듈에
Reactive
또는Web
을 사용하면 됩니다. - 모든 로거는 루트 로거를 상속 받으며, 루트 로거가 설정되어 있지 않다면 상위 로거를 상속받는다.
- 로그에서 파라미터를 출력하기 위해서는 추천하는 방식으로 처리해야 합니다.
다음 시간에는 logback.xml
환경설정 파일과 관련된 구성에 대해서 알아보도록 하겠습니다.
참고 자료
'프로그래밍이야기 > Log' 카테고리의 다른 글
[Logback] 6.SpringBoot에서 Logback 사용하기 - Filter (0) | 2022.05.29 |
---|---|
[Logback] 5.SpringBoot에서 Logback 사용하기 - MDC (0) | 2022.05.29 |
[Logback] 4.SpringBoot에서 Logback 사용하기 - Encoder (0) | 2022.05.29 |
[Logback] 3.SpringBoot에서 Logback 사용하기 - Appender와 Policy (0) | 2022.05.29 |
[Logback] 2.SpringBoot에서 Logback 사용하기 - 환경설정 파일 (0) | 2022.05.29 |
댓글