logstash 匹配 nginx access 日志
ELK系统收集的nginx access日志内容默认都是作为一个整体放在messages字段中的,无法对诸如upstream_response_time、upstream_status等重要字段进行单独分析比较,因此,就需要使用logstash
的grok功能从access日志中匹配提取各个变量
1.首先确定nginx的日志格式
在nginx的配置文件中设置日志格式:
1
2
3
4
5
log_format access '$remote_addr - $remote_user [$time_local] '
'$http_host $request_method $uri '
'$status $body_bytes_sent '
'$upstream_status $upstream_addr $request_time '
'$upstream_response_time $http_user_agent';
2.使用logstash grok对nginx日志进行匹配
在logstash的配置文件中加入如下过滤规则:
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
filter {
#type的值是在logstash的客户端配置文件中配置的,用来匹配采集来的nginx日志
if == 'mobile-access' {
grok {
#match 这一段实际是单行书写的,为了便于阅读这里拆分成了多行
match =>[ "message",'%{IPV4:remote_addr}-(%{USERNAME:user}|-)
\[%{HTTPDATE:nginx_timestamp}\]%{HOSTNAME:http_host}%{WORD:request_method}
%{URIPATH:uri}%{BASE10NUM:http_status}%{BASE10NUM:body_bytes_sent:int}
(%{BASE10NUM:upstream_status}|-)(?:%{HOSTPORT:upstream_addr}|-)
(%{BASE16FLOAT:request_time}|-)(%{BASE16FLOAT:upstream_response_time}|-)
(?<http_user_agent>[^"]*)'
}
date {
locale => "en"
match =>["nginx_timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
}
#实际中grok并没有将匹配的字段转换成期望的int、float等类型,因此这里使用了convert
再次做转换
mutate {
convert =>[
"request_time","float",
"body_bytes_sent","integer",
"upstream_response_time","float",
"http_status","integer"
]
}
}
查看效果:一共匹配了24个Fields,request_time,body_bytes_set都转变成了number类型
页:
[1]