처음부터 차근차근
Logback 본문
Logback
로깅(logging)이란 애플리케이션이 동작하는 중에 시스템의 상태나 동작 정보를 서버측에 시간순으로 기록하는 것이다.
애플리케이션을 개발할 때(디버깅할 때나 에러가 난 원인을 분석 할 때) 큰 도움이 된다.
Logback은 로깅 프레임워크이다.
자바 개발에서 가장 많이 쓰이고 있으며, log4j 이후에 slf4j 기반으로 구현됐다.
log4j보다 성능면에서 뛰어나고, 스프링 부트의 spring-boot-starter-web 라이브러리 내부에 내장되어 있어서 별도로 의존성을 추가하지 않아도 사용할 수 있다.
Logback의 5개의 로그레벨
- ERROR : 로직 수행 중 시스템에 심각한 문제가 발생해서 애플리케이션이 동작 불가능한 경우
- WARN : 시스템의 에러 원인이 될 수 있는 경우(경고)
- INFO : 애플리케이션의 상태 변경 등 정보 전달을 위해 사용
- DEBUG : 애플리케이션의 디버깅을 위한 메세지를 표시함
- TRACE : DEBUG보다 더 상세한 메세지 표시
더 상세한 로그레벨은 아파치 Log4j 공식문서의 Level 탭에 있다.
https://logging.apache.org/log4j/1.2/apidocs/index.html
Logback의 특징
1. 실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨 설정해서 로그를 확인할 수 있다.
2. Logback의 설정 파일을 일정 시간마다 스캔해서 애플리케이션을 재가동하지 않아도 설정을 변경할 수 있다.
3. 별도의 프로그램 지원없이 자체적으로 로그 파일을 압축할 수 있다.
4. 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리 할 수 있다.
실습
1. resources / logback-spring.xml을 생성한다.
일반적인 자바나 스프링 프로젝트에는 logback.xml이라는 이름으로 참조하지만
스프링 부트에서는 logback-spring.xml이라는 이름으로 설정 파일을 참조하기 때문에 반드시 이 이름으로 생성해야한다.
logback-spring.xml 내용
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console_log" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyyMMdd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console_log" />
</root>
</configuration>
logback 설정파일 용어 설명
logback-spring.xml(설명용)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--console 출력 방법 예시-->
<appender name="console_log" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>[%d{yyyyMMdd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<!--file 출력 방법 예시-->
<appender name="file_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>./application_log/application.log</file>
<encoder>
<pattern>[%d{yyyyMMdd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>application.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="console_log" />
<appender-ref ref="file_log" />
</root>
</configuration>
<file> : 로그파일의 경로를 설정
<encoder> : 로그의 패턴을 설정
<filter> : 로그를 필터링함
ThresholdFilter는 발생한 로그의 이벤트가 지정한 level 보다 높거나 같으면 받고(FilterReply.NEUTRAL 반환), 낮으면 필터링한다. --> https://logback.qos.ch/apidocs/ch/qos/logback/classic/filter/ThresholdFilter.html
<rollingPolicy> :
Logback 설정파일의 구조
- appender : 로그를 어디에 어떻게 출력할지 설정
- logger : 해당 로거가 사용될 패키지와 로그레벨을 지정
- root : 로깅 레벨을 설정
appender
appender은 interface이고 하위에 여러 구현체가 존재한다.
appender의 대표적인 구현체
- ConsoleAppender : 콘솔에 로그 출력
- FileAppender : 파일에 로그 저장
- RollingFileAppender : 여러 개의 파일을 순회하면서 로그를 저장
- SMTPAppender : 메일로 로그를 전송
- DBAppender : 데이터베이스에 로그를 저장
pattern 상세설명
<pattern>[%d{yyyyMMdd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
%d : 로그 시간
%-5level : 로그 레벨. -5는 출력 고정폭 값
%thread : 현재 스레드명
%logger : 로거의 이름
%msg : 로그 메시지
%n : 줄바꿈
logger
logback-spring.xml 에서 사용되진 않았지만 중요한 내용이라 추가했다.
로깅 레벨을 설정할 때 root 대신 logger를 사용할 수 있다.(둘 다 사용하는 것도 가능)
<root level="info">
<appender-ref ref="file_log" />
</root>
대신
<logger name="로깅이 적용될 범위(패키지) 예시:com.ksy.notice.controller" level="info" additivity="false">
<appender-ref ref="file_log" />
</logger>
additivity : 지정한 패키지 범위 내에서 하위 패키지를 포함할지 여부를 결정한다.
기본값은 true이고, true면 하위 패키지를 모두 포함한다는 뜻이다.
이 값을 사용하는 이유는 아래의 글에 잘 나와있다.
https://aircook.tistory.com/entry/log4j%EC%9D%98-additivity-%EC%98%B5%EC%85%98
두 개의 logger가 같은 appender을 사용한다면 같은 메시지가 두 번 찍힌다.
이때 additivity="false"를 하면 로깅메시지가 중복되는 것을 막아준다.
2. Logback을 적용한다.
logback을 사용할 class로 가서 logger변수를 선언한다.
필자는 controller에다 선언했다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class BoardController {
...
private final Logger LOGGER = LoggerFactory.getLogger(BoardController.class);
...
}
그 다음 LOGGER 변수를 사용해 로그를 출력한다.
@GetMapping("/main")
public String home() {
LOGGER.info("home() 메서드 호출");
return "home";
}
결과
[20220908 19:43:56.056] [INFO ] [http-nio-8080-exec-7] com.ksy.noticeboard.controller.BoardController home() 메서드 호출
/main 으로 들어가면 위와 같은 로그가 찍히는 것을 볼 수 있다.
로그 색상 수정
2022.06.22 - [Framework/Spring] - 로그 색상 수정
참고한 글 : https://oingdaddy.tistory.com/78
'Framework > Spring' 카테고리의 다른 글
@DeleteMapping과 @PutMapping (1) | 2022.05.24 |
---|---|
Swagger (0) | 2022.05.06 |
profile이용해서 bean 선택하여 사용하기 (0) | 2021.10.02 |
evn객체 없이 외부 파일로 bean설정하는 법 (0) | 2021.09.23 |
Environment객체 (0) | 2021.09.19 |