Logging이란?
Logging이란 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동을 말한다.
Logging 라이브러리
예전에는 log4j를 많이 사용했는데 구조적인 문제 등으로 현재는 업데이트를 중단했다. 최근에는 log4j를 개선한 logback과 log4j2를 주로 사용한다. 프레임워크에서는 애플리케이션 개발자가 직접 로깅 라이브러리를 선택할 수 있도록 logback이나 log4j2와 같은 실질적인 구현체가 아닌 로깅 추상화 라이브러리를 제공한다. Spring은 예전에 로깅 추상화 라이브러리로 JCL(Apache Commons Logging)을 선택했었다. 하지만 JCL의 클래스 로더나 메모리 누수 등의 문제로 스프링 3.0부터는 JCL을 SLF4J로 교체하였다.
구분과거최근
| Logging 라이브러리 | log4j | -> | logback, log4j2 |
| Logging 추상화 라이브러리 | JCL | -> | SLF4J |
- jdk에도 JUL(Java Utility Logging)이라는 Logging 라이브러리가 내장되어있다.
- JCL은 정확히는 Jakarta Commons Logging이다. 아파치 소프트웨어 재단의 자카르타 프로젝트에서 개발되었기에 지어진 이름이다.
Springboot의 Logging 라이브러리

Springboot는 Logging 추상화 라이브러리로 SLF4J를, 이를 구현한 Logging 라이브러리로는 logback을 기본으로 설정해놓았다. Spring-boot-starter-web에 대한 의존성을 추가하면 spring-boot-starter-logging에 대한 의존성도 추가되는데 이 안에서 Logging 라이브러리들을 확인할 수 있다. 위의 이미지에서 선택된 부분이 logback이다. 아래의 두 파일은 SLF4J를 위한 Bridge 모듈이다. 이에 대한 자세한 설명은 다른 포스팅에서 할 예정이다.
logback 설정을 커스터마이징하기
설정파일 만들기
logback 공식 매뉴얼을 보면 logback 설정파일을 찾는 순서에 대해 이렇게 설명하고 있다.
Let us begin by discussing the initialization steps that logback follows to try to configure itself:
Logback tries to find a file called logback-test.xml in the classpath.
If no such file is found, logback tries to find a file called logback.groovy in the classpath.
If no such file is found, it checks for the file logback.xml in the classpath..
If no such file is found, service-provider loading facility (introduced in JDK 1.6) is used to resolve the implementation of com.qos.logback.classic.spi.Configurator interface by looking up the file META-INF\services\ch.qos.logback.classic.spi.Configurator in the class path. Its contents should specify the fully qualified class name of the desired Configurator implementation.
If none of the above succeeds, logback configures itself automatically using the BasicConfigurator which will cause logging output to be directed to the console.
The last step is meant as last-ditch effort to provide a default (but very basic) logging functionality in the absence of a configuration file.
If you are using Maven and if you place the logback-test.xml under the src/test/resources folder, Maven will ensure that it won't be included in the artifact produced. Thus, you can use a different configuration file, namely logback-test.xml during testing, and another file, namely, logback.xml, in production.
-
클래스 패스 내 logback-test.xml을 찾는다.
-
해당 파일이 없으면, 클래스 패스 내 logback.groovy를 찾는다.
-
해당 파일이 없으면, 클래스 패스 내 logback.xml을 찾는다.
-
해당 파일이 없으면, 디폴트 설정을 따른다.
Spring Boot 공식문서에는 Custom Log Configuration을 위한 파일에 -spring을 붙일 것을 권장하고 있다.
When possible, we recommend that you use the -spring variants for your logging configuration (for example, logback-spring.xml rather than logback.xml). If you use standard configuration locations, Spring cannot completely control log initialization.
즉, resources 폴더에 logback-spring.xml파일을 추가하고, 그 안에 logging 관련 속성들을 설정해주면 된다.
logback 설정파일의 속성들
Logback-spring.xml 파일은 이렇게 생겼다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<appender name="SAMPLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGS_ABSOLUTE_PATH}/logback.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>5MB</maxFileSize>
<!-- kb, mb, gb -->
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<logger name="wooteco.review.controller" level="DEBUG">
<appender-ref ref="SAMPLE" />
</logger>
<logger name="wooteco.review.service" level="DEBUG">
<appender-ref ref="SAMPLE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
설정할 수 있는 부분은 appender, logger, root 이렇게 3가지이다.

-
appender
-
<appender> 요소는 name과 class 2개의 필드를 반드시 가지고 있어야 한다. name에 해당 appender의 이름을 지정하고, class에는 사용할 appender 클래스의 풀네임(패키지 경로를 포함한 클래스 이름)을 설정해준다.
Appender Class 종류 설명 ConsoleAppender 콘솔에 로그를 찍는 방법이다. 좀 더 정확히는 System.out이나 System.err와 같은 PrintStream을 활용해서 로그를 찍는다. encoder 속성의 pattern속성에 로그를 출력할 포맷을 지정해야 한다. FileAppender 파일에 로그를 찍는 방법이다. file속성에 로그를 찍을 파일을 지정해준다. 해당 파일이 존재하지 않으면 파일을 새로 생성한다. RollingFileAppender 파일에 로그를 찍다가 특정 조건이 충족되면 다른 파일에 로그를 찍는 방법으로 rollingPolicy와 triggeringPolicy 2가지 속성이 중요하다. rollingPolicy는 만들어질 파일 이름을 설정하고, 어떤 기준으로 파일을 생성할지를 설정할 수 있다. triggerPolicy는 일정 용량이 다 차면 새로운 파일을 만드는 등 원하는 트리거를 지정할 수 있다.
-
- logger
- logger 요소는 실제 로그 기능을 수행하는 객체를 나타냅니다. name 속성을 통해서 해당 Logger를 적용할 패키지를, level 속성을 통해서 logging level을 지정할 수 있습니다. appender-ref 속성에 appender name을 설정하면 해당 appender를 적용할 수 있습니다.
-
root
-
기본 logger에 대한 설정으로, logger 요소와 설정 방법은 동일합니다. root 에서 설정한 기본 logger가 모든 대상에 적용되고, logger 요소에서 별도로 설정한 패키지들은 logger 요소의 설정이 적용됩니다.
-
하이라이팅
위의 logback-spring.xml 파일을 적용하면 아래 처럼 아주 밋밋한 로그가 찍힌다.

그래서 appender의 pattern 속성에서 level과 logger의 포맷을 다음과 같이 변경했다.
<Pattern>%d{HH:mm} %highlight(%-5level) %cyan(%logger{36}) - %msg%n</Pattern>
색상으로 구분되니 좀 더 읽기 편해졌다.

참고자료
'Spring Boot' 카테고리의 다른 글
| spring boot에서JPA 디버깅을 위한 옵션 (0) | 2023.06.26 |
|---|