반응형
1. 개요
- 당초 nginx 서버에서 filebeat를 이용하여 로그를 수집하려고 하였으나 nginx 서버의 filebeat 설치가 여의치 않았음.
- filebeat의 nginx 모듈을 사용하려고 하였으나 다양한 log format 필드를 이용할 수 없었음.
- 따라서 nginx 의 custom log format을 구성하고 access_log 설정에 syslog를 이용하여 수집서버로 보냄
- 수집서버에서 filebeat와 logstash를 이용 하여 elasticsearch로 푸시
2. [Client] nginx log format
log_format main '[$host] [$remote_addr] - [$remote_user] [$time_local] [$request] '
'[$status] [$request_time] [$upstream_status] [$upstream_response_time] [$body_bytes_sent] [$http_referer] '
'[$http_user_agent] [$http_x_forwarded_for] [$server_addr] [$upstream_addr]';
3. [Client] nginx access log 설정
- nginx log를 json으로 떨굴수도 있어 파싱 하는데 용이할수 있음.
# nginx location access_log
access_log syslog:server={server ip},facility=local5,severity=info main;
4. [server] 수집된 syslog 예
- Apr 19 15:19:08 web3 nginx: 여기 까지는 syslog date format
Apr 19 15:19:08 web3 nginx: [{host}] [{remote_addr}] - [-] [19/Apr/2022:15:19:08 +0900] [POST {request uri} HTTP/1.1] [200] [0.011] [200] [0.011] [75] [{referer}] [Mozilla/5.0 (Linux; Android 12; SM-G973N Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.88 Mobile Safari/537.36] [-] [58.229.204.117] [127.0.0.1:8998]
Apr 19 15:19:08 web3 nginx: [{host}] [{remote_addr}] - [-] [19/Apr/2022:15:19:08 +0900] [GET {request uri} HTTP/1.1] [200] [0.023] [200] [0.023] [9467] [-] [Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)] [-] [58.229.204.117] [127.0.0.1:8887]
5. logstash grok pattern 설정
- %{NUMBER:upstream.response.time:float} 는 소수점 표현
input {
beats {
port => 5044
}
}
filter {
grok{
match => {
"message" => "%{WORD:syslog.month} %{NUMBER:syslog.day} %{NUMBER:syslog.hour}\:%{NUMBER:syslog.minute}\:%{NUMBER:syslog.second} %{WORD:origin.hostname} %{WORD:app.name}\: \[%{DATA:nginx.domain}\] \[%{IP:client.address}\] - \[(?:-|%{DATA:nginx.user.name})\] \[%{HTTPDATE:[nginx.timestamp]}\] \[%{WORD:http.method} %{DATA:request} HTTP/%{NUMBER:http.version}\] \[%{NUMBER:nginx.response.code}\] \[%{NUMBER:nginx.request.time:float}\] \[%{NUMBER:upstream.response.code}\] \[%{NUMBER:upstream.response.time:float}\] \[%{NUMBER:http.response.body.bytes}\] \[%{DATA:http.request.referrer}\] \[%{DATA:http.user_agent}\] \[(?:-|%{IP:http_x_forwarded_for})\] \[%{IP:origin.addr}\] \[%{DATA:upstream.addr}\]"
}
}
date{
match => [ "nginx.timestamp", "dd/MMM/yyyy:HH:mm:ss +0900" ]
timezone => "Asia/Seoul"
target => "@timestamp"
}
geoip{
source => "client.address"
}
mutate{
remove_field => [ "message" ]
}
}
output {
elasticsearch {
hosts => "http://localhost:9200"
index => "filebeat-nginx-%{+YYYY.MM.dd}"
}
}
반응형
'Monitoring Tools > ELK Stack' 카테고리의 다른 글
6.1 filebeat multiple indexing (0) | 2022.04.22 |
---|---|
6. filebeat agent 설정 (0) | 2022.04.22 |
5.1 [logstash filter] 시간대 변경 (0) | 2022.04.22 |
5. Logstash 설정 및 테스트 (0) | 2022.04.22 |
4.1 index pattern id 조회 (0) | 2022.04.22 |