ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSON 또는 단일 행 문자열로 SLF4J 로깅 예외
    카테고리 없음 2020. 8. 17. 02:15

    질문

    예외를 로그에 단일 레코드로 기록 할 수 있어야합니다. 그러면 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>

    연결


    답변1

    내 logError 메서드를 다음과 같이 변경했습니다.

    import org.slf4j.MDC; // new import to add property
    // ... other imports from before
    
      private void logError(Error error, Exception exception){
        MDC.put("error id", error.getId().toString()); // add a new property to the thread context
        LOGGER.error(exception.getMessage(), exception);
        MDC.clear(); // remove all new properties after logging the error
      }

    내 새 pom.xml 파일 종속성 :

      <dependencies>
        <!-- logging -->
        <dependency>
          <groupId>net.logstash.logback</groupId>
          <artifactId>logstash-logback-encoder</artifactId>
          <version>5.2</version>
        </dependency>
    
        <dependency>
          <groupId>ch.qos.logback.contrib</groupId>
          <artifactId>logback-jackson</artifactId>
          <version>0.1.5</version>
        </dependency>
        <!-- ch.qos.logback.contrib.json.classic.JsonLayout -->
        <dependency>
          <groupId>ch.qos.logback.contrib</groupId>
          <artifactId>logback-json-classic</artifactId>
          <version>0.1.5</version>
        </dependency>
        <!-- Other dependencies -->
        <!-- ... -->
        <!-- ... -->
      </dependencies>

    새 logback.xml 파일 :

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE-ROLLING">
        <!-- Old encoder is removed: 
        <encoder>
          <pattern>%d %p %c{1.} [%t] %m%n</pattern>
        </encoder>
        -->
        <file>${LOG_PATH}/data.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
          <fileNamePattern>${LOG_PATH}/archived/data/data.%d{yyyy-MM-dd}.%i.log.gz
          </fileNamePattern>
          <!-- each archived file, size max 10MB -->
          <maxFileSize>10MB</maxFileSize>
          <!-- total size of all archive files, if total size > 20GB, it will delete old archived file -->
          <maxHistory>60</maxHistory>
          <!-- 60 days to keep -->
          <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!-- TODO : configure a pretty printer -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
          <provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
        </encoder>
      </appender>
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- TODO : configure a pretty printer -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
          <provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
        </encoder>
      </appender>
      <!-- The base logback configuration is removed, but note that this will also remove the default Spring start-up messages, so those need to be added back into the <root> 
      <include resource="org/springframework/boot/logging/logback/base.xml"/>
      -->
      <root level="INFO">
        <appender-ref ref="FILE-ROLLING"/>
        <appender-ref ref="CONSOLE"/> <!-- This adds Spring start-up messages back into the logs -->
      </root>
      <springProfile name="local">
        <logger additivity="false" level="TRACE" name="org.springframework.web">
          <appender-ref ref="CONSOLE"/>
        </logger>
      </springProfile>
      <springProfile name="dev">
        <logger additivity="false" level="DEBUG" name="org.springframework">
          <appender-ref ref="FILE-ROLLING"/>
        </logger>
      </springProfile>
      <springProfile name="prod">
        <logger additivity="false" level="DEBUG" name="my.app.path">
          <appender-ref ref="FILE-ROLLING"/>
        </logger>
        <logger additivity="false" level="DEBUG" name="org.jooq">
          <appender-ref ref="FILE-ROLLING"/>
        </logger>
        <logger additivity="false" level="DEBUG" name="org.springframework">
          <appender-ref ref="FILE-ROLLING"/>
        </logger>
      </springProfile>
    </configuration>

    SLF4J Document-매핑 된 진단 컨텍스트 (MDC)
    Baeldung 예-MDC Log4J2



     

     

     

     

    출처 : https://stackoverflow.com/questions/62679726/slf4j-logging-exception-as-json-or-single-line-string

    댓글

Designed by Tistory.