ELK集中管理Nginx日志的核心是打通日志从生成→传输→解析→存储→展示链路:需配置Nginx输出JSON结构化日志,Logstash用json codec采集并用grok/date解析,Elasticsearch按日期索引存储,Kibana基于nginx-access-*索引模式可视化分析。

使用 ELK 堆栈(Elasticsearch、Logstash、Kibana)集中管理 Nginx 日志,核心在于:把 Nginx 的 access 和 error 日志实时采集、结构化解析、存储到 Elasticsearch,并通过 Kibana 可视化分析。关键不是堆组件,而是打通日志从生成 → 传输 → 解析 → 存储 → 展示的链路。
配置 Nginx 输出结构化日志
Nginx 默认日志是纯文本,Logstash 难以直接提取字段。需先自定义 log_format,让每条日志包含明确分隔符(如 JSON 或空格分隔的键值对):
- 推荐用 JSON 格式,避免解析歧义。在 nginx.conf 的 http 块中添加:
log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"domain":"$host",'
'"url":"$request",'
'"status":"$status",'
'"useragent":"$http_user_agent",'
'"xff":"$http_x_forwarded_for"}';- 然后在 server 或 location 块中启用:
access_log /var/log/nginx/access.log json; - 重启 Nginx:
nginx -t && systemctl reload nginx
部署 Logstash 做日志采集与解析
Logstash 负责读取 Nginx 日志文件、解析 JSON、补充字段、转发到 Elasticsearch:
- 安装 Logstash 后,新建配置文件(如
/etc/logstash/conf.d/nginx.conf):
input {
file {
path => "/var/log/nginx/access.log"
start_position => "end"
sincedb_path => "/var/lib/logstash/sincedb_nginx"
codec => "json"
}
}
filter {
# 把 $request 字段拆成 method、url、http_version
if [url] {
grok {
match => { "url" => "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}" }
remove_field => ["url"]
}
}
# 转换时间字段为 @timestamp(确保时区一致)
date {
match => ["@timestamp", "ISO8601"]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "nginx-access-%{+YYYY.MM.dd}"
}
}- 确保 Logstash 有权限读取
/var/log/nginx/access.log(可加 group 权限或改用 systemd 日志方式) - 启动 Logstash 并验证配置:
logstash -f /etc/logstash/conf.d/nginx.conf --config.test_and_exit
在 Kibana 中创建索引模式并可视化
Elasticsearch 接收数据后,Kibana 需要识别索引结构才能查和画图:
- 访问 Kibana → Stack Management → Index Patterns → Create index pattern
- 输入
nginx-access-*,选择@timestamp作为时间字段 - 进入 Discover 查看原始日志,确认 clientip、status、responsetime 等字段已正确解析
- 常用可视化建议:
-
请求量趋势图:X 轴时间,Y 轴 Count,筛选器加
status: 200或status: [404, 500] -
Top URL 表格:聚合字段
request.keyword,统计次数 -
响应时间分布直方图:用
responsetime做直方图,观察 P95/P99 延迟 -
异常客户端 IP 列表:筛选
responsetime > 5或status: 404,按clientip分组
补充建议与注意事项
生产环境还需考虑稳定性、性能与安全:
- 用 Filebeat 替代 Logstash input/file(更轻量、资源占用低),Logstash 专注做解析和转发
- 为避免日志丢失,Nginx 开启
buffered_logs on,Filebeat 启用close_inactive和harvester_buffer_size - Elasticsearch 建议设置 ILM(Index Lifecycle Management),自动删除 30 天前的索引
- Kibana 中保存常用查询为 Saved Objects,方便团队复用仪表板
- 敏感字段(如 useragent、xff)可在 Logstash filter 中用
mutate { remove_field => [...] }脱敏


















