본문 바로가기

프로젝트/미니 프로젝트

원격 로그 수집 시스템 구성하기 (elastic stack)

사내에서 로그를 보는 경우 SSH 접속을 통해 해당 파일에 접근 하고 tail과 grep등을 활용하여 특정 시점에 대해 찾아가는식으로 많이 진행을 했었다.

하지만 이렇게 진행하게 되는 경우 여러가지 이슈가 있었는데 

  1. 각 서버마다 일일히 ssh 접속을 통해 시점을 찾아가기가 불편하다.
  2. 특정사유로 ssh서버에 접근이 불가능한 경우 로그 파악을 할수 없다.

이러한 사유들로 인해 한가지 서버에서 로그들을 수집해서 종합적으로 조회할수 있는 로그 수집 시스템이 필요했고 이를 위해 공부하다보니 Elastic stack에 대해 알수 있었다.

 

Elastic Stack

  • Logstach
    • 데이터를 동적으로 수집 및 전환& 전송
  • Beats 
    • 경량 데이터 수집기로써 logstash에 비해 가볍다.
  •  Elasticsearch
    • 분산형 RESTful 검색및 분석 엔진
    • 검색엔진으로 많이 활용되고 있다.
  • Kibana
    • Elasticsearch의 데이터를 시각화 하고 탐색할수 있게 하는 인터페이스

 

 

Elastic Stack

 

 

이렇게 정보를 파악하고 나서 이제 간단한 설계를 진행했다.

 

 

설계 순서는 다음과 같다.

  1. beats중 하나인 파일 수집기 filebeats를 활용해 각 서버별로 위치한 로그의 파일을 수집
  2. 수집한 데이터는 로그 조회 서버의 logstash에 전송
  3. logstash에서 데이터 가공을 마치면 elasticsearch에 전송
  4. kibana를 통해 시각화 

 

 logstash에 비해 filebeats가 훨씬 가볍기 때문에 운영중인 서버에 영향을 미치지 않아 filebeats를 통해 전송하는것을 채택하였다.

 

구현하기 

 

로그 조회 시스템 구현

 

설계를 마쳤고 이제 구현을 하기로 하였다.

 

일단 먼저 로그 조회 서버의 파트는 docker-elk를 활용하기로 하였다. 

 

https://github.com/deviantony/docker-elk

 

GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

The Elastic stack (ELK) powered by Docker and Compose. - GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

github.com

 

docker-compose를 활용해 손쉽게 elk stack를 구축해주기 때문에 해당 파트 구축은 손쉽게 할 수 있었다.

 

위에 명시한 대로 따라 진행해서 따로 내용은 적지 않았다.(해당 구축한 서버의 IP:5601 포트를 활용해 접근)

 

로그인까지 진행 완료

 

각 서버별 filebeats 시스템 구현

 

로그 조회 서버 파트는 마무리 되었기 때문에 이제 filebeats를 각 서버별로 구축할 차례이다.

filebeats는 docker image가 있어서 docker-compose 상에 띄워두기로 하였다.

 

docker-compose.yml

version: "3"

services:

  filebeat:
    image: elastic/filebeat:8.5.0
    container_name: filebeat
    restart: always
    volumes:
      - ./conf/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
      - 조회할 로그의 위치/:/logs/host

    environment:
      - TZ=Asia/Seoul
  1. elastic에서 만들어둔 filebeat에 대한 이미지를 가져오고
  2. volumes를 통해 conf/filebeat.yml 을 통해 설정값을 변경
  3. volumes를 활용해 기존 로그 파일들의 위치와 logs/host를 동기화 

 

 

2에서 설정해둔 conf/filebeat.yml을 만들어봤다.

 

 

conf/filebeat.yml

filebeat.inputs:
- type: filestream
  encoding: utf-8
  id: my-filestream-id
  paths:
        - /logs/host/test.log

output.logstash:
        #codec.json:
                #pretty: true
        hosts: [로그조회서버의IP:5044]

 

codec.json 을 활성화 해서 보내게 되면 log가 json 형식으로 전송된다. 

 

위와같이 셋팅을 마치고 docker-compose up -d 로 실행 후 서버에 보내게 되면

 

왼쪽 상단 메뉴 -> Logs 클릭

 

 

Stream 파트에서 로그 조회 가능 ( 내용은 가려놓았다.)

 

 

마무리

위처럼 로그를 구현하고 나니 이제 더이상

  1. 각 서버마다 일일히 ssh 접속을 통해 시점을 찾아가기가 불편하다.
  2. 특정사유로 ssh서버에 접근이 불가능한 경우 로그 파악을 할수 없다. 

위 사항에 대한 문제가 발생하지 않았고 확실하게 로그를 한번에 볼수 있다는 점에서 너무나도 편리했다.

또한 elastic search를 통해 검색엔진을 구현할수도 있다고 하여 추후 사내 시스템을 검색엔진을 통해 검색할수 있도록 만들고 싶었다.