Nginx可通过http块中map指令将$host映射为动态日志路径,server块中引用$log_path实现按域名分离access_log;需用绝对路径、设default fallback,配合log_format可增强结构化输出。

可以通过 Nginx 的 map 指令结合变量,在 http 块中预先定义日志路径映射关系,再在各 server 块中统一引用该变量,实现按域名或路径动态分离 access_log 文件。
在 http 块中定义 map 映射
利用 map 将请求的 $host(或 $server_name)映射为对应日志文件路径。注意:map 必须定义在 http 块顶层,不能放在 server 或 location 内。
- 支持通配符和正则匹配,例如
~^www\.(.+)$可提取主域名 - 未匹配到的请求会使用 default 后指定的默认路径(建议设为通用 fallback)
- 路径建议用绝对路径,避免因工作目录变化导致写入失败
示例:
map $host $log_path {
default "/var/log/nginx/access_default.log";
site1.example.com "/var/log/nginx/site1_access.log";
site2.example.com "/var/log/nginx/site2_access.log";
~^www\.(.+)$ "/var/log/nginx/${1}_access.log";
}
在 server 块中启用动态日志路径
每个 server 块无需单独配置 access_log,直接引用 $log_path 即可自动分流。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- 确保
access_log指令位于server块内(不能只写在 http 块),否则变量不生效 - 可同时指定日志格式(如
main、json等已定义的 format) - 若需关闭某站点日志,可将对应 map 值设为空字符串,但注意空值会导致日志被禁用(Nginx 会跳过写入)
示例:
server {listen 80;
server_name site1.example.com;
root /var/www/site1;
access_log $log_path main;
}
配合 log_format 实现结构化输出(可选增强)
若需按站点定制日志字段(如添加 site_id、响应时间标签等),可在 map 中关联不同 format 名称,再配合多套 log_format 使用。
- 先定义多个日志格式:
log_format site1 '[$time_local] $site_id $request ...'; - 用另一个 map 将 host 映射为 format 名:
map $host $log_format_name { ... } - 但注意:Nginx 不支持 runtime 切换 log_format 名,需借助第三方模块(如 nginx-module-log-format)或改用 Lua 实现更灵活控制
验证与注意事项
配置完成后必须重载 Nginx 并检查日志生成情况。
- 运行
nginx -t确保语法正确,特别留意 map 块是否在 http 层级 - 执行
nginx -s reload生效,不要用 restart - 访问不同域名后,检查对应日志文件是否产生内容,注意权限问题(worker 进程需有写入权限)
- map 变量是惰性求值的,仅在首次用到时解析,性能开销极小










