첫번째로 할일은 build.gradle에 logback encoder를 추가 해줍니다.


compile group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '5.2' // Log를 JSON 형식으로 표현하기 위해 사용


그다음에는 로그 포멧을 위해 Java Class 파일 2개를 생성합니다.


패키지 위치는 해당 프로젝트 아래에만 있으면 됩니다. 저는 이렇게 두개를 만들었습니다.


package kr.co.eda.kbn.logback;

import com.fasterxml.jackson.databind.MappingJsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.util.StdDateFormat;
import net.logstash.logback.decorate.JsonFactoryDecorator;

/**
* ISO08601 데코레이터
*
* @since 2018-12-19
* @see {@link JsonFactoryDecorator}
*/
public class ISO8601DateDecorator implements JsonFactoryDecorator {

@Override
public MappingJsonFactory decorate(MappingJsonFactory factory) {

ObjectMapper codec = factory.getCodec();
codec.setDateFormat(new StdDateFormat());

return factory;
}
}

원래는 ISO08601DateFormat를 썻지만 현재 사용하는 logback encoder에서 Deprecated가 되어서 StdDateFormat를 사용하였습니다.


package kr.co.eda.kbn.logback;

import com.fasterxml.jackson.core.JsonGenerator;
import net.logstash.logback.decorate.JsonGeneratorDecorator;

/**
* 로그를 JSON으로 출력하기 위한 데코레이터
*
* @since 2018-12-19
* @see {@link JsonGeneratorDecorator}
*/
public class PrettyPrintingDecorator implements JsonGeneratorDecorator {

@Override
public JsonGenerator decorate(JsonGenerator generator) {

return generator.useDefaultPrettyPrinter();
}
}


마지막으로 실제 Spring 에서 로그를 설정하는 부분으로 가서 encoder를 지정해줍니다.


<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

<!-- Spring Boot의 logback 설정은 유지하면서 확장 -->
<include resource="org/springframework/boot/logging/logback/base.xml"/>

<!-- 로그 저장 할 위치 -->
<property name="LOG_DIR" value="D:/p_project/logs/" />

<appender name="dailyRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<prudent>true</prudent>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<jsonGeneratorDecorator class="kr.co.eda.kbn.logback.PrettyPrintingDecorator"/>
<jsonFactoryDecorator class="kr.co.eda.kbn.logback.ISO8601DateDecorator"/>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}kbn.%d{yyyy-MM-dd}.json</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 30일 전 까지의 로그만 저장 -->
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>

<logger name="org.springframework.web" level="INFO"/>
<logger name="org.thymeleaf" level="INFO"/>-
<logger name="org.hibernate.SQL" level="INFO"/>
<logger name="org.quartz.core" level="INFO"/>
<logger name="org.h2.server.web" level="INFO"/>

<logger name="jdbc" level="OFF" />
<logger name="jdbc.sqlonly" level="OFF"/>
<logger name="jdbc.sqltiming" level="DEBUG"/>
<logger name="jdbc.audit" level="OFF"/>
<logger name="jdbc.resultset" level="OFF"/>
<logger name="jdbc.resultsettable" level="DEBUG"/>
<logger name="jdbc.connection" level="OFF"/>

<root level="INFO">
<appender-ref ref="dailyRollingFileAppender" />
</root>
</configuration>

여기 파일에서 추가 된 부분은


<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<jsonGeneratorDecorator class="kr.co.eda.kbn.logback.PrettyPrintingDecorator"/>
<jsonFactoryDecorator class="kr.co.eda.kbn.logback.ISO8601DateDecorator"/>
</encoder>


이 부분 입니다.


이렇게 설정을 끝나고 로그를 찍고 난뒤 로그 파일을 열어보면




이렇게 로그가 JSON 형식으로 찍히는것을 볼 수 있습니다.

'Spring' 카테고리의 다른 글

[SBA] Spring Boot Admin Security 적용하기  (0) 2018.12.18
[SBA] Spring Boot Admin 띄워보기  (0) 2018.12.18

+ Recent posts