nginx 中的日志轮换

nginx 中的日志轮换

我找到了一个在 Nginx 中进行日志轮换的示例这里

但可以进行一个简单的测试:

    set $date "2018-08-24";
    access_log /home/tim/log/access-http-$date.log default;

生成一个名为的日志文件access-http-.log。我使用的是 nginx 1.13.6 (带有 openresty)。

更新

经过多次修改和调整,我编写了以下 logrotate 脚本来轮换 nginx 生成的不同日志文件。我已将其放入 /etc/logrotate。剩下的问题是日志不会每天轮换(目前我不确定原因),但产生了logrotate -f <filename>我想要的结果。

有趣的是,nginx -s reload可以使用 代替 USR1。不幸的是,nginx 日志页面中没有引用它,但我找到了它(如果我没记错的话,是在手册页中)。我手动构建 openresty/nginx 以合并我需要的额外模块,因此我不会获得打包版本中附带的各种额外功能,例如 pid 保存。

/path/to/log/access-http.log /path/to/log/access-https.log /path/to/log/api.log /path/to/log/error.log {
    daily
    missingok
    notifempty
    create 664 nobody tim
    dateext
    dateformat -%Y-%m-%d
    dateyesterday
    rotate 10
    su tim tim
    postrotate
        /usr/local/bin/openresty -s reload
    endscript
}

我认为这对任何拥有大型 nginx 配置来同时提供网页和 API 的人来说都很有用。我将 http 分开,因为我不提供非 https 页面,这样可以防止脚本小子垃圾进入我的页面日志。

答案1

只需设置一个 cron 任务,在午夜前一分钟移动日志文件并用日期重命名,然后向 Nginx 发送 USR1 信号。这将触发它重新打开日志文件并为第二天创建一个新的日志文件。

59 23 * * * mv /var/log/nginx/access.log /var/log/nginx/$(date +%F).access.log && kill -USR1 $(cat /run/nginx.pid)

相关内容