Post

Logging, LogBack, Slf4j

✅ Logging

Log: 서버가 수행한 작업/상태에 대한 기록

🙏🏻 Logging 필요성

java 콘솔로 출력하다보면 내부 정보(어떤 스레드, 만들어진 시간 등)까지는 기록하지 못하고,
애플리케이션이 꺼졌다 켜지면 사라짐, 파일로 생성하고 싶음
로그 제어, 필터링 하고 싶음

☑️ 로그 레벨

  • ERROR: 요청을 처리하는 도중에 발생하는 오류 로그
  • WARN: 처리 가능한 문제이지만, 향후 에러의 원인이 될 수 있다는 경고 로그
  • INFO: 상태 변경(100개였는데 10개가 되었음) 같은 정보
  • DEBUG: 프로그램 디버깅 정보 로그

☑️ Logger

로깅을 실행하는 주체

모든 로거는 Root로거의 하위에 있다.

☑️ Log Pattern

로그 메세지 출력 형식을 정의한 템플릿

시간, 정보, 쓰레드 정보 등을 탑재할 수 있다.

☑️ Log Appender

log 기록의 목적지

  • Console appender 그래도 console에 출력
  • File appender 로깅 생성 시 파일 기록
  • Messenger appender 로깅 생성 시 메세지로 송출

✅ Logback

Logging을 구현하는 인터페이스를 Slf4j 인터페이스라고 한다.
Logging을 구현하는 Slf4j 인터페이스 중 Logback이 있음
>

this.getClass()

✔️ Logback 사용 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//logback-spring-local.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <!-- 콘솔 로그 출력 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 루트 로거 설정 -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//logback-spring-dev.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_PATH" value="logs" />

    <!-- 콘솔 로그 출력 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
        //⭐️ logpattern
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${LOG_PATH}/test.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 루트 로거 설정 -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>
1
2
3
4
5
6
application.yaml
server:
  port: 8080
logging:
  config: classpath:logback-spring-local.xml
  #classpath: 이 파일로 가세요 가리키는 화살표

✔️ logger 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Controller에서 logger 사용 예시
public class ElectronicStoreControllerLombok {
    //logger
    //logger을 추가해 어떤 정보가 들어왔는지 볼 수 있음
    //logger.warn, logger.debug 등등...필요한 레벨로 사용
    private Logger logger= LoggerFactory.getLogger(this.getClass());

    @GetMapping("/items")
    public List<Item> findAllItem(){
        logger.info("GET/items requested"); //이렇게 logger 추가
        List<Item> items= electronicStoreItemService.findAllItem();
        logger.info("GET/items:" + items); //이렇게 logger 추가
        return items;
    }

✔️ logger 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
//Service에서 Logger 사용 예시

@Service
public class ElectronicStoreItemService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Transactional(transactionManager = "tm1")
    public Integer buyItems(BuyOrder buyOrder) {
        //이런식으로 error보이도록 설정 가능
        logger.error("store 또는 stock이 없으면 구매할 수 없습니다");
        if(itemEntity.getStoreId() == null) throw new RuntimeException("No Store Found");
        if(itemEntity.getStock() == 0) throw new RuntimeException("No stock available");
    }

✔️ 더 간단하게 annotation으로 Log 사용 log

1
2
3
4
5
6
7
8
9
10
11
12
//더 간단하게 annotation으로 Log 사용 설정
@Slf4j
@Service
public class ElectronicStoreItemService {

@Transactional(transactionManager = "tm1")
    public Integer buyItems(BuyOrder buyOrder) {
        //이런식으로 error보이도록 설정 가능
        log.error("store 또는 stock이 없으면 구매할 수 없습니다");
        log.info("구매를 완료하였습니다.");
    }
}
This post is licensed under CC BY 4.0 by the author.