본문 바로가기
ELK Stack

[Logstash] logstash로 로그 파일 elasticsearch와 연동시키기

by Marades 2021. 10. 7.
반응형

회사에서 수집만 해두고 전혀 사용하지 않고 박아두는 로그 데이터가 있었다. 충분히 의미 있는 로그인 것 같음에도 서버 어딘가에 박혀있는 것이 아쉬워서 (심지어 한 파일에 태초부터 쌓여온 데이터는 어느새 100메가가 넘는 괴물이 되어있었다.) 빛을 보게 하고자 ELK 스택과 연동시켜주기로 했다. 이건 그 과정을 기록한 일기이다.

 

먼저 ubuntu 환경에서 진행하였다

 

1. JDK 설치

먼저 해당 서버에 JDK를 설치해주어야한다.

나는 JDK 11 버전을 설치해주었지만

 

1. Logstash 버전을 7.11.x 이전 버전에서 7.12 이후 버전으로 업그레이드 했을 때

2. JDK 15 버전 이상을 사용

 

만약 위와 같은 경우에는 https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html#jdk15-upgrade 이 링크를 참고하여 추가적인 작업을 더 해주어야한다.

 

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt install openjdk-11-jdk

java -version
# openjdk version "11.0.11" 2021-04-20

 

JDK를 설치해준 후에는 환경변수 설정을 해주어야 한다. ~/.bashrc 파일에 아래의 코드를 추가해주자

# ~/.bashrc
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME/bin

 

2. Logstash 설치

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

sudo apt-get update && sudo apt-get install logstash

위와 같이 logstash를 설정해주면 /etc/systemd/system/logstash.service 이 생겨있고 /etc/logstash 폴더가 생겨있다.

이 파일과 폴더에 설정을 추가해줄 것이다.

 

3. Config 파일 작성

3-1. /etc/logstash/~.config

# /etc/logstash/~.config
input {
  file {
    path => "{읽어 들여올 로그 경로"
    codec => json # 로그 파일 형식은 json
  }
}

output {
  elasticsearch {
    hosts => ["{엘라스틱 서치가 설치된 서버 주소}:9200"]
    index => "{엘라스틱 서치에 저장될 인덱스 이름. 없으면 생성됨}"
  }
}

경로는 다른 곳이여도 상관없지만 해당 경로에 Logstash 설정파일을 만들어준다. input과 output을 지정해주는 간단한 형식이며 이후 filebeat등과 연동하거나 filter를 넣어주는 등 다양하고 강력한 기능을 제공해준다.

 

3-2. /etc/systemd/system/logstash.service

# /etc/systemd/system/logstash.service
[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/etc/default/logstash
EnvironmentFile=-/etc/sysconfig/logstash

# 원래 기본으로 설정 되있는 코드
# ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"

# 뒷 부분에 f 옵션으로 위에서 만들어준 설정 파일로 실행되도록 지정해준다.
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" -f /etc/logstash/lms-search-keyword.confg

Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

# When stopping, how long to wait before giving up and sending SIGKILL?
# Keep in mind that SIGKILL on a process can cause data loss.
TimeoutStopSec=infinity

[Install]
WantedBy=multi-user.target

 

3-3. 변경된 시스템 파일 적용

sudo systemctl daemon-reload

 

4. 실행

sudo systemctl start logstash.service

위의 코드를 통해 실행하면 지정해준 경로에 새로 들어오는 로그들이 Elasticsearch로 들어가게 된다

 

하.지.만.

 

/usr/share/logstash/bin/logstash

시스템 서비스에로 실행하는 것이 아니라 위 경로에 있는 Logstatsh 실행파일로 실행해보면

Path "/usr/share/logstash/data" must be a writable directory.

위와 같은 에러가 발생할 것이다.

 

Logstash 서비스에 chown으로 권한을 줄 수도 있다고 하지만 나는 chmod를 사용하여 777 권한을 부여해주었다.

sudo chmod 777 /usr/share/logstash/data

 

 자 이제 키바나를 확인해보면!?

로그들이 잘 쌓이는 것을 알 수 있다!

반응형