예외를 로그에 단일 레코드로 기록 할 수 있어야합니다. 그러면 Kibana / Elasticsearch에서 문제를 훨씬 쉽게 조사 할 수 있습니다. slf4j에 대한 Document에서 알 수 있듯이 Logger 인터페이스는 메시지가 Strings
여야합니다. Logger에 전달하기 전에 예외 메시지에서 개행 문자를 제거하는 유일한 옵션입니까?
컨텍스트를 위해 다음을 사용하고 있습니다.
- .m2 / repository / org / slf4j / slf4j-api / 1.7.28 / slf4j-api-1.7.28.jar
- 자바 11
- Spring Boot 버전 2.1.8.RELEASE
이것은 내 커스텀 예외 처리기의 잘린 버전입니다.
import my.error.Error; // custom Error class
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private void logError(Error error, Exception ex){
logger.error(String.format("id: %s, message: %s", error.getId(), ex.getMessage()), ex);
}
}
처음에는 src / main / java / resources
내에서 logback.xml
파일을 변경하여 로깅 동작을 변경하려고했습니다. 불행히도 이것은 아무것도하지 않는 것처럼 보이므로 지금 만들고있는 CustomExceptionHandler
가 logback.xml
파일에 설정된 사양을 무시하고 있다고 가정합니다. 특히 < encoder >
의 < pattern >
이 다른 연구에 따라 변경되었습니다. 모든 개행 문자를 바꾸려고합니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" debug="true">
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/gateway.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/archived/gateway/gateway.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- each archived file, size max 5MB -->
<maxFileSize>5MB</maxFileSize>
<!-- total size of all archive files, if total size > 10GB, it will delete old archived file -->
<totalSizeCap>10GB</totalSizeCap>
<!-- 30 days to keep -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d %p %c{1.} [%t] %m MULTIEXCEPTION %replace(%xException){'\n','\u2028'}%nopex%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE-ROLLING" level="DEBUG" additivity="false"/>
</root>
<springProfile name="local">
<logger name="my.gateway" level="TRACE" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE-ROLLING" />
</logger>
<logger name="com.netflix" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="org.springframework" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="com" level="INFO" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="gov" level="INFO" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="org" level="INFO" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
</springProfile>
</configuration>