nginx中access_log按层级覆盖:location优先于server,匹配的location配置生效,server级为默认;log_format须在http块定义。

在 Nginx 中,access_log 指令的生效遵循明确的层级覆盖规则:location 块中的日志配置优先级高于 server 块。
server 块定义是默认日志行为
若仅在 server 块中设置 access_log,它会作用于该虚拟主机下所有未被 location 显式覆盖的请求路径。例如:
此时所有匹配该 server 的请求(只要没被更具体的 location 拦截)都会写入这个文件。
location 块可完全覆盖或禁用日志
当某个 location 块内也声明了 access_log,Nginx 会以该 location 内的配置为准,server 级的日志设置将被忽略。包括以下常见情况:
- 指定不同路径:
access_log /var/log/nginx/api.log;→ 该 location 的访问记录单独写入 api.log - 关闭日志:
access_log off;→ 此 location 下的请求不记录 access 日志 - 使用不同格式:
access_log /var/log/nginx/debug.log main;→ 可搭配自定义 log_format 使用
嵌套 location 的优先级取决于匹配精度
多个 location 之间不按书写顺序,而是按 Nginx 的匹配机制(前缀匹配、正则匹配等)决定哪个生效。一旦某个 location 匹配成功并定义了 access_log,就采用它的设置,不再回退到外层 server 或其他未匹配的 location。
例如:
location /static/ {access_log /var/log/nginx/static.log;
}
location ~ \.php$ {
access_log /var/log/nginx/php.log;
}
/static/js/app.js 走第一个 location,/index.php 走第二个,各自使用独立日志路径。
注意:log_format 必须在 http 块中定义
虽然 access_log 可在 server 或 location 中设置,但所引用的 log_format 名称必须在 http 块顶层声明,否则会报错“unknown log format”。location 中不能定义新格式,只能引用已定义的。











