如果想要无侵入的收集到Nginx的Json格式日志,意思就是不改动Nginx任何配置。通过filebeat和es的pipline结合可以做到。
Grok规则测试
先获取到Nginx普通日志格式,示例:
172.16.49.1 - - [16/May/2024:17:29:57 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://172.16.49.130/hah" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" "-"
表达式生成
如果不会写,可以使用ChatGpt生成
%{IP:client} - - \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATH:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} %{NUMBER:bytes} "%{URI:referrer}" "%{DATA:user_agent}" "%{DATA:unknown}"
检测
进入Kibana主页,Manage and Administer the Elastic Stack -> 点击Console -> Grok Debugger,输入原始日志和表达式,点击Simulate
Sample Data:Nginx的普通日志,原始的数据
Grok Pattern:Grok的表达式
可以正常输出Json格式的日志,表明Grok表达式正确。
ES创建预处理器
使用代码创建。进入Kibana主页,Manage and Administer the Elastic Stack -> 点击Console -> 输入代码创建pipeline预处理器
PUT _ingest/pipeline/pipeline-nginx-access
{
"description": "Pipeline to parse Nginx access logs",
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"%{IPORHOST:client_ip} - - \\[%{HTTPDATE:timestamp}\\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:status} %{NUMBER:bytes} \"%{DATA:referrer}\" \"%{DATA:user_agent}\" \"%{DATA:unknown}\""
]
}
},
{
"remove": {
"field": "message"
}
}
]
}
GET _ingest/pipeline
filebeat指定使用es的预处理器
配置文件
processors:过滤掉ecs和log字段,不收集
cat > /etc/filebeat/filebeat.yml << 'EOF'
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
tags: ["access"]
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
tags: ["error"]
processors:
- drop_fields:
fields: ["ecs","log"]
output.elasticsearch:
hosts: ["172.16.49.130:9200"]
pipelines:
- pipeline: "pipeline-nginx-access"
when.contains:
tags: "access"
indices:
- index: "nginx-access-%{[agent.version]}-%{+yyyy.MM}"
when.contains:
tags: "access"
- index: "nginx-error-%{[agent.version]}-%{+yyyy.MM}"
when.contains:
tags: "error"
setup.ilm.enabled: false
setup.template.enabled: false
EOF
重启filebeat
systemctl restart filebeat.service
systemctl status filebeat.service
ES查看
此时查看es的日志数据,在没有改动Nginx任何配置的情况下,Nginx的普通格式日志已经被转换成Grok表达式制定格式的Json格式收集,而且不需要的字段还能过滤掉不收集。