You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

스프링내에 발생하는 수많은 로그를 즉시 수집하고 엘라서틱서치와 연동하기 위한 방법

(lightbulb) 엘라스틱서치를 기본적으로 사용가능한 대상으로 정리하였습니다.


목표:

  • 기존 사용하는 로그(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의 필드가, 정확하게 엘라스틱이 이해하는 필드명이 되면 성공입니다.

이것이 중요한 이유는, 추후 이렇게 정의된 필드를 통해서 다양한 집계처리및 리포팅이 가능하기때문입니다.




  • No labels