Spring boot와 EK스택 연결하기

현재 진행하고있는 spring boot 프로젝트에 쿼리 통계를 위해 ElasticSearchKibana를 도입하기로 했고 이에 맞게 로깅방법이나 세팅 방법을 기록하기 위해 글을 작성하게 됬다.


alter-text
diagram

구성은 다음과 같은데 서버로 EC2 프리티어를 사용하고 있어 사양이 안좋기 때문에 서버 내부에 logstash없이 filebeat를 이용하여 로그를 전송하기로 했다. ELK스택으로는 Elastic Cloud 프리티어를 이용해 빠르게 구축하는 것을 테스트해볼 생각이다.



1. spring boot에 로그 설정

우선, filebeat에서 file을 이용해 log를 감시하게 할 목적이기 때문에 springboot에서 log를 파일로 저장되게 해주어야한다.

spring boot는 내부에 기본 로깅프레임워크로 logback이 설정되어 있고, slf4jbridge모듈을 함께 포함하고 있기 때문에 별도의 라이브러리는 추가해주지 않아도 된다. 그리고 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로 확인

alter-text
logs

우선 서비스를 돌리고 log를 생성시켜준 후 path로 잡아준 경로에 log파일이 잘생성되었는 지 확인을 해보자.


alter-text
discover

log들은 잘 생성 되었으니, kibana에 접속해 Discover에 index pattern으로 filebeat-*를 검색해보면 다음과 같이 로그들이 수집된 것을 볼 수 있다.


alter-text
day

만일 아무 로그가 보이지 않는다면 기본 설정이 15분전 이므로 데이터가 포함되어있는 기간으로 설정해주면 안보이던 데이터가 보일 것이다.



1) 나만의 앱 생성

메뉴에 visualize -> Create visualization -> (다양한 앱들 중 선택) 을 통해 로그를 특정 필터에 맞게 앱을 생성할 수 있다.


alter-text
pie

예를 들어 쿼리들의 종류에 대한 분포를 pie로 보여주고자 한다면 Aggregation based의 pie를 선택하고 index pattern 으로 filebeat-*을 이용해 만들 수 있다.


alter-text
bucket

여기서, 나는 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

Related Posts

Array와 List

Array와 List

1. 배열 가장 기본적인 자료구조로써, 논리적 저장 순서와 물리적 저장 순서가 일치하고 인덱스를 통하여 원소에 접근이 가능하다. 대부분의 언어에서 [] 를 이용해서 배열을 제공한다. 2. 리스트 배열과 달리 원소들 간의 논리적인 순서로 연결되어 구성있고, 삽입과 삭제를 수행하기 위해서는 첫 원소부터 모두 search해야한다. 자료구조 Tree에 기본이...

Read More
5분 와인

5분 와인

  • Books
  • 2021년 4월 21일

제목에서 그대로 보이듯이 와인에 대해 깊고 많은 역사를 알려주는 책이 아닌 집에서 보관방법, 와인 구매장소, 마트에서 좋은 와인 고르기, 선물용 와인 등 과 같이 가벼운 내용위주의 책들이라 간단하게 보기 좋고 책에서 언급하는 대로 아는 체,있어보이는 척 하기에 괜찮은 책이다. 샴페인을 한번 먹어본 이후로 화이트와인과 스파클링 와인에 빠져서 화이트와인을...

Read More
블로그 첫 시작 👋

블로그 첫 시작 👋

우선, 나는 말수가 적은 편이다. 말을 적게한다고 생각을 안하는 것이 아니라 머리속에서 생각은 정말 많으나, 그것을 입밖으로 꺼낼때 정리가 되지 않아 버벅거리기도 하고, 조사를 잘못 선택하여 말을 하거나 말을 하는 도중에 머리속이 꼬여 중간에 말을 멈추기도 한다. 말은 생각을 언어로 바꾼 것이기 때문에 많은 생각들을 정리하는 연습과 맞춤법, 올바른 조사사...

Read More