토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 부트 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


12.7. Logging

스프링 부트는 로깅과 관련해선 스프링 프레임워크의 spring-jcl 모듈에서 제공하는 전형적인 Commons Logging API를 제외하고는 필수 의존성이 없다. Logback을 사용하려면 클래스패스에 Logback과 spring-jcl을 추가해야 한다. 이땐 spring-boot-starter-logging에 의존하고 있는 다른 스타터를 이용하는 걸 권장한다. 웹 애플리케이션에선 spring-boot-starter-web이 로깅 스타터를 전이 의존성transitive dependency으로 가지고 있기 때문에 웹 스타터만 있으면 된다. 메이븐을 사용하고 있다면 아래 의존성을 추가해주면 된다:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

스프링 부트는 로그 시스템을 LoggingSystem으로 추상화해서 클래스패스에 있는 구현체를 기반으로 로그를 세팅한다. 클래스패스에 Logback이 있다면 Logback을 첫 번째로 선택한다.

로그 시스템에서 유일하게 변경하고 싶은 게 로거별 로그 레벨이라면, 아래 예제처럼 application.properties에서 “logging.level” 프리픽스를 사용해 변경하면 된다:

properties yaml
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
logging:
  level:
    org.springframework.web: "debug"
    org.hibernate: "error"

logging.file.name을 사용하면 로그 파일을 기록할 위치도 설정할 수 있다 (콘솔 로그와는 별도로).

로그 시스템 설정을 좀 더 세세하게 바꾸고 싶다면, 해당 LoggingSystem에서 지원하는 네티이브 설정 포맷에 맞게 설정해야 한다. 기본적으로 스프링 부트는 로그 시스템의 디폴트 위치(ex. Logback에선 classpath:logback.xml)에서 네이티브 설정을 가져오지만, logging.config 프로퍼티를 사용하면 설정 파일의 위치를 변경할 수 있다.

12.7.1. Configure Logback for Logging

application.properties로는 수정이 불가능한 커스텀 설정을 적용해야 한다면 표준 로그백 설정 파일을 추가해야 한다. logback이 찾을 수 있게 클래스패스 루트에 logback.xml 파일을 추가해주면 된다. 스프링 부트 로그백 익스텐션를 이용하고 싶다면 logback-spring.xml을 사용해도 된다.

로그백 설정은 로그백 문서에 있는 전용 섹션에서 자세히 설명하고 있다.

스프링 부트는 자체 설정에 include시킬 수 있는 여러 가지 로그백 설정을 제공한다. 덕분에 여기서도 몇 가지 공통 스프링 부트 컨벤션을 적용할 수 있다.

다음과 같은 파일들을 제공하고 있으며, 이 파일들은 org/springframework/boot/logging/logback/에서 찾을 수 있다:

스프링 부트 구버전과의 호환성을 위해 레거시 base.xml 파일도 제공하고 있다.

보통 커스텀 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="org.springframework.web" level="DEBUG"/>
</configuration>

로그백 설정 파일에선 LoggingSystem이 생성해주는 시스템 프로퍼티도 사용할 수 있다:

게다가 스프링 부트는 커스텀 Logback 컨버터를 통해 터미널 콘솔 로그를 ANSI 색상으로 출력해준다 (로그 파일에선 지원 안 함). 예제가 필요하다면 defaults.xml 설정에 들어있는 CONSOLE_LOG_PATTERN을 참고해라.

클래스패스에 Groovy가 있으면 logback.groovy로도 Logback을 설정할 수 있을 거다. 이 파일이 있을 땐 이 파일에 있는 설정이 우선권을 갖는다.

Groovy 설정에선 스프링 익스텐션을 지원하지 않는다. logback-spring.groovy 파일은 전부 감지하지 못한다.

Configure Logback for File-only Output

콘솔 로그는 비활성화하고 파일에만 로그를 출력하고 싶다면, 다음 예제처럼 커스텀 logback-spring.xml을 만들어 file-appender.xml은 임포트하지 않고, console-appender.xml만 임포트해야 한다:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

application.propertiesapplication.yaml에 다음과 같이 logging.file.name도 추가해줘야 한다:

properties yaml
logging.file.name=myapplication.log
logging:
  file:
    name: "myapplication.log"

12.7.2. Configure Log4j for Logging

스프링 부트에선 Log4j 2가 클래스패스에 있으면 Log4j 2로도 로그를 설정할 수 있다. 스타터를 이용해 의존성들을 한 곳에 모았다면 Logback을 제외하고 그대신에 log4j 2를 포함시켜야 한다. 스타터를 사용하지 않는 경우엔 Log4j 2 외에도 (최소한) spring-jcl을 제공해야 한다.

약간 돌아가야 되긴 하지만 스타터를 이용하는 걸 권장한다. 다음은 메이븐에서 스타터들을 설정하는 예시다:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

그래들에선 다른 방법으로 스타터를 세팅할 수 있다. 그 중 하나로 module replacement를 사용하는 방법이 있다. 아래 예제처럼 Log4j 2 스타터 의존성을 선언한 다음, 디폴트 로깅 스타터를 만나면 Log4j 2 스타터로 교체해야 한다고 그래들에 알려주면 된다:

dependencies {
    implementation "org.springframework.boot:spring-boot-starter-log4j2"
    modules {
        module("org.springframework.boot:spring-boot-starter-logging") {
            replacedBy("org.springframework.boot:spring-boot-starter-log4j2", "Use Log4j2 instead of Logback")
        }
    }
}

Log4j 스타터에는 로그에서 공통으로 필요한 요구 사항에 쓸 의존성들이 함께 모여있다 (톰캣에선 java.util.logging을 사용하지만 출력 설정은 Log4j 2로 하는 등).

java.util.logging으로 남긴 디버그 로그가 Log4j 2로 라우팅되도록 하려면 시스템 프로퍼티 java.util.logging.managerorg.apache.logging.log4j.jul.LogManager로 설정해서 Log4j 2의 JDK 로깅 어댑터를 구성해라.

Use YAML or JSON to Configure Log4j 2

Log4j 2는 디폴트 XML 설정 포맷 외에도 YAML과 JSON 설정 파일을 지원한다. YAML이나 JSON 파일을 이용하려면 아래 보이는 것과 같이 클래스패스에 적절한 의존성을 추가하고, 설정 파일명을 선택한 파일 형식에 맞게 지정해라:

Format Dependencies File names
YAML com.fasterxml.jackson.core:jackson-databind + com.fasterxml.jackson.dataformat:jackson-dataformat-yaml log4j2.yaml + log4j2.yml
JSON com.fasterxml.jackson.core:jackson-databind log4j2.json + log4j2.jsn

전체 목차는 여기에 있습니다.

<< >>

TOP