Logging이란?
로그를 남기는 행위
Logger
로그를 작성하기 위해 사용하는 객체
Slf4j (Simple Logging Facade 4 Java)
Java에서 로그를 작성하는 방법을 통일하는 프레임워크
자기자신을 로그를 남기는 프레임워크가 아니고, 다양한 로그 프레임 워크를 사용하는 방법의 Facade(디자인패턴)일 뿐이다.
Facade
복잡한 단계를 거치거나, 여러 구성 요소를 사용해서 도달해야 하는 기능을 좀더 단순하게 사용할 수 있는 인터페이스를 만드는 디자인 패턴의 일종
Logback
현재 스프링 부트에서 기본으로 사용하고 있는 Logging 프레임 워크
XML을 이용해 설정
Logging 동작 알아보기
- TestController 코드 추가 (logger 사용하기)
//@Slf4j
@RestController
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@GetMapping("/log")
public void logTest(){
log.trace("A TRACE message");
log.debug("A DEBUG message");
log.info("A INFO message");
log.warn("A WARN message");
log.error("A ERROR message");
}
LoggerFactory.getLogger : 로그를 남길 수 있는 로거를 남겨주는 Slf4j의 기능입니다. 이때 저희가 어떤 클래스에서 로그를 남겼는지를 기록하기 위해 TestController.class 를 인자로 전달합니다.
- @Slf4j : private static final Logger log = = LoggerFactory.getLogger(TestController.class); 를 자동으로 추가해주는 lombok 어노테이션 입니다.
/log 경로 실행 결과
Log Level
- TRACE: 가장 낮은 단계의 로그로 아주 작은 변화의 로그를 남기는 레벨입니다.
- DEBUG: TRACE 보다는 조금 덜 구체적인, 개발자의 디버깅을 도와주는 로그를 남기는 레벨입니다.
- INFO: 어플리케이션이 실행중일 때 정보 제공의 목적으로 로그를 남기는 레벨입니다.
- WARN: 어플리케이션이 실행중일 때 안좋은 영향을 미칠 수도 있는 로그를 남기는 레벨입니다. 단 이 레벨의 로그가 남았다고 당장 어플리케이션에 문제가 생긴 것을 의미하지는 않습니다. (경고)
- ERROR: 어플리케이션이 정상적으로 작동하지 못하는 상황에 대한 로그를 남기는 레벨입니다. 정상적으로 처리하지 못한 요청 등에 대한 로그를 남깁니다
등으로 나눌 수 있습니다. 그리고 저희가 어플리케이션을 실행하면서, 어느 레벨의 로그까지 남기는지를 결정할 수 있는데, 기본값은 INFO 입니다. 어떤 레벨로 설정을 하던, 기본적으로 남는 로그는 해당 로그 레벨 및 그보다 중요도가 높은 레벨의 로그를 남깁니다. 즉 TRACE로 설정하면 모든 로그를, WARN으로 설정하면 WARN과 ERROR 로그만 실제로 작성되게 됩니다.
특별한 설정 없이 Log Level 만 조정하고 싶다면, application.yaml 을 활용할 수 있습니다.
logging:
level:
root: debug //이부분을 원하는대로 변경해서 로그를 확인하면 된다.
Logback 설정해보기
src/main/resources/ 에 logback.xml 파일 또는 logback-spring.xml 파일을 추가해두면 해당 파일을 읽어서 로그 설정을 적용해 주기도 합니다. 간단한 예시 설정을 살펴보도록 합시다.
- 예시 logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS" value="./logs" />
<appender name="Console"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<appender name="File" class="ch.qos.logback.core.FileAppender">
<file>${LOGS}/file-log.log</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %p %C{1} [%t] %m%n</Pattern>
</encoder>
</appender>
<appender name="RollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS}/rolling-file-log.log</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %p %C{1} [%t] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOGS}/archived/rolling-file-log-%d{yyyy-MM-dd_HH-mm-ss}.%i.log
</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>10</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- LOG everything at INFO level -->
<root level="info">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<!-- LOG "org*" at WARN level -->
<logger name="org" level="warn" additivity="false">
<appender-ref ref="Console" />
<appender-ref ref="File" />
</logger>
<!-- LOG "com.example.contents*" at TRACE level -->
<logger name="com.example.contents" level="trace" additivity="false">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
<appender-ref ref="File" />
</logger>
</configuration>
<appender>
logback에서 제공하는 Appender 인터페이스를 설정하기 위한 요소.
logback에서는 Appender를 토앻서 다양한 방식으로 로그를 남길수 있는데, 대표적으로
- ConsoleAppender : 저희 터미널 화면에 로그를 남기기 위한 Appender입니다.
- FileAppender : 특정 파일에 로그를 남기기 위한 Appender 입니다.
- RollingFileAppender : 특정 조건에 따라 파일의 갯수 및 크기를 유지하면서 로그를 남기기 위한 Appender 입니다.
등이 있다. <appender> 요소는 해당 Appender들이 사용할 설정 값들을 정의하기 위해 사용합니다
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
...
</appender>
<appender name="File" class="ch.qos.logback.core.FileAppender">
...
</appender>
<appender name="RollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
...
</appender>
<layout> & <encoder>
저희가 남기는 로그의 형식을 정의하기 위한 요소입니다. 둘다 그 역할은 비슷하지만 차이가 있다면 Layout 은 특정 문자열로 바꾸기 위해 사용해 콘솔 창에서 확인하기 위해, Encoder 는 파일에 작성 가능한 byte[] 형태로 바꾸기 위해 사용한다는 차이입니다. 그리고 둘다 <Pattern> 이라는 요소를 가지고 있는데, 이 부분이 저희 실제 로그의 출력을 조정하기 위한 부분입니다. 이때 String.format 메소드와 유사하게 %d 와 같은 방식으로 해당 부분에 변할 수 있는 값을 설정해 줍니다. 여기에서 사용된 몇가지만 살펴보면,
- %d : 로그가 작성된 날짜
- %p : 로그 레벨
- %C : 로그를 남긴 클래스
- %t : 로그를 남긴 쓰레드
- %m : 로그 메시지
- %n : 개행 문자
등을 나타냅니다. 또한 Layout 의 경우 콘솔 출력시 색상 조절을 위한 %black 등도 존재함을 확인할 수 있습니다.
<file>
FileAppender 와 RollingFileAppender 는 파일의 형태로 로그를 남기기 때문에, 어떤 파일에 로그를 남길지에 대한 설정입니다.
<rollingPolicy> 이란?
로그를 일정기간 또는 사이즈까지만 유지하는 것을 log rotation 또는 log rolling이라고 부릅니다.
그리고 이 로그를 남기는 기준을 정의하기 위한 요소가 <rollingPolicy> 요소입니다.
아래의 설정의 경우
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOGS}/archived/rolling-file-log-%d{yyyy-MM-dd_HH-mm-ss}.%i.log
</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>10</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
- 파일 하나당 크기: 100MB
- 전체 로그 파일들 총 크기: 1GB
- 유지되는 파일의 갯수: 10개
'Spring' 카테고리의 다른 글
WebSocket으로 채팅 구현하기 (0) | 2023.07.14 |
---|---|
[Spring Security] JWT (0) | 2023.07.10 |
[Spring] 테스트 클래스란? (0) | 2023.07.09 |
[Spring] 유효성 검사 (0) | 2023.07.09 |
POSTMAN 사용하기 (0) | 2023.07.09 |