是否可以在 nginx 错误日志文件名中使用映射变量?

是否可以在 nginx 错误日志文件名中使用映射变量?

我已经配置了这样的网站:

map $time_iso8601 $yyyy {
    default '0000';
    "~^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})" $y;
}

map $time_iso8601 $mm {
    default '00';
    "~^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})" $m;
}

map $time_iso8601 $dd {
    default '00';
    "~^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})" $d;
}

server {
    listen 80;
    server_name myapp.initech.com;
    error_log /sitelogs/initech/myapp/error.$yyyy-$mm-$dd.log;
    access_log /sitelogs/initech/myapp/access.$yyyy-$mm-$dd.log;

    location / {
        root /site/initech/data/myapp;
        autoindex on;
    }
}

重新加载服务器并进行一些测试请求后,我的日志目录如下所示:

$ ls -1 /sitelogs/initech/myapp
access.2022-10-28.log
error.$yyyy-$mm-$dd.log

在我看来,我可以使用 map 指令来设置一个变量,该变量用于访问日志的名称,但不能用于错误日志的名称。是这样吗?

我可以合理化这一点,因为 map 指令仅在特定 HTTP 请求的上下文中运行,而从某种意义上说,错误日志必须在所有 HTTP 请求中设置。

如果是这种情况,有什么方法可以获取日期错误日志文件名?我们公司现有的日志归档流程无法很好地处理文件名冲突,因此拥有日期错误日志文件将非常非常有帮助。

答案1

访问日志名称中使用的变量,而不是错误日志中使用的变量

正确,Nginx 文档将明确注意指令何时接受变量(以及这样做时会受到哪些限制和性能影响)。许多指令不要


您的发行版可能会提供一个适合您的系统的文件,如果没有,请查看/etc/logrotate.d/nginxDebian 中提供的文件以获取模板。Logrotate 还可以在文件名中使用您想要的日期(旋转时间的前一天),如下所示:

/sitelogs/*/*/*.log {
    nocompress
    dateext
    dateformat .%Y-%m-%d.%s
    daily
    dateyesterday
    postrotate
      ...
}

相关内容