0.环境说明
filebeat、logstash、elasticsearch版本为6.5.4。
1.filebeat配置文件
收集nginx成功和失败日志数据,并标记不同的tags,为logstash接收数据做过滤标记。在kibana中,需要按照该tags进行过滤数据信息。
filebeat.yml
filebeat.prospectors:
- input_type: log
paths:
- /data/access*.log
exclude_files: ['.gz$']
tags: ["nginx-accesslog"]
document_type: nginxaccess
- input_type: log
paths:
- /data/error*.log
tags: ["nginx-errorlog"]
exclude_files: ['.gz$']
document_type: nginxerror
tags: ["nginx-logs"]
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
output.logstash:
hosts: ["127.0.0.1:5044"]
#output:
# console:
# pretty: true
- 启动filebeat:
./filebeat -e -c filebeat.yml
2.logstash配置文件
参考官方logstash解析nginx日志的配置文件,进行修改。
filter中第二个grok中,将nginx.access.url
中?
后的参数剔除掉,存到api字段中。这样不同参数相同接口的url,都可以归类到同一个api中。
totaltime为nginx.access.url日志中加入的接口请求响应时间值,放在日志的最末尾。
message数据格式类似如下:
127.0.0.1 - - [21/Jun/2019:09:40:08 +0800] "GET /aaa/bbb/ccc HTTP/1.1" 200 4841 "https://aaa/ddd/ccc/eee/fff?unionId=aaa" "Mozilla/5.0 (Linux; Android 8.1.0) Chrome/66.0.3359.126" 0.003
加入logtype字段作为结构化后数据的标记信息,在kibana中,与tags信息结合,过滤展示数据信息。
nginxlog.conf
input {
beats {
port => 5044
host => "127.0.0.1"
}
}
filter {
if "nginx-logs" in [tags] {
if "nginx-accesslog" in [tags] {
grok {
match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\" %{GREEDYDATA:totaltime}"] }
remove_field => "message"
add_field => {"logtype"=>"nginxLogs"}
}
grok {
match => {"[nginx][access][url]" => "%{URIPATH:api}"}
}
mutate {
add_field => { "read_timestamp" => "%{@timestamp}" }
convert => ["totaltime","float"]
}
date {
match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
remove_field => "[nginx][access][time]"
}
useragent {
source => "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
remove_field => "[nginx][access][time]"
}
useragent {
source => "[nginx][access][agent]"
target => "[nginx][access][user_agent]"
remove_field => "[nginx][access][agent]"
}
geoip {
source => "[nginx][access][remote_ip]"
target => "[nginx][access][geoip]"
}
}
if "nginx-errorlog" in [tags] {
grok {
match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] }
remove_field => "message"
add_field => {"logtype"=>"nginxLogs"}
}
mutate {
rename => { "@timestamp" => "read_timestamp" }
}
date {
match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ]
remove_field => "[nginx][error][time]"
}
}
}
}
output {
if "nginx-logs" in [tags] {
if [logtype] == "nginxLogs" {
elasticsearch {
hosts => ["127.0.0.1:9200"]
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
#stdout {
# codec => rubydebug
#}
}
}
}
- 启动logstash:
./bin/logstash -f config/conf.d/nginxlogs.conf
3.elasticsearch中索引template的建立
参考filebeat中,自带的template,创建filebeat-*索引的模版。
4.kibana展示
参考filebeat中,自带的nginx的dashboard。将nginx相关dashboard的json文件,导入到目标kibana中。修改以filset为开头的数据过滤条件,改为自定义的logtype为数据过滤条件,才能正确展示图像、数据信息。
5.补充
使用filebeat+elasticsearch+kibana模式,利用filebeat自带的module解析nginx日志信息,可以在kibana中获取到filebeat-*索引的模版信息,导出nginx相关的dashboard信息。