Spring Boot Logback 사용을 위한 설정
Spring Boot로 애플리케이션에서 로그를 사용하려면 다음 종속성을 추가하십시오.
(현재는 logback이 기본 레퍼런스이지만 예전에는 log4j -> slf4j가 기본 레퍼런스였습니다.
)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
Spring Boot에서 제공하는 기본 로깅 위치는 Spring Boot의 base.xml 파일이며 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<!
--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<included>
<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/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
로그 패턴, 로그 문자 집합 및 임계값 설정은 defaults.xml에 있습니다.
https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml
<?xml version="1.0" encoding="UTF-8"?>
<!
--
Default logback configuration provided for import
-->
<included>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr((%15.15t)){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
<property name="CONSOLE_LOG_THRESHOLD" value="${CONSOLE_LOG_THRESHOLD:-TRACE}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- (%t) %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
<property name="FILE_LOG_THRESHOLD" value="${FILE_LOG_THRESHOLD:-TRACE}"/>
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
<logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN"/>
</included>
이 구성에 따라 파일 추가자가 구성됩니다.
https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/file-appender. XML
<?xml version="1.0" encoding="UTF-8"?>
<!
--
File appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->
<included>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${FILE_LOG_THRESHOLD}</level>
</filter>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${FILE_LOG_CHARSET}</charset>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
<cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory>
</rollingPolicy>
</appender>
</included>
마지막으로 사용자는 logback.xml 또는 logback-spring.xml을 사용하고 base.xml을 프로젝트의 /src/main/resources에 추가하여 참조합니다.
(Spring Boot 변수를 사용하려면 logabck-spring.xml을 사용하는 것이 좋습니다.
)
<?xml version="1.0" encoding="UTF-8"?>
<!
DOCTYPE configuration>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!
-- ... 이하 생략. 사용자별 개별 설정 -->
</configuration>
로그 위치 설정
위의 기본 설정을 고려할 때 기본 로그 위치는 다음과 같습니다.
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
도커 이미지 빌드 및 서버 구동 시 LOG_FILE 변수를 별도로 선언하지 않으면 /tmp/spring.log에 쌓이게 된다.
위치를 변경하려면 다음과 같이 logback.xml 또는 logback-spring.xml에 LOG_FILE 변수를 선언합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!
DOCTYPE configuration>
<configuration>
<property name="LOG_FILE" value="${LOG_FILE:-./logs/catalina.log}"/>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
</configuration>
Kubernetes에서 설정하여 배포하고 사용하는 경우 Kubernetes 배포 설정에서 workingDir을 선언하면 이 위치에 logs/catalina.log가 생성됩니다.
예를 들어 workingDir: /usr/local/app로 설정하면 로그는 /usr/local/app/logs/catalina.log에 저장됩니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: '${name}-deployment'
namespace: default
spec:
template:
spec:
containers:
- workingDir: /usr/local/app
image: '이미지주소'
... 이하 생략
Tomcat 액세스 로그 설정
Spring Boot는 accesslog에 대한 구성도 제공합니다.
Tomcat 액세스 로그를 구성하려면 다음 옵션을 설정할 수 있습니다.
(브리지, 석션은 같은 모양)
server.tomcat.accesslog.enabled=true
이 옵션은 Spring Boot의 ServerProperties에서 제공하는 구성 옵션입니다.
https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties. 자바
액세스 로그의 경우 기본 위치는 다음과 같습니다.
/tmp/tomcat.(port).(난수)/logs/access_log.(날짜).log
이는 ServerProperties에서 AccessLog의 기본 위치가 다음과 같기 때문입니다.
private String directory = "logs";
액세스 로그의 위치 지정
ServerProperties의 기본값은 다음과 같습니다.
server.tomcat.accesslog.directory=logs
이 경우 ServerProperties의 기본 accesslog 위치는 /tmp/tomcat.(port).(random number)/logs입니다.
위치는 /tmp/tomcat.(포트).(임의의 숫자)로 설정됩니다.
절대 경로로 지정해야 합니다.
예를 들어 /usr/local/app/logs에서 찾으려는 경우
server.tomcat.accesslog.directory=/usr/local/app/logs
위와 같이 설정해야 합니다.
Spring Boot에서 제공하는 server.tomcat.accesslog.* 옵션의 경우 tomcat-embed-core에서 org.apache.catalina.valves.AccessLogValve를 사용합니다.
Valve는 연결된 Catalina 컨테이너(엔진, 호스트 또는 컨텍스트)에 대한 요청 처리 파이프라인에 추가되는 구성 요소인 Tomcat에서 제공하는 개념입니다.
https://tomcat.apache.org/tomcat-10.1-doc/config/valve.html
사용자는 이 ValveBase를 확장하여 맞춤형 구현을 구현할 수 있습니다.
AccessLog의 경우 Tomcat은 AccessLogValve 및 Logback LogbackValve를 제공합니다.
https://tomcat.apache.org/tomcat-10.1-doc/config/valve.html#Access_Logging
https://logback.qos.ch/access.html
Tomcat에서 제공하는 AccessLogValue도 로그를 보는 데 비현실적이지는 않지만, 로그백을 사용하지 않기 때문에 파일 압축과 같은 로그 처리는 제공되지 않는다.
로그 파일의 위치를 설정하는 처리 방법이 Logback과 다르기 때문에 Tomcat의 Logback 설정과 AccessLogValue 설정을 함께 사용할 경우 각 설정을 따로 이해해야 하는 것은 현실적이지 않습니다.
catalina.out에 대한 logback과 액세스 로그에 대한 tomcat 로그를 사용하여 두 가지 방법으로 설정을 관리하는 대신 logback은 catalina.out, 액세스 로그 등과 같이 다른 경우에 대한 모든 로그를 추가하여 관리합니다.
이 시점에서 더 좋은 방법인 것 같습니다.
로그백 Tomcat 액세스 로그 설정
Logback은 구성을 위한 AccessLog LogbackValue를 제공합니다.
이를 사용하여 로그를 구현할 수 있습니다.
https://logback.qos.ch/access.html
logback-access 종속성을 추가합니다.
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
</dependency>
Spring Boot는 ConfigurableWebServerFactory를 구현하여 Jetty, Netty, Tomcat 및 Undertow를 사용자 정의할 수 있습니다.
Tomcat Servlet의 경우 다음과 같이 WebServerFactoryCustomizer 빈을 선언하여 LogbackValve를 추가할 수 있다.
@Component
public class LogbackTomcatServletWebServerFactoryCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
var logbackValve = new LogbackValve();
logbackValve.setFilename("logback-access.xml");
factory.addEngineValves(logbackValve);
}
}
다음과 같이 logback-access.xml을 선언하십시오.
<?xml version="1.0" encoding="UTF-8"?>
<!
DOCTYPE configuration>
<configuration>
<property name="ACCESS_LOG_FILE" value="${ACCESS_LOG_FILE:-./logs/access.log}"/>
<property name="ACCESS_LOG_PATTERN" value="${ACCESS_LOG_PATTERN:-combined}"/>
<appender name="ACCESS_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${ACCESS_LOG_PATTERN}</pattern>
</encoder>
<file>${ACCESS_LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${ACCESS_LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
<cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory>
</rollingPolicy>
</appender>
<appender-ref ref="ACCESS_FILE" />
</configuration>
logback-access-spring-boot-starter 소개
Logback Tomcat의 AccessLog 구성에는 한 가지 단점이 있습니다.
logback에서 제공하는 LogbackValve는 classpath 리소스를 지원하지 않습니다.
즉, 참조 JAR 파일의 classpath:(logback-access.xml 위치) 파일을 사용하여 여러 프로젝트에서 사용할 공통 logback-access.xml 설정을 작성하는 것은 지원되지 않습니다.
LogbackValve를 확장하여 개별적으로 구현하기 어렵기 때문에 대안으로 logback-access-spring-boot-starter를 사용하는 것이 좋습니다.
https://github.com/akkinoc/logback-access-spring-boot-starter