은근한

Spring boot LogBack for ELK Stack 본문

카테고리 없음

Spring boot LogBack for ELK Stack

EsJoo 2017. 8. 17. 23:46

로그 관리는 ELK Stack등을 이용한 중앙집중 기법을 사용하고자 한다.


ELK Stack을 사용해 로그를 수집할 경우 기본 텍스트보다 JSON형식의 로그를 사용하는 것이 효율적이다.


그래서 스프링 아티팩트에 logstash-logback-encoder 추가 (Maven)


<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.7</version>
</dependency>

* gradle을 사용하시는 분은 google에 'logstash-logback-encoder gradle'  라고 치면 나온다.




JSON 형식의 로그를 사용하기 위해 Decorator를 작성


따로 사용하기 위해 'logback' 패키지를 만들고 두 개의 파일을 작성한다.


package kaonashi.ryoko.logback;

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

public class PrettyPrintingDecorator implements JsonGeneratorDecorator{
@Override
public JsonGenerator decorate(JsonGenerator jsonGenerator) {
return jsonGenerator.useDefaultPrettyPrinter();
}
}


package kaonashi.ryoko.logback;

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

public class ISO8601DateDecorator implements JsonFactoryDecorator{
@Override
public MappingJsonFactory decorate(MappingJsonFactory mappingJsonFactory) {
ObjectMapper codec = mappingJsonFactory.getCodec();
codec.setDateFormat(new ISO8601DateFormat());
return mappingJsonFactory;
}
}


이에 대한 로그 환경 설정 파일은 application.properties에 작성하는 방법도 있지만 xml을 사용해서 설정하는걸 추천한다.


resources 내에 logback-spring.xml 파일을 생성한다. 


*https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html

파일 명은 logback-spring.xml 로!! 만들어야하면파일 경로 또한 resources/logback-spring.xml 이 되어야한다. 

( 경로 변경을 찾아봣는데 아직 못 찾았다..)


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="/var/log/application"/>
<!-- 콘솔 로그 출력 -->
<appender name="TEXT_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset> <Pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n</Pattern>
</encoder>
</appender>

<!-- Logstash JSON 형식으로 파일 로그 생성 -->
<!-- /var/log/applicaion/log.json 파일에 최신 로그 생성 -->
<!--/var/log/applicaion/log_2017-08-17.0.json 파일에 과거 로그 보관-->
<!-- 5MB 초과, 날짜 변경 시점마다 생성, 생성된지 3일 이상된 파일은 삭제 -->
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/log.json</File>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<jsonGeneratorDecorator class="kaonashi.ryoko.logback.PrettyPrintingDecorator"/>
<jsonFactoryDecorator class="kaonashi.ryoko.logback.ISO8601DateDecorator"/>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/log_%d{yyyy-MM-dd}.%i.json</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>3</maxHistory>
</rollingPolicy>
</appender>

<!-- INFO 레벨 이하 로그를 콘솔 및 파일로 출력 -->
<root level="INFO">
<appender-ref ref="TEXT_CONSOLE"/>
<appender-ref ref="JSON_FILE"/>
</root>

</configuration>

별도의 로깅 설정하지 않을 경우 Spring Boot 는 INFO 이하 레벨 (TRACE, DEBUG를 제외한 INFO, WARN, ERROR) 의 모든 로그를 콘솔에 출력한다.


이렇게 설정하고 Spring Boot를 실행하면  logback-spring.xml 에서 설정한 LOG_PATH에 대한 파일접근 퍼미션이 뜰 수도 있다.

ex) java.io.FileNotFoundException: Permission Denied .. 라는 에러


이럴땐 현재 OS는 MAC의 로컬이여서 terminal에서 log/application 내의 폴더 권한을 chmod로 권한을 따로 주면 된다.

ex) sudo chmod -R 777 /var/log/application     

* 777 은 권한에 대한 내용인 777은 잘 쓰이지 않는다. 적절한 권한을 주어야하면 755 or 644를 쓰는데 

숫자에 관한건 찾으면 금방 나온다.


 vi /var/log/application/log.json    <-- 터미널에서

JSON 형식으로 찍힌다!!




ELK log 수집을 위해 syslog 서버 등의 설정이 필요한데.. 나중에 ~ 따로 정리


출처!! 감사합니다.

http://jsonobject.tistory.com/243

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html