Logging
1. Logging
System.out.println : 콘솔창에 인자를 출력한다.
그러나, 실제 서비스 중인 어플리케이션의 콘솔을 계속 보고 있을 수가 없다....!! 어플리케이션이 실행중일 때 일어난 일들을 기록하는 것이 좋겠다! ! >> 를 로그로 남긴다!
- Logging : 로그를 남기는 행위
- Logger : 로그를 작성하기 위해 사용하는 객체
1) Slf4j - Simple Logging Facade 4 Java
: Java에서 로그를 남기는 방법을 통일해주는 프레임워크
- 자기 자신을 로그를 남기는 프레임워크가 아니라.... 다양한 로그 프레임워크를 사용하는 방법의 Facade(디자인 패턴)일 뿐이다!
package com.example.article;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class RootController {
private static final Logger log = LoggerFactory.getLogger(RootController.class);
// 대신 Lombok annotation @Slf4j를 쓸 수 있다.
@GetMapping
public String root() {
return "redirect:/article";
}
@GetMapping("/log")
public String logTest() {
log.trace("TRACE message");
log.debug("DEBUG message");
log.info("INFO message");
log.warn("WARN message");
log.error("ERROR message");
return "log";
}
}
** 로그 중요도 (로그 레벨)
- TRACE : 아주 단순한 작업에도 남기는 레벨
- DEBUG : 구체적인 내부 플로우에 대하여 기록을 남기는 레벨, 디버깅에 활용하는 수준
- INFO : 어플리케이션이 실행중일 때 정보 제공의 목적으로 남기는 레벨
- WARN : 아직 문제가 되진 않았지만, 악영향이 있을 수 있는 레벨
- ERROR : 어플리케이션이 정상적으로 동작하지 않았을 때 남기는 레벨
- 기본 레벨값은 INFO. 어느 레벨을 정하면 그보다 더 높거나 같은 레벨의 로그만 보인다.
- 조정하고 싶은 경우 설정 변경
//application.yaml 설정
logging:
level:
root: trace
// root : 모든 Logger가 기본으로 적용할 출력 레벨
logging:
level:
root: info
com.example.article: debug
//기본은 info, 특정 패키지는 debug레벨로 설정도 가능
2. Logback 설정 구경하기
: 현재 스프링부트에서 기본으로 사용하는 Logging 프레임워크
- XML을 이용해 설정
- 특정 파일에 로그를 남기거나, 특정 날짜까지의 기록만 남겨두고 싶을 때.
- SpringBoot는 resources의 logback.xml 또는 logback-spring.xml 파일을 자동으로 사용한다.
1) <appender> 인터페이스 설정
: 로그를 남기는 방식을 다양한 방식으로 제공
- ConsoleAppender : 터미널 화면에 로그를 남기기 위한 Appender
- FileAppender : 특정 파일에 로그를 남기기 위한 Appender
- RollingFileAppender : 특정 조건에 따라 파일의 갯수 및 크기를 유지하면서 로그를 남기기 위한 Appender
2) <rollingPolicy>
: 서버에 남아있는 로그를 일정한 양만 남기는 용도
- maxFileSize : 로그파일 당 크기 100MB
- maxHistory : 이 Appender가 유지하는 총 로그파일의 갯수
- totalSizeCap : 모든 로그 파일의 크기
3) <root> & <logger>
: LoggerFactory로 만들어진 로거가 어떤 Appender를 사용할지 정하는 설정
<?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>
<!--FileAppender: 파일에 로그를 남긴다..-->
<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>
<!--RollingFileAppender-->
<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="Console" />
<appender-ref ref="File" />
</root>
<!-- article 패키지 내에서는 warn 레벨로 콘솔로그를 찍도록-->
<logger name="com.example.article" level="warn" additivity="false">
<appender-ref ref="Console" />
</logger>
</configuration>
>> 결과 : Console 창에 logger가 뜬다. (ConsoleAppender) && file-log.log가 생겼다. (FileAppender)
4) application.yaml에서 설정 파일 지정!
: 어떤 Logback설정을 사용할지를 전달.
// application.yaml
logging:
config: file:logback-spring.xml
'Programming > Spring, SpringBoot' 카테고리의 다른 글
연습문제(로깅) (0) | 2024.01.15 |
---|---|
Profiles (0) | 2024.01.15 |
Spring Beans (0) | 2024.01.15 |
Spring Data JPA (Java Persistence API) (2) | 2024.01.07 |
MyBatis (1) | 2024.01.04 |