스프링내에 발생하는 수많은 로그를 즉시 수집하고 엘라서틱서치와 연동하기 위한 방법
엘라스틱서치를 기본적으로 설치및 사용가능하고 java에서 logback의 로그기능 셋팅을 할수 있어야합니다.
목표:
- 기존 사용하는 로그(LogBack)기능을 사용하여 , 폴링방식이아닌 실시간 방식으로 연동
- LogBack의 SocketAppend가 사용됨
- 집계를 위해서 보고되는 필드처리가 Json화되어여함
LogStash셋팅
logstash.conf
# [Beats input plugin] # listen on port 5044 for incoming Beats connections input { tcp { port => 5044 codec => json_lines } } filter { json { source => "message" } } # [Elasticsearch output plugin] # index into Elasticsearch output { elasticsearch { hosts => "localhost:9200" manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }
의존Lib 셋팅
<!-- LogBack for LogStash --> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.1</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> </dependency>
LogBack.xml 설정
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <keepAliveDuration>5 minutes</keepAliveDuration> <reconnectionDelay>10 second</reconnectionDelay> <waitStrategyType>sleeping</waitStrategyType> <writeBufferSize>16384</writeBufferSize> <destination>180.70.98.37:5044</destination> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <version>6</version> </encoder> </appender> <logger name="org.springframework.data" level="error" /> <root level="info"> <appender-ref ref="STASH"/> </root> </configuration>
Log에 사용되는 Class
import java.io.Serializable; import com.fasterxml.jackson.databind.ObjectMapper; public class InFlowLog implements Serializable { // 로그를 정의한다. @Override public String toString() { ObjectMapper mapper = new ObjectMapper(); String jsonString =""; try { jsonString = mapper.writeValueAsString(this); } catch(IOException e) { jsonString = "jsonerror"; } return jsonString; } }
Log에 사용되는 Class
InFlowLog addLog = new InFlowLog(); logger.info( "{}",addLog.toString() ); //이것이 의미가 있는 로그....
연동결과 확인
우리가 정의한 로그 Class의 필드가, 정확하게 엘라스틱이 이해하는 필드명이 되면 성공입니다.
이것이 중요한 이유는, 추후 이렇게 정의된 필드를 통해서 다양한 집계처리및 리포팅이 가능하기때문입니다.