Spring Boot 프로젝트

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 파일이며 다음과 같습니다.

https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/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를 사용자 정의할 수 있습니다.

https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#web.servlet.embedded-container.customizing.programmatic

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