推荐使用带escape=json的JSON格式日志,确保字符串加引号、数字不加引号以保证合法性,并显式包含$http_x_forwarded_for、$request_id等关键安全字段,适配Splunk等SIEM原生解析与关联分析需求。

要让 Nginx 日志被 Splunk 等 SIEM(安全信息和事件管理系统)高效采集、解析与分析,关键不是“能读”,而是“好分、易查、可关联”。核心动作是:统一结构化格式 + 显式暴露关键安全字段 + 兼容 SIEM 的默认解析逻辑。
使用 JSON 格式日志(推荐首选)
Splunk、Loki、ELK 等现代 SIEM 均原生支持 JSON 行日志,无需额外正则即可自动提取字段,减少配置错误和维护成本。
在 nginx.conf 的 http 块中定义:
log_format json_escape escape=json '{'
'"time_iso8601":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"x_forwarded_for":"$http_x_forwarded_for",'
'"remote_user":"$remote_user",'
'"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",'
'"upstream_addr":"$upstream_addr",'
'"request_id":"$request_id",'
'"server_name":"$server_name"'
'}';- 所有字符串字段用双引号包裹,数字字段(如
$status、$request_time)不加引号,确保 JSON 合法 -
$http_x_forwarded_for必须保留——SIEM 做真实 IP 追溯和威胁定位的依据 -
$request_id建议启用(配合ngx_http_request_id_module或 OpenResty),支撑跨系统攻击链路还原 - 避免在 JSON 中拼接未转义的用户输入(如
$args),防止注入或解析失败;如需记录参数,先做基础脱敏(如替换 UUID、token)
适配 Splunk 的字段命名与语义习惯
Splunk 内置的 nginx:access 源类型会尝试按传统文本格式自动提取字段。若沿用文本日志(非 JSON),需严格对齐其默认正则预期,否则字段为空或错位。
推荐文本格式模板(兼容 Splunk 自动识别):
log_format splunk_compatible '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_time $upstream_response_time "$host"';
- 字段顺序与经典 Apache/Nginx 格式一致,Splunk 能直接映射出
clientip、method、status、bytes等标准字段 - 显式包含
$http_x_forwarded_for并放在useragent后,便于 Splunk 用rex提取为xff字段用于溯源 - 把
$request_time和$upstream_response_time放在末尾,不影响主字段识别,又保留下游性能分析能力
增强安全可观测性的字段补充
仅基础字段不足以支撑 WAF 替代、暴力破解识别、API 异常调用等安全场景。可在日志中主动注入上下文:
- 添加请求头标记:
"$http_sec_ch_ua"、"$http_cf_connecting_ip"(Cloudflare)、"$http_true_client_ip"(Akamai)等,辅助判断代理真实性 - 记录 TLS 信息:
"$ssl_protocol"、"$ssl_cipher",用于加密合规审计 - 标识认证状态:用
map模块生成布尔字段,例如$auth_status(值为 "success"/"failed"),比从$remote_user推断更可靠 - 标记敏感路径:用
map匹配/admin/、/api/v1/user等路径,输出"sensitive_path":"true",方便 Splunk 做权限越界告警
日志落盘与采集协同要点
格式只是起点,SIEM 要稳定摄入还需两端配合:
- Nginx 配置 access_log 使用该格式,并确保日志文件权限允许采集器(如 Splunk UF、Promtail)读取
- Splunk Universal Forwarder 配置中指定
sourcetype = nginx:access(JSON 日志则建议设为sourcetype = json并在 props.conf 中配置INDEXED_EXTRACTIONS = json) - 若用 Syslog 方式推送,需在 Nginx 中启用
--with-http-syslog-module,并设置access_log syslog:server=10.0.1.5:514,facility=local7,tag=nginx_access;,服务端 rsyslog 按 tag 分流至 SIEM - 禁用日志轮转时的压缩(如
gzip),多数 SIEM 不支持实时解压;改用logrotate的copytruncate模式保障采集连续性


















