Nginx 中 access_log 中包含请求方法(GET和POST)的分析

作者:袖梨 2026-07-16
是的,Nginx access_log 默认包含请求方法;其位于 $request 字段开头,可用 grep 提取、awk 统计,GET 参数可见而 POST body 需额外配置 $request_body 才能记录。

是的,Nginx 的 access_log 默认就包含请求方法(GET/POST 等),无需额外配置。关键在于如何从日志中准确识别、提取和区分它们。

请求方法在日志中的位置很固定

在标准 log_format combined 或自定义格式中,$request 变量完整记录了请求行,例如:

  • "GET /api/user?id=123 HTTP/1.1"
  • "POST /login HTTP/1.0"

请求方法(GET、POST、PUT、DELETE 等)总是出现在 $request 字符串最开头,紧跟双引号后、空格前。这是解析的基础依据。

用 shell 快速筛选 GET 或 POST 请求

直接用 grep 即可按需提取:

  • 查所有 POST 请求:grep '"POST ' /var/log/nginx/access.log
  • 查所有 GET 请求:grep '"GET ' /var/log/nginx/access.log
  • 排除 HEAD、OPTIONS 等干扰:加 word boundary,如 grep '"POST[[:space:]]' access.log
  • 统计每种方法出现次数:awk '{print $6}' access.log | sed 's/"//' | sort | uniq -c | sort -nr(假设 $6 是 $request 字段)

区分 GET 和 POST 的实际意义不止于方法名

GET 的参数明文暴露在 URL 中(即 $request_uri$request 里),而默认 access_log 不记录 POST 的 body 内容。这意味着:

  • 分析 GET 接口时,可直接从日志中看到完整查询参数,便于排查缓存、鉴权或非法访问
  • 分析 POST 接口时,仅靠默认日志只能知道“谁、何时、调了哪个路径”,无法得知传了什么数据 —— 若需参数级追踪,必须启用 $request_body 并自定义 log_format
  • 注意:启用 $request_body 有代价 —— 它只对非流式请求生效(如未使用 chunked encoding),且需确保 client_max_body_size 足够,并避免记录敏感字段(如密码)

验证日志是否真含请求方法的简单办法

执行这条命令,看输出前三行是否含 GETPOST

head -3 /var/log/nginx/access.log | cut -d' ' -f6 | sed 's/"//g'

如果返回类似 GETPOSTPUT,说明字段可用;若为空或异常,可能是日志格式被覆盖或字段顺序错位(常见于自定义 log_format 中漏写 $request)。

相关文章

精彩推荐