轮换 Nginx 日志的正确方法

13 nginx log-files logging logrotate

我想实现 nginx 日志的轮换:

  1. 无需任何额外软件即可工作(即 - 最好没有“logrotate”)
  2. 将创建基于日期名称的旋转文件

最好的方法是像 PostgreSQL 那样的东西——即在它的 log_filename 配置变量中,我可以指定 strftime-style %Y-%m-%d,它会在日期(或时间)更改时自动更改日志。

来自 apache 的另一种方法 - 通过管道将日志发送到 rotatelogs 程序。

据我所能搜索 - 不存在这样的方法。我所能做的就是将 logrotate 与 dateext 选项一起使用,但它有自己的一组缺点,我宁愿使用类似 |rotatelogs 或 log_filename 在 PostgreSQL 中的东西。

小智 8

虽然世界对不起眼的命名管道是朋友还是敌人存在分歧,但它可能是解决您问题的最简单方法。它确实有一些缺点(因为您需要提前创建管道),但它消除了对 cron 的需要,并允许您使用您选择的日志管道过滤器。

这是使用 cronolog on 的示例access.log

  1. 为我们的命名管道选择一条路径。我打算保留我的日志/var/log/nginx,所以我也会把我的管道放在那里。名字由你决定;我追加.fifo,它是access.log,所以我的将在/var/log/nginx/access.log.fifo
  2. 如果文件存在,则删除该文件。
  3. 为日志文件创建一个命名管道:

    mkfifo /var/log/nginx/access.log.fifo
    
    Run Code Online (Sandbox Code Playgroud)
  4. 配置nginx.conf将日志指向您刚刚制作的管道:

    access_log /var/log/nginx/access.log.fifo;
    
    Run Code Online (Sandbox Code Playgroud)
  5. 我们启动服务器之前,修改您的 init.d 脚本以启动监听管道的日志循环器:

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    
    Run Code Online (Sandbox Code Playgroud)

    rotatelogs如果您愿意,可以使用类似的命令行cronolog- 请参阅他们的文档以了解语法。

    如果你的发行版有一个start-stop-daemon,你应该改用它,因为它理论上有关于你的平台的任何特殊知识,并pkill为你照顾。只需在脚本包住命令,并把它作为--execstart-stop-daemon你的init.d/nginx


Ste*_*ter 1

恐怕我不太明白你的问题:由于 nginx 不支持任何内置的 logrotation,你将不得不使用类似的东西

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)
Run Code Online (Sandbox Code Playgroud)

/etc/cron.daily 中的某个位置(当然,您需要使用完整路径名来限定上面的文件名)或安装 apache2 实用程序以访问旋转日志。