是的,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 字符串最开头,紧跟双引号后、空格前。这是解析的基础依据。
直接用 grep 即可按需提取:
grep '"POST ' /var/log/nginx/access.log
grep '"GET ' /var/log/nginx/access.log
grep '"POST[[:space:]]' access.log
awk '{print $6}' access.log | sed 's/"//' | sort | uniq -c | sort -nr(假设 $6 是 $request 字段)GET 的参数明文暴露在 URL 中(即 $request_uri 或 $request 里),而默认 access_log 不记录 POST 的 body 内容。这意味着:
$request_body 并自定义 log_format$request_body 有代价 —— 它只对非流式请求生效(如未使用 chunked encoding),且需确保 client_max_body_size 足够,并避免记录敏感字段(如密码)执行这条命令,看输出前三行是否含 GET 或 POST:
head -3 /var/log/nginx/access.log | cut -d' ' -f6 | sed 's/"//g'
如果返回类似 GET、POST、PUT,说明字段可用;若为空或异常,可能是日志格式被覆盖或字段顺序错位(常见于自定义 log_format 中漏写 $request)。