처음부터 차근차근

Logback 본문

Framework/Spring

Logback

_soyoung 2022. 5. 5. 18:38
반응형

Logback

 

https://logback.qos.ch/

 

Logback Home

Logback Project Logback is intended as a successor to the popular log4j project, picking up where log4j 1.x leaves off. Logback's architecture is quite generic so as to apply under different circumstances. At present time, logback is divided into three mod

logback.qos.ch

로깅(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

 

Apache Log4j 1.2.17 API

 

logging.apache.org

 

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

 

ThresholdFilter (Logback-Parent 1.3.0 API)

All Implemented Interfaces: ContextAware, LifeCycle Filters events below the threshold level. Events with a level below the specified level will be denied, while events with a level equal or above the specified level will trigger a FilterReply.NEUTRAL resu

logback.qos.ch

<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

 

Log4j의 additivity 옵션

logger는 기본적으로 정의한 패키지의 조상으로부터 모든 appender을 상속받습니다. 만약 다음과 같이 root와 org.springframework 두개의 logger가 같은 appender를 사용한다면 같은 메시지가 두번 찍히는 것

aircook.tistory.com

두 개의 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

 

Logback 이란? 설정방법 및 사용방법

기존 log를 관리하기 위한 구현체로써 log4j가 사용되었다. 그러나 보다 안정성이 높고 편리하게 log를 관리하기 위해 Logging framework인 Slf4j(Simple Logging Façade for Java)와 그 구현체로써 Logback이 고..

oingdaddy.tistory.com

반응형

'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
Comments