Nginx access_log 接入 ELK 的核心是:自定义 JSON 日志格式 → Logstash 用 json codec 解析 → Kibana 创建索引模式并构建可视化看板;需注意日志权限、sincedb 持久化、日期动态索引及敏感字段脱敏。

将 Nginx 的 access_log 接入 ELK(Elasticsearch + Logstash + Kibana)系统,是实现 Web 访问日志实时采集、结构化解析与可视化分析的常用方案。关键在于让原始日志具备可解析性,并通过 Logstash 正确提取字段,最终在 Kibana 中构建有意义的仪表板。
确保 Nginx 日志格式支持结构化解析
Nginx 默认的 log_format 是纯文本,不利于后续提取。建议自定义一个带命名字段的 JSON 或 key-value 格式,推荐使用 JSON 格式,兼容性好且 Logstash 解析稳定。
- 在
nginx.conf的http块中定义:
log_format json '{"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"host":"$host",'
'"request":"$request",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"request_time":$request_time,'
'"upstream_response_time":"$upstream_response_time"}';- 在 server 或 location 块中启用该格式:
access_log /var/log/nginx/access.log json;
注意:确保日志路径有写入权限,且避免多进程并发写入冲突(Nginx 自身已处理)。
Logstash 配置:从文件读取并解析 JSON 日志
Logstash 是日志管道的核心,负责采集、解析和转发。使用 file input 插件读取日志文件,json filter 解析内容,再输出到 Elasticsearch。
- 配置示例(
/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"
}
}
<p>filter {</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill8297" title="Accessibility Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179196309161514.jpg" alt="Accessibility Review" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill8297" title="Accessibility Review">Accessibility Review</a>
<p>对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。</p>
</div>
<a href="/xiazai/skill8297" title="Accessibility Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>可选:将字符串型时间转为 Logstash 时间戳</h1><p>date {
match => ["time", "ISO8601"]
target => "@timestamp"
}</p><h1>可选:拆分 request 字段获取 method、path、protocol</h1><p>if [request] {
grok {
match => { "request" => "%{WORD:method} %{URIPATHPARAM:request_path} %{URIPROTO:protocol}" }
}
}
}</p><p>output {
elasticsearch {
hosts => ["<a href="https://www.php.cn/link/fb7850115a917d3ab720269da3e667de">https://www.php.cn/link/fb7850115a917d3ab720269da3e667de</a>"]
index => "nginx-access-%{+YYYY.MM.dd}"
}
}说明:codec => "json" 直接解析 JSON 行,比用 grok 匹配文本更高效准确;sincedb_path 确保重启后不重复读取;index 使用日期动态命名,便于按天管理索引。
Kibana 中创建索引模式并构建可视化看板
Logstash 成功写入数据后,在 Kibana 中需先定义索引模式,再基于字段做聚合与图表。
- 进入 Kibana → Stack Management → Index Patterns → Create index pattern
- 输入模式名如
nginx-access-*,选择@timestamp作为时间字段 - 保存后即可在 Discover 中查看原始日志,字段自动识别(status、request_time、remote_addr 等)
常用可视化建议:
- 访问量趋势图:X 轴为时间,Y 轴为 count,筛选器可加 status=200/404/500 对比
-
响应时间分布直方图:用
request_time做范围聚合,识别慢请求 -
Top 请求路径表格:对
request_path做 top terms,观察热点接口 -
地域分布地图(需 GeoIP):配合 Logstash 的
geoip过滤器解析remote_addr,生成地理热力图
补充优化点
生产环境中还需考虑稳定性与维护性:
- 日志轮转:配合
logrotate,并在 Logstash 中设置close_older => 3600避免句柄泄漏 - 性能调优:大流量场景下,可用
beats(Filebeat)替代 Logstash input,降低资源占用 - 字段丰富性:在 Nginx 中通过
$upstream_http_x_trace_id等自定义 header 注入链路追踪 ID,便于全链路分析 - 安全过滤:在 Logstash filter 中剔除敏感字段(如含 token 的 referer 或 user_agent),或脱敏处理
不复杂但容易忽略。只要日志格式统一、管道配置清晰、Kibana 字段映射正确,就能快速搭建出实用的 Nginx 日志可视化体系。

















