본문 바로가기

Monitoring Tools/ELK Stack

5.2 grok pattern을 이용한 nginx log 파싱

반응형

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