nginx可通过$http_cookie变量记录cookie信息,支持完整记录或正则提取指定字段(如token、uid、session_id),需配合log_format定义与access_log启用,并注意性能、日志体积及敏感信息防护。

要在 Nginx 的 access_log 中记录 Cookie 信息,核心是利用内置变量 $http_cookie,并配合 log_format 和条件提取逻辑。是否记录全部 Cookie 还是只取特定字段,取决于业务需求和日志管理成本。
直接记录完整的 Cookie 字符串
这是最简方式,适用于调试或初步分析:
- 在
http块中定义新日志格式,加入"$http_cookie"(注意加英文双引号,避免空格或分号导致解析异常):
log_format cookie_full '$remote_addr - $remote_user [$time_local] "$request" '$status $body_bytes_sent "$http_referer" '$http_user_agent "$http_x_forwarded_for" "$http_cookie"';
- 在
server或location块中启用该格式的日志:
access_log /var/log/nginx/access_with_cookie.log cookie_full;
- 重载配置生效:
nginx -s reload
只提取指定 Cookie 的值(如 token、uuid)
避免日志膨胀,也便于后续结构化处理(如 ELK 提取):
- 在
server块内用if+ 正则匹配提取目标字段,并赋值给自定义变量:
set $cookie_token "-";<br>if ($http_cookie ~* "token=([^;]+)") {<br> set $cookie_token ;<br>}
- 在
log_format中使用该变量(而非$http_cookie):
log_format cookie_token '$remote_addr - $remote_user [$time_local] "$request" '$status $body_bytes_sent "$http_referer" '$http_user_agent "$cookie_token"';
- 注意:正则中的
([^;]+)表示匹配到首个分号前的内容,比(.+?)更安全,避免跨 Cookie 截断
同时提取多个关键 Cookie
例如需同时记录 uid 和 session_id:
- 分别定义两个变量,并各自做正则提取:
set $uid "-";<br>set $session_id "-";<br>if ($http_cookie ~* "uid=([^;]+)") { set $uid $1; }<br>if ($http_cookie ~* "session_id=([^;]+)") { set $session_id $1; }
- 日志格式中按需引用:
log_format multi_cookie '$remote_addr ... "$uid" "$session_id"';
- 每个
if独立判断,互不影响;未匹配时保持默认值(如 "-"),保证日志字段对齐
注意事项与优化建议
实际部署时需关注几个关键点:
-
性能影响:
if指令在高并发下有轻微开销,但通常可忽略;若 QPS 极高(>10k),建议用map指令替代(更高效且支持缓存) - 日志体积:完整 Cookie 可能含大量键值对,单条日志可达 KB 级;建议仅在必要场景开启,或搭配日志轮转与磁盘监控
-
敏感信息风险:Cookie 中可能含 token、auth 等敏感字段,确保日志文件权限为
640,且不上传至非可信平台 -
空值处理:始终为自定义变量设默认值(如
set $xxx "-"),防止日志字段错位或解析失败











