
[Logstash 의 필요성]
syslog-ng 를 설치해서 다른 서버의 로그를 중앙집중식 로그 관리를 한다.
Elasticsearch 를 설치해서 중앙집중된 대량의 로그를 빠르고 효율적으로 조회한다.
문제는 수집되는 로그가 터무니없이 길고, 가독성이 너무 떨어진다는 것.
로그 = 단순 문자열
Elasticsearch로 수 십만 건의 긴 문자열을 조회하고 색인을 생성 작업은 굉장한 성능저하가 발생한다.
따라서 적절하게 parsing 해줘야한다.
내 경우에는 보통 json 으로 필드화해서 사용한다.
[ Logstash 의 장점]
ES의 조회 성능과 효율성 모두 "크게" 개선
Kibana에서도 필터, 집계, 대시보드 구성이 수월
[설치 방법]
1. Elastic 저장소 추가 (이미 있다면 스킵)
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
2. 저장소 파일 생성
sudo tee /etc/yum.repos.d/elastic.repo << EOF
아래 내용을 작성. 한 번에 붙여넣어도 무관.
주의할 점은 첫 줄의 [elastic-7.x] 를 그대로 작성해야한다는 것.
본인이 사용하는 ES의 버전을 입력하라는 뜻이 아니다.
[elastic-7.1] > X
[elastic-7.x] > O
[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
3. Logstash 설치
sudo dnf install logstash-7.1.0 -y
4. .conf 작성
conf.d 디렉토리 내부에 .conf 파일 생성. 이름은 임의지정해도 무관. 일반적으로 syslog.conf
아래 내용을 작성. 한 번에 붙여넣어도 무관.
input {
file {
path => "/var/HOSTS/*/messages"
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb_syslog"
codec => "plain"
type => "syslog"
tags => ["syslog", "host-based"]
}
}
filter {
# 호스트명 추출 (경로에서)
if [path] {
grok {
match => { "path" => "/var/HOSTS/(?<source_host>[^/]+)/messages" }
}
}
# syslog 메시지 파싱
grok {
match => {
"message" => "%{SYSLOGTIMESTAMP:timestamp} %{IPORHOST:hostname} %{PROG:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:log_message}"
}
}
# 타임스탬프 처리
if [timestamp] {
date {
match => [ "timestamp", "MMM dd HH:mm:ss", "MMM d HH:mm:ss" ]
target => "@timestamp"
}
}
# 인덱스 날짜 필드 생성 (YYYY.MM.dd 형식)
ruby {
code => "
event.set('index_date', Time.now.strftime('%Y.%m.%d'))
"
}
# 불필요한 필드 제거
mutate {
remove_field => ["path", "host"]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "syslog-%{source_host}-%{index_date}"
template_name => "syslog-template"
template => "/etc/logstash/templates/syslog-template.json"
template_overwrite => true
}
# 디버깅용 (필요시 주석 해제)
# stdout {
# codec => rubydebug
# }
}
5. Elasticsearch 템플릿 파일 생성
/etc/logstash/templates 디렉토리 생성. 하위에 .json 파일 생성. 이름은 임의지정.
mappings 는 각자 관리하는 로그의 문자열을 보고 작성해야함.
아래의 코드를 그대로 삽입하면 정상적으로 동작하지 않을 것.
{
"index_patterns": ["syslog-*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.refresh_interval": "5s"
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"source_host": {
"type": "keyword"
},
"hostname": {
"type": "keyword"
},
"program": {
"type": "keyword"
},
"pid": {
"type": "integer"
},
"log_message": {
"type": "text",
"analyzer": "standard"
},
"message": {
"type": "text",
"analyzer": "standard"
},
"timestamp": {
"type": "keyword"
},
"index_date": {
"type": "keyword"
},
"type": {
"type": "keyword"
},
"tags": {
"type": "keyword"
}
}
}
}
6. pipelines.yml 설정 (필수 아님!)
piplines.yml 은 따로 설정하지 않아도 괜찮다.
추후에 여러 서버의 로그에 대해 각각 처리하기 위해 생성해놨다.
목적에 따라서 굳이 없어도 되는 파일.
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
혹시 다수의 서버에서 오는 로그에 대해 각각 다르게 처리하고 싶다면 다음을 참고해서 작성하면 된다.
- pipeline.id: from_A_server
path.config: "/etc/logstash/pipelines/a_server.conf"
- pipeline.id: from_B_server
path.config: "/etc/logstash/pipelines/b_server.conf"
- pipeline.id: from_C_server
path.config: "/etc/logstash/pipelines/c_server.conf"
7. logstash.yml 설정
path.data: /var/lib/logstash
path.config: /etc/logstash/conf.d/*.conf
path.logs: /var/log/logstash
8. 서비스 활성화
sudo systemctl enable logstash
9. 권한 설정
Logstash가 syslog-ng 로그 파일을 읽을 수 있도록 권한을 설정.
내 경우, 설치과정에서 권한문제로 수 차례 오류가 발생했다.
# logstash 사용자를 syslog 그룹에 추가
sudo usermod -a -G syslog logstash
# 로그 디렉토리 권한 설정 (syslog 의 설정에서 /var/HOSTS 하위에 로그를 쌓도록 해놨음)
sudo chmod -R 755 /var/HOSTS
sudo chown -R syslog:syslog /var/HOSTS
# Logstash sincedb 디렉토리 권한 설정
sudo mkdir -p /var/lib/logstash
sudo chown -R logstash:logstash /var/lib/logstash
10. 설정 파일 문법 검사
sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t
11. 서비스 시작
sudo systemctl start logstash
sudo systemctl status logstash
12. 로그 확인
sudo tail -f /var/log/logstash/logstash-plain.log'LINUX' 카테고리의 다른 글
| [CentOS 9] Kibana 데이터 연동 (0) | 2025.06.18 |
|---|---|
| [CentOS 9] Kibana 설치 (0) | 2025.06.17 |
| [CentOS 9] Elasticsearch 7.1.0 설치 (2) | 2025.06.11 |
| [CentOS 9] syslog-ng 설치 (0) | 2025.06.10 |
| [LINUX]리눅스 명령어 (0) | 2021.03.19 |