일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 동시성
- functional thinking
- 테스트주도개발
- 데이터레이크
- 켄트백
- 데이터유통
- 개발자로살아남기
- 회고
- wait region split
- spray
- hackercup2017
- 2017회고
- Raw-Request-URI
- 클린코드
- 함수형 사고
- 데이터야놀자
- datalake
- kafka
- 단위테스트
- 개발자
- 개발7년차매니저1일차
- 2016년회고
- 코딩인터뷰
- clean code
- 해커컵
- coursera
- 실전사례
- 박종천
- 데이터플랫폼
- 알고스팟
- Today
- Total
Software Engineering Note
ELK(Elasticsearch+Logstash+Kibana)를 이용한 로그수집 본문
설치
구성도는 크게 세 부분으로 나뉘는데요.
collector
- 로그를 수집해서 indexer로 던집니다.
- 서비스 서버에 적용하는 것을 감안, logstash-forwarder를 이용했습니다.
(logstash forwarder: https://github.com/elasticsearch/logstash-forwarder)
- 이렇게 하면 collector는 단순히 로그를 tailing해서 던지기 때문에, 서비스 중인 서버에 부담을 덜 수 있습니다.
indexer
- 전달받은 로그를 분석해서 의미있는 필드로 뽑아낸 후에 elasticsearch에 저장합니다.
- 여기에 logstash가 사용 되었습니다.
db
- 말 그대로 데이터 저장소
- elasticsearch에 데이터가 저장되고 kibana를 이용해서 그래프로 뽑아볼 수 있습니다.
설정
인증서 생성
logstash와 logstash-forwarder간 통신을 위해서 꼭 필요합니다.
indexer 서버들의 '/etc/pki/tls/openssl.cnf' 파일을 다음과 같이 수정합니다.
서버가 여러대라면 모든 서버 IP를 등록한 후 인증서를 생성합니다. 키 생성은 한 곳에서 하고, 모든 서버가 생성된 파일을 공유해서 사용하면 됩니다.
openssl.cnf
...
[v3_ca]
subjectAltName = IP:ip1, IP:ip2, IP:ip3
...
키생성
openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout logstash-forwarder.key -out logstash-forwarder.crt
생성된 두 파일은 logstash, logstash-forwarder 에서 모두 사용해야 하며, 설정파일에 파일 경로를 기술해주면 됩니다.
logstash-forwarder 설정
logstash-forwarder.json
{
"network": {
# indexer ip list
"servers": [ "ip1:port", "ip2:port", "ip3:port" ],
"ssl certificate": "/logstash-forwarder/cert/logstash-forwarder.crt",
"ssl key": "/logstash-forwarder/cert/logstash-forwarder.key",
"ssl ca": "/logstash-forwarder/cert/logstash-forwarder.crt",
"timeout": 15
},
"files": [
{
"paths": [
"로그파일 경로"
]
}
]
}
'servers'에 indexer 들을 지정해 놓으면 랜덤으로 하나를 골라 로그를 보냅니다.
연결이 끊기는 경우는 다른 indexer와 연결을 맺고, 로그를 보냅니다. 이미 연결이 끊기는 경우에 대한 보완이 되어있는 셈이죠.
logstash 설정
logstash.conf
input {
# logstash forwarder와 연동할 때는 lumberjack 설정을 해줍니다.
lumberjack {
port => 포트번호
ssl_certificate => "/logstash/cert/logstash-forwarder.crt"
ssl_key => "/logstash/cert/logstash-forwarder.key"
type => "errorlog"
}
}
filter {
if [type] == "errorlog" {
# 여러 라인을 하나로 모을 수 있습니다. stack trace를 모두 가져오고싶을때 유용합니다.
multiline {
pattern => "(^\d+\serror)|(^.+Exception: .+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Caused by:.+)|(^\D.+)"
what => "previous"
}
# 여기서 필요한 필드들을 추출할 수 있습니다.
# loglevel, classname.. 등이 별도의 필드로 추출되고, kibana에서 필드단위로 값을 쉽게 확인할 수 있습니다.
grok {
patterns_dir => "./patterns"
match => [ "message", "^%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} \[%{WORD:classname}\] - %{GREEDYDATA:description}" ]
}
# 한국 시간에 맞추기 위한 설정
ruby {
code => "
event['@timestamp'] = event['@timestamp'].localtime('+09:00')
"
}
}
}
filter {
# 에러나 경고가 아닌 경우에는 제거합니다.
if [type] == "errorlog" {
if [loglevel] != "ERROR" and [loglevel] != "WARN" {
drop { }
}
}
}
output {
elasticsearch {
protocol => "node"
index => "logstash-error-%{+YYYY.MM.dd}"
}
}
마치 체인처럼 설정이 연결되어 있습니다. (입력 -> 필터링 -> 저장)
logstash에서 별도로 호스트를 지정하지 않고, 클러스터군으로 넣으려면 elasticsearch 설정파일을 logstash 디렉토리에 함께 포함시켜줘야 합니다. 설정파일은 elasticsearch에서 가져오면 됩니다.
다른 부분은 그대로 두고 다음 부분을 추가합니다. (elasticsearch cluster가 3대인 경우)
discovery.zen.ping.unicast.hosts: ["ip1", "ip2", "ip3"]
실행
elasticsearch
bin/elasticsearch -d
logstash
bin/logstash agent -f logstash.conf
logstash-forwarder
bin/logstash-forwarder -config logstash-forwarder.json
참고링크
- fluentd 와 비교: http://jasonwilder.com/blog/2013/11/19/fluentd-vs-logstash/
- 톰캣로그 관련 logstash 설정: http://www.logstashbook.com/code/6/shipper.conf
- logstash forwarder: http://michael.bouvy.net/blog/en/2013/12/06/use-lumberjack-logstash-forwarder-to-forward-logs-logstash/