直接在 log_format 中使用 $http_cookie 可记录完整 cookie 字符串,无需额外模块;进阶时可用 $cookie_xxx 提取特定字段,变量名需与 cookie 名完全一致(大小写敏感),未匹配时记为 -。

直接在 log_format 中写入 $http_cookie 就能记录完整的 Cookie 字符串,无需额外模块或正则解析,但要注意它会原样输出所有 Cookie 键值对(如 uid=abc; token=xyz; theme=dark),字段长度不可控,日志体积增长快。
基础用法:记录全部 Cookie 内容
在 http 块中定义日志格式,把 $http_cookie 加入字段列表:
- 确保放在
http{...}大括号内,不能在server或location里单独定义 - 示例配置:
log_format full_cookie '$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_cookie.log full_cookie;
进阶用法:只提取特定 Cookie 值
当只需某个字段(如 session_id 或 JSESSIONID)时,优先使用 Nginx 内置变量 $cookie_XXX,比正则更轻量、更稳定:
- 变量名必须与实际 Cookie 名完全一致(大小写敏感),例如前端设置
Set-Cookie: sessionId=abc123,就用$cookie_sessionId - 若 Cookie 是小写
session_id=xyz789,就写$cookie_session_id - 该变量未匹配时自动记为
-,不会破坏日志结构 - 示例:
log_format session_log '$time_iso8601|$remote_addr|$request_method|$request_uri|$cookie_sessionId|';
注意事项与常见问题
$http_cookie 是原始请求头中的完整字符串,受客户端发送内容影响,可能存在空值、编码字符或超长值:
- 日志文件体积明显增大,尤其高并发场景下建议搭配日志轮转或定向采集(如只对特定路径启用)
- 如果 Cookie 含中文或特殊符号(如空格、逗号),需确认日志分析工具是否支持 UTF-8 解析
- 反向代理环境下,若上游服务清除了 Cookie 或用了
proxy_hide_header Set-Cookie,$http_cookie仍有效(它是读请求头,不是响应头) - 不建议在
log_format中混用$http_cookie和$cookie_XXX,除非明确区分用途(如全量审计 vs 精准追踪)











