일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- laravel
- mysql
- C언어
- android ImageLoad
- 삼량진
- ImageLoad
- 안드로이드 이미지 로드
- httpclient post
- 창원에서 부산
- workbench
- 낙동강 종주
- android facebook
- c언어 구조체
- android loadImage
- 부산에서 창원
- 부산에서 창원 자전거
- volley
- spring boot
- 구포에서 삼량진
- 자바
- spring
- android imageView zoom
- 구조체
- 자전거
- NetworkImageView
- 로드바이크
- 구포에서 자전거
- image zoom
- 삼량진 자전거
- elk stack
- Today
- Total
은근한
Spring boot LogBack for ELK Stack 본문
로그 관리는 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