Spring boot와 EK스택 연결하기
- Spring
- 2021년 3월 24일
현재 진행하고있는 spring boot 프로젝트에 쿼리 통계를 위해 ElasticSearch와 Kibana를 도입하기로 했고 이에 맞게 로깅방법이나 세팅 방법을 기록하기 위해 글을 작성하게 됬다.
구성은 다음과 같은데 서버로 EC2 프리티어를 사용하고 있어 사양이 안좋기 때문에 서버 내부에 logstash없이 filebeat를 이용하여 로그를 전송하기로 했다. ELK스택으로는 Elastic Cloud 프리티어를 이용해 빠르게 구축하는 것을 테스트해볼 생각이다.
1. spring boot에 로그 설정
우선, filebeat에서 file을 이용해 log를 감시하게 할 목적이기 때문에 springboot에서 log를 파일로 저장되게 해주어야한다.
spring boot는 내부에 기본 로깅프레임워크로 logback이 설정되어 있고, slf4j와 bridge모듈을 함께 포함하고 있기 때문에 별도의 라이브러리는 추가해주지 않아도 된다. 그리고 Lombok을 사용중이라면 @Slf4j어노테이션을 붙이면 쉽게 이용이 가능하다.
1) 라이브러리 추가
log message를 ELK가 읽을 수 있는 json형태의 로그로 변경을 위해 logstash-logback-encoder를 추가해주어야 한다.
// https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder
implementation group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '6.3'
2) logback 설정
spring.profiles.active=local
logging.config=classpath:logback-${spring.profiles.active}.xml
./src/main/resources/ 에 logback-spring.xml 를 추가하여 logback설정을 해줄 수 있는데 application.properties 파일로 개발/프로덕션 환경에 따른 설정을 해줄 수 도 있다.
<!--logback-spring.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="CONSOLE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %magenta(%-4relative) --- [ %thread{10} ] %cyan(%logger{20}) : %msg%n"/>
<property name="LOG_PATH" value="./logs"/>
<property name="FILE_NAME" value="wetayo-logs"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${FILE_NAME}-json.log</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${FILE_NAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>90</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level = "INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
RollingFileAppender를 이용하여 file로 log를 저장하며 encoder의 속성으로 logstashEncoder를 주어 자동으로 json포맷에 맞게 변경시켜주도록 설정을 해주었다.
2. Filebeat 설치 및 설정
1) 설치
나는 EC2에 Ubuntu 20.04를 사용하고 있고, 공식 사이트 를 참고하여 filebeat를 설치 해주었다.
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.12.0-amd64.deb
sudo dpkg -i filebeat-7.12.0-amd64.deb
2) 설정파일 수정
sudo vi /etc/filebeat/filebeat.yml
설치가 완료되었다면 filebeat.yml 파일을 수정하여 input 모듈, output할 logstash/elastic search/kibana를 설정해주어야 한다.
설정하는 법도 공식 사이트 에 잘 나와있어 개인상황에 맞게 설정해주면 될 것 같다.
input
filebeat.input:
- type: log
enabled: true
path: "/home/gowoo/logs/*.log"
이번에는 특정 모듈(nginx, mysql…)들의 로그가 아닌 별도의 로그파일을 input으로 관리할 것이기 때문에 다음과 같이 추가해주었다.
output
cloud.id: "cloudId"
cloud.auth: "username:passwd"
내부/외부 서버에 ELK를 설치하여 사용한다면 각 ip로 설정을 해주면 되고, 나는 Elastic Cloud를 이용하고 있어 cloud:로 쉽게 연결을 할 수 있었다.
또한, 간단한 로깅이기 때문에 filtering은 필요성을 못느껴 별도의 logstash는 사용하지 않았고 index pattern도 기본인 filebeat-*로 해도 괜찮다고 판단해 추가는 해주지 않았다.
3) 설정파일 등록(Set up)
sudo filebeat setup -e
를 입력하면 설정파일이 등록이 되며 이 단계에서 각종 output이 연결되었는 지 확인하는 등에 작업을 거치게 된다.
그런데 여기서 –machine-learning 모듈부분에서 자꾸 에러가 발생했는데 나는 ml기능을 이용하지 않기때문에 이를 제외하고 사용하는 설정만 setup시켜 주었다.
sudo filebeat setup -e --dashboards --templete //output연결 검사
4) filebeat 실행
sudo service filebeat start
sudo service filebeat status
start로 실행시키고 status로 정상적으로 enabled되었는지 확인이 가능하다.
3. Kibana로 확인
우선 서비스를 돌리고 log를 생성시켜준 후 path로 잡아준 경로에 log파일이 잘생성되었는 지 확인을 해보자.
log들은 잘 생성 되었으니, kibana에 접속해 Discover에 index pattern으로 filebeat-*를 검색해보면 다음과 같이 로그들이 수집된 것을 볼 수 있다.
만일 아무 로그가 보이지 않는다면 기본 설정이 15분전 이므로 데이터가 포함되어있는 기간으로 설정해주면 안보이던 데이터가 보일 것이다.
1) 나만의 앱 생성
메뉴에 visualize -> Create visualization -> (다양한 앱들 중 선택) 을 통해 로그를 특정 필터에 맞게 앱을 생성할 수 있다.
예를 들어 쿼리들의 종류에 대한 분포를 pie로 보여주고자 한다면 Aggregation based의 pie를 선택하고 index pattern 으로 filebeat-*을 이용해 만들 수 있다.
여기서, 나는 logstash를 이용해 쿼리종류들마다 field들을 다르게 추가해준다던지의 작업은 하지 않았기 때문에 filter옵션으로 message의 내용을 filtering해 항목들을 추가해 bucket에 담아 주었다.
bucket에 담고 update를 하고 날짜 수정을 해주면 이쁘게 잘 보이는 것을 볼 수 있다.
logstash 없이 filebeat와 Elastic Cloud를 이용해 쉽게 로그관리를 한번 해보았는데 확실히 Elastic Cloud를 이용하니 쉽게 되고 좋았는데 프리티어가 끝나게 되면, 학생입장으로써 가격이 부담되서 개인 서버로 새로 구축하게 될 것 같다.
Reference
https://www.elastic.co/guide/en/beats/filebeat/current/index.html