[활용]_06_로깅

3 minute read

로깅 1부 : 스프링 부트 기본 로거 설정

로깅 퍼사드 VS 로거

  • 로깅 퍼사드 : Commons Logging, SLF4j

  • 로거 : JUL, Log4J2, Logback

스프링 5에 로거 관련 변경 사항

스프링 부트 로깅

  • 기본포맷
  • –debug (일부 핵심 라이브러리만 디버깅 모드로)
  • –trace (전부 다 디버깅 모드로)
  • 컬러 출력: spring.output.ansi.enabled
  • 파일 출력: logging.file 또는 logging.path
  • 로그 레벨 조정: logging.level.패지키 = 로그 레벨

스프링부트는 기본적으로 Commons Logging를 사용

결국 SLF4j 를 사용하게 되므로 이걸 쓰면 됨.

이유.. 안 읽어도 됨 Commons Logging 가 초기에 문제가 많았다가 점차 좋아짐. 스프링이 이걸 사용하는 이유는 스프링 프레임워크의 core 모듈이 만들어질 때, 개발자들이 이미 Commons Logging을 쓰고 있었기 때문이다. 스프링 ver 1 에서는 Commons Logging에 대한 의존성을 exclusion 시키고, (pom.xml 서블릿 컨테이너 변경하는 법) SLF4j 로 변경. 런타임시 classpath 관련 이슈는 없으니 좋지만 관련 의존성들을 잘 처리해줘야한다. 어떤 로거를 쓸 지 결정이 된 후에 어플리케이션이 동작하기 때문에... 런타임시에 찾는 것이 아님 따라서 pom.xml에 여러가지 의존성 설정이 필요하다. 내가 쓰려는 로거를 지정 Commons Logging 은 런타임시에 classpath 로거를 찾는다.

로깅 퍼사드 VS 로거 구분

Commons LoggingSLF4j는 실제 로깅을 하는 것이 아니라 로깅 API를 추상화해놓은 인터페이스들이다.

주로 프레임워크들은 로깅 퍼사드를 이용해서 코딩한다.

애플리케이션 개발시에도 로깅 퍼사드를 통해서 로거를 써도 문제없다.

※ 로깅 퍼사드 장점

  • 로깅 퍼사드들의 로거를 교체하기 쉽다.
  • 프레임워크에서 로깅 퍼사드 기반으로 코딩하는 이유
    • 프레임워클를 사용하는 애플리케이션들이 원하는 로거를 사용할 수 있도록 해주기 위해서이다.

스프링 5에 로거 관련 변경 사항

Spring-JCL

  • Commons Logging -> SLF4j or Log4j2
  • pom.xml에 exclusion 안해도 됨.

스프링 1버전에서 Commons Logging을 exclusion 시키고, SLF4j 로 변경하는 작업을 하지 않고도, 안정하게 사용할 수 있도록 자체적으로 Spring-JCL 모듈 을 만들었다.

스프링에 있는 JCL(jakarta commons logging) 코드를 컴파일 시점에 SLF4jLog4j2로 변경할 수 있는 기능을 가진 모듈

⇒ 정리

Commons Logging ⇒ SLF4j ⇒ Logback

스프링부트는 Commons Logging을 쓰고 있고, 우리는 Commons Logging이나 SLF4j 둘 다 쓸 수 있지만 최종적으로는 SLF4j로 가서 최종 로거를 선택해서 사용하게 된다. 최종 로거는 Logback 을 쓰는 것이다. (Logback이 SLF4j의 구현체)

즉, 처음 스프링 어플리케이션을 만들고 실행하면서 찍어주는 로그는 Logback이 찍어주는 것이 맞다.

의존성을 확인해보면 알 수 있다.

image-20200907145911128

  • logback은 slf4j의 구현체

  • log4j-to-slf4j : log4j를 사용하는 코드도 (가로채서) slf4j API로 보냄

  • jul-to-slf4j : jul(java util logging)을 쓰는 것은 (가로채서) slf4j API로 보내라

⇒ slf4j는 받아서 최종적으로 logback으로 로그를 남긴다.

스프링 부트 로깅

  • 기본포맷

  • –debug (일부 핵심 라이브러리만 디버깅 모드로)

  • –trace (전부 다 디버깅 모드로)

  • 컬러 출력: spring.output.ansi.enabled

  • 파일 출력: logging.file 또는 logging.path

    #log를 파일로 저장 - spring.log 파일명으로 저장됨
    logging.file.path=logs
    

    어느정도 후에 아카이빙된다. 조절 가능

    logging.file.max-history

  • 로그 레벨 조정: logging.level.패지키 = 로그 레벨

logging.level.dev.solar.springinit=DEBUG

로거를 만들어서 출력하도록 수정

@Component
public class SampleRunner implements ApplicationRunner {

  	//로거 생성
    private Logger logger = LoggerFactory.getLogger(SampleRunner.class);

    @Autowired
    private PersonProperties personProperties;

    @Autowired
    private String hello;

    @Override
    public void run(ApplicationArguments args) {
        logger.info("==============================="); //debug 레벨로 출력
        logger.debug(hello);
        logger.debug(personProperties.getName());
        logger.debug(personProperties.getFullName());
        logger.debug("===============================");
    }
}

image-20200907154351444


로깅 2부 : 커스터 마이징

Spring Docs - howto logging

커스텀 로그 설정 파일 사용하기

  • Logback: logback-spring.xml (추천)
  • Log4J2: log4j2-spring.xml

  • JUL (비추): logging.properties
  • Logback extension
    • 프로파일 <springProfile name=”프로파일”>
    • Environment 프로퍼티 <springProperty>

로거를 Log4j2로 변경하기


  • 스프링 로깅 레벨 변경 가능

    logging.level.org.springframework=debug
    

커스텀 로그 설정 파일 사용하기

Logback 사용 시, logback.xml도 쓸 수 있지만 logback-spring.xml 을 추천

Logback extension 추가기능을 제공해준다. (logback.xml을 너무 빨리 로딩돼서 사용할 수 없음?)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
    <logger name="dev.solar.springinit" level="DEBUG"/> <!-- 프로젝트 레벨 설정 -->
</configuration>

Logback extension

  • 프로파일 <springProfile name=”프로파일”>

    특정 프로파일일 때만 특정 설정이 적용되도록 할 수 있다.

    ex) 개발모드 - debug 레벨로 출력, production 모드 - info 레벨로 출력

  • Environment 프로퍼티 <springProperty>

    ex) 프로퍼티값의 위치에따라 로그 출력

로거를 Log4j2로 변경하기

  1. 기본적으로 commons logging를 사용 중이므로 dependency를 exclusion 해준다.
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  1. log4j2 의존성 추가
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

최종적으로 로그메시지를 찍는 라이브러리는 log4j2가 된다.

프로젝트 로그 레벨 설정 후 실행하면 잘 찍힌다.

logging.level.dev.solar.springinit=DEBUG

image-20200907162948867

  • 이렇게 log4j2로 바꾼 경우, 커스텀한 로그 설정파일은 log4j2-spring.xml 로 만들어야 한다.