프로그램/JAVA

[ELK] SpringBoot + ELK 연동 및 사용하기

프뚜 2022. 11. 25. 13:52
728x90
반응형
SMALL

안녕하세요!

프뚜(프로그래머 뚜)입니다!

 

SpringBoot에서 API, AUTH, PORTAL log를 생성 후 출력합니다.

Logstash에서 생성된 로그 파일을 input으로 가져옵니다.

Logstash에서 가져온 로그를 filter를 통해 정리 후 ElasticSeach로 보냅니다.

Kibana에서 ElasticSearch 설정 및 UI를 제공합니다.


[개발 환경]

 - OS: windows 10 64bit

 - JAVA: 1.8

 - ElasticSearch: 7.2.0

 - Logstasg: 7.2.0

 - Kibana: 7.2.0


1. SpringBoot > logback.xml 설정하기
// 2022.11.23[프뚜]: logback
implementation 'net.logstash.logback:logstash-logback-encoder:7.2'

build.gradle에 jar를 추가합니다.

 

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!-- 2022.11.25[프뚜] 파일 최대 용량 -->
    <property name="MAX_FILE_SIZE" value="50MB"/>
    
    <!-- 2022.11.25[프뚜] 파일 최대 저장일자 -->
    <property name="MAX_HISTORY" value="7"/>
    
    <!-- 2022.11.25[프뚜] 파일명 -->
    <property name="API_LOG_PATH_NAME" value="c:/works/test/API.log"/>
    <property name="AUTH_LOG_PATH_NAME" value="c:/works/test/AUTH.log"/>
    <property name="PORTAL_LOG_PATH_NAME" value="c:/works/test/PORTAL.log"/>

	<!-- 2022.11.25[프뚜] API -->
	<appender name="api" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${API_LOG_PATH_NAME}</file>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${API_LOG_PATH_NAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <maxHistory>${MAX_HISTORY}</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} | %m%n</pattern>
        </layout>
    </appender>

	<!-- 2022.11.25[프뚜] AUTH -->
    <appender name="auth" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${AUTH_LOG_PATH_NAME}</file>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${AUTH_LOG_PATH_NAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <maxHistory>${MAX_HISTORY}</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} | %m%n</pattern>
        </layout>
    </appender>

	<!-- 2022.11.25[프뚜] PORTAL -->
    <appender name="portal" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PORTAL_LOG_PATH_NAME}</file>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${PORTAL_LOG_PATH_NAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <maxHistory>${MAX_HISTORY}</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} | %m%n</pattern>
        </layout>
    </appender>

	<!-- 2022.11.25[프뚜] tistory.petoo.api package -->
    <logger name="tistory.petoo.api" level="INFO" additivity="false">
        <appender-ref ref="api"/>
    </logger>

	<!-- 2022.11.25[프뚜] tistory.petoo.auth package -->
    <logger name="tistory.petoo.auth" level="INFO" additivity="false">
        <appender-ref ref="auth"/>
    </logger>
    
    <!-- 2022.11.25[프뚜] tistory.petoo.portal package -->
    <logger name="tistory.petoo.portal" level="INFO" additivity="false">
        <appender-ref ref="portal"/>
    </logger>
</configuration>

./src/resources/logback.xml에 적용합니다.

 

 

logback에 설정되어있는 package 기준으로 class를 생성합니다.

 

 

new Thread(() -> {
    while (true) {
        try {
            log.info("{\"id: \"1\", \"name\": \"api\"}");
            Thread.sleep(2000);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}).start();

테스트 출력(json)을 합니다. (name 만 다를 뿐 api, auth, portal 내용 같습니다.)


2. Logstash, ElasticSearch, Kibana 다운로드 하기

 

Logstash(링크)

 

ElasticSearch(링크)

 

Kibana(링크)

WINDOWS를 클릭해서 다운로드 받습니다.

 


3. ElasticSearch 실행하기
[경로]/elasticsearch-7.2.0/bin/elasticsearch

실행 후 default port로 접속합니다. (http://127.0.0.1:9200)

 


4. Kibana 실행하기
[경로]/kibana-7.2.0-windows-x86_64/bin/kibana.bat

실행 후 default port로 접속합니다. (http://127.0.0.1:5601)

 


5. logstash 설정 및 실행하기
[경로]/logstash-7.2.0/config/pddo.conf

input {
	file {
		path => "C:/works/test/API.log"
		type => api
	}
	file {
		path => "C:/works/test/AUTH.log"
		type => auth
	}
	file {
		path => "C:/works/test/PORTAL.log"
		type => portal
	}
}
filter {
	dissect {
		mapping => {
			"message" => "%{timestamp} | %{message}"
		}
	}
	date {
		match => ["timestamp", "ISO8601", "YYYY-MM-dd HH:mm:ss,SSS"]
	}
	json {
		source => "message"
	}
}
output {
	if [type] == "api" {
		elasticsearch {
			codec => json
			hosts => ["http://localhost:9200","http://127.0.0.1:9200"]
			index => "api"
		}
	}
	if [type] == "auth" {
		elasticsearch {
			codec => json
			hosts => ["http://localhost:9200","http://127.0.0.1:9200"]
			index => "auth"
		}
	}
	if [type] == "portal" {
		elasticsearch {
			codec => json
			hosts => ["http://localhost:9200","http://127.0.0.1:9200"]
			index => "portal"
		}
	}
}

1. input에서 file을 읽어옵니다.

2. filter에서 읽어온 데이터를 정제합니다.

3. output에서 각 type에 맞는 데이터를 elasticesarch로 전달합니다.

 

 

[경로]/bin/logstash -f [경로]/config/pddo.conf

실행합니다. 


자세한 내용은 소스코드를 통해 확인해보실 수 있습니다. (제목과 Git Comment는 같습니다.)

https://github.com/JeongSeongSoo/spring-tistory

 

GitHub - JeongSeongSoo/spring-tistory

Contribute to JeongSeongSoo/spring-tistory development by creating an account on GitHub.

github.com

728x90
반응형
LIST