일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- fine-grained
- NestJS
- 멀티테넌시
- typeorm
- 어드민 페이지
- coarse-grained
- API 설계
- SW마에스트로
- nestjs libraries
- API 개발
- 권한검증
- java
- jest
- 파일조회
- 셀렉트어드민
- 오블완
- 책임부과
- 추상 클래스
- 오브젝트
- YouTube Data API
- 자바
- nestjs decorator
- Connection pool
- SROOM
- mailerservice
- 티스토리챌린지
- Mock
- nestjs library
- monorepo
- guard
- Today
- Total
독산구너
ELK (ElasticSearch, Logstash, Kibana) 도입 본문
글의 목적
스프링 서버에서의 INFO 레벨 로그를 kibana를 통해 시각화, 분석하는 과정을 설명하고자 합니다.
ELK
로그는 LogStash를 통해 검색 엔진인 ElasticSearch로 전달되고, Kibana는 ElasticSearch에서 빠른 검색을 통해 데이터를 시각화 및 분석하게 됩니다.

스프링에서의 로그, Logstash
스프링 로그는 Java에서 가장 많이 사용되었던 로깅 라이브러리인 log4j의 후속 버전인 Logback을 통해 로그 전송 설정이 가능하다.
src/main/resource에서 xml 파일인데, 다음과 같이 설정했다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy:MM:dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{35} : %msg %n</pattern>
</encoder>
</appender>
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>15.164.211.181:5000</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="stash"/>
</root>
</configuration>
이때 appender는 로그를 어떤 방식으로 넣을 것인지 설정하는 것으로, 다음과 같은 옵션이 있다.
- ConsoleAppender: 콘솔에 로그를 기록
- FileAppender: 파일에 로그를 기록
- RollingFileAppender: 여러 개의 파일을 순회하며 로그를 기록
- SMTPAppender: 로그를 메일로 기록
- DBAppender: 데이터베이스에 로그를 기록
- LogstashTcpSocketAppender: tcp 통신을 통해 로그를 전송
로그 레벨을 알려진 것과 같이 다음과 같다.
- ERROR: 요청을 처리하는 중 오류가 발생한 경우 표시한다.
- WARN: 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타낸다.
- INFO: 상태변경과 같은 정보성 로그를 표시한다.
- DEBUG: 프로그램을 디버깅하기 위한 정보를 표시한다.
- TRACE: 추적 레벨은 Debug보다 훨씬 상세한 정보를 나타낸다.
따라서 위와 같은 설정은 콘솔에 로그를 출력할 뿐 아니라 Logstash 서버로 로그를 보내는 것까지 포함한다.
여기서 ip 설정은 elk 가 설치된 ec2의 ip 이다.
ELK 설치
elk는 ec2에서 설치했으며, ElasticSearch, Logstash, Kibana를 각각 설치할 수 있지만 다음과 같이 git clone을 통해 한꺼번에 설치가 가능하다. 이때는 docker-compose를 사용한다.
git clone https://github.com/deviantony/docker-elk.git
파일 구조는 다음과 같다.

많은 블로그에 나와있는 내용과 다르게 지금은 docker-stack.yml 파일이 없다. .env 편집을 통해 비밀번호를 설정해줘야 한다.

여기서 '-----' 으로 되어있는 부분을 비밀번호 수정해줘야 하며, ElasticSearch 에 접속하여 아이디, 비밀번호를 입력할 때 사용된다 (아이디는 elastic)
다음으로 docker-compose.yml을 수정해주어야 한다.
복잡하므로 참고한 글을 첨부한다.
https://mattjhayes.com/2023/07/26/build-an-elk-stack/
Build an ELK Stack
When I had a need to visualise telemetry data from a home project, the ELK stack was my go-to solution. The ELK stack (Elasticsearch, Logstash, Kibana) is an open-source-ish[i] tool for ingesting, …
mattjhayes.com
모든 설정 이후,docker-compose up을 통해 실행 가능하다.
물론, ec2에서 보안그룹 수정을 통해 Logstash(5000 포트, 임의 설정), kibana(5601 포트)를 열어주어야 한다. (로그를 전달할 ip, elasticsearch 접속 가능한 ip)
이렇게 실행이 완료되면 Ec2의 ElasticSearch에 접속 가능하다. 아이디는 elastic, 비밀번호는 .env에서 설정한 ElasticSearch 비밀번호이다.

로그인하고 Analytics -> Discover를 확인해 스프링 서버에서 전달한 로그가 제대로 저장되고 있는지 확인한다.

로그를 활용해 시각화, 분석하는 과정은 다음 글에서 작성하겠습니다.
'프로젝트 > [SW마에스트로] SROOM' 카테고리의 다른 글
Dto, Vo, Entity의 차이점과 쓰임에 대해서 (4) | 2023.10.24 |
---|---|
데이터 중심 설계에서 책임 주도 설계로 ('오브젝트'를 읽고) -2 책임 주도 설계 과정(강의등록) (3) | 2023.10.15 |
데이터 중심 설계에서 책임 주도 설계로 ('오브젝트'를 읽고) -1 기존 프로젝트 문제점 발견 (0) | 2023.10.15 |
Youtube Data API 사용기 - 추상클래스 사용해서 url 생성 (0) | 2023.09.11 |
Youtube Data API 사용기 - 추상클래스 이용 (0) | 2023.08.21 |