Nginx接入Graylog需构建结构化日志管道:先用log_format模拟JSON输出access日志,再通过Filebeat采集并以GELF HTTP协议发送至Graylog,最后在Graylog中配置索引策略、字段类型及搜索视图实现高效检索。

在 Nginx 中接入 Graylog 实现日志的集中收集与高效检索,核心在于:将 Nginx 原生 access 和 error 日志以结构化格式(如 JSON)输出,再通过轻量传输工具(如 Filebeat 或 nxlog)转发至 Graylog。关键不是“直接对接”,而是构建一条可靠、低侵入、可扩展的日志管道。
一、配置 Nginx 输出结构化 JSON 日志
Nginx 本身不支持原生 JSON 日志,但可通过 log_format 模拟 JSON 格式,确保字段清晰、引号和逗号合规,便于后续解析。推荐在 http 块中定义:
log_format json\_log '{'
'"time": "$time_iso8601",'
'"remote_addr": "$remote_addr",'
'"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.json json_log;
注意:
– 确保日志路径有写权限
– 避免在 JSON 值中出现未转义双引号(如 User-Agent 含引号时,Nginx 不自动转义;若需严格合规,建议用 Lua 模块或外部处理器增强)
– error_log 保持默认文本格式即可,Graylog 可通过 GROK 或正则提取
二、选择并配置日志采集器(推荐 Filebeat)
Filebeat 轻量、稳定、原生支持 JSON 解析和 Graylog 的 GELF 协议(通过 HTTP 或 UDP),是当前最简方案:
- 安装 Filebeat 后,在
filebeat.yml中配置输入:
filebeat.inputs:
- type: filestream
paths:
- /var/log/nginx/access.json
json.keys_under_root: true
json.overwrite_keys: true
json.add_error_key: true
- 输出指向 Graylog(HTTP 方式更可靠,支持 TLS 和认证):
output.http:
hosts: ["http://graylog.example.com:12201/gelf"]
headers:
Content-Type: "application/json"
worker: 2
说明:
– Graylog 的 GELF HTTP 端口默认为 12201(需在 Graylog Web 界面 → System → Inputs 中启用 GELF HTTP Input)
– 若用 UDP,需确认防火墙放行且开启 udp input,但生产环境更推荐 HTTP(带重试、队列、压缩)
– Filebeat 启动后会自动识别 JSON 字段,无需额外 Grok 过滤
三、在 Graylog 中优化索引与检索体验
日志进到 Graylog 后,需针对性配置才能高效检索:
- 设置合适的索引集策略:按天滚动(Index Set Rotation Strategy),保留周期根据磁盘和合规要求设定(如 30 天),避免单索引过大影响查询性能
-
为常用字段建立索引字段(Index Field):如
status(numeric)、remote_addr(ip)、request_time(numeric)、http_user_agent(text)——Graylog 会自动识别部分类型,但手动确认并设为 “analyzed” 或 “not_analyzed” 更稳妥 -
创建常用搜索视图(Search View)或仪表盘(Dashboard):例如:
– 统计每分钟 5xx 错误数:status:[500 TO 599]+ 时间范围聚合
– 慢请求 Top 10:request_time > 2.0+ 按 request 排序
– 异常 User-Agent 聚类:http_user_agent:"sqlmap\|nmap\|gobuster"
四、补充建议与避坑点
- 不要把 Nginx error_log 直接走 JSON:它格式不规则,建议保留文本,用 Graylog 的 Extractors 或 Pipelines 提取关键字段(如 level、pid、message)
- 如果日志量极大(>10MB/s),考虑在 Filebeat 前加一层 Logstash 做采样、脱敏或字段丰富(如 IP 归属地);但中小规模,Filebeat 直连足够
- 务必开启 Filebeat 的
logging.level: info并监控其日志,确认无JSON decode error——常见于 Nginx 日志中混入非 JSON 行(如 reload 时的注释) - Graylog 中新建 Input 时,勾选 Store full message,方便调试原始日志内容是否完整到达











