正确的方法来旋转Nginx日志

我想实现nginx日志的轮换:

  1. 将工作没有任何额外的软件(即 – 如果没有“logrotate”最好)
  2. 会创build基于date名称的旋转文件

最好的办法就像PostgreSQL一样 – 即在它的log_filenameconfigurationvariables中,我可以指定strftime-style%Y-%m-%d,它会自动更改logindate(或时间)更改。

Apache的另一种方法 – 通过pipe道发送日志到rotatelogs程序。

就我所能search到的,不存在这样的方法。 我所能做的就是使用带有dateext选项的logrotate,但是它有自己的缺点,我宁愿使用像PostgreSQL中的rotatelogs或log_filename一样的东西。

当世界对于命名pipe道是友好还是敌手分歧的时候,这可能是解决你的问题的最简单的方法。 它有一些缺点(因为你需要提前创buildpipe道),但是它不需要cron,并允许使用你所select的日志pipe道filter。

以下是在access.log上使用cronolog的示例:

  1. 为我们的命名pipe道select一个path。 我打算把我的日志保存在/var/log/nginx ,所以我会把我的pipe道放在那里。 这个名字取决于你。 我追加.fifo ,它是access.log ,所以我的将在/var/log/nginx/access.log.fifo
  2. 删除文件,如果它存在。
  3. 为日志文件创build一个命名pipe道:

     mkfifo /var/log/nginx/access.log.fifo 
  4. configurationnginx.conf将日志指向刚刚创build的pipe道:

     access_log /var/log/nginx/access.log.fifo; 
  5. 启动服务器之前,修改init.d脚本以启动日志轮回侦听pipe道:

     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" ) & 

    一个类似的命令行将被用于rotatelogs如果你更喜欢它cronolog – 看他们的文档的语法。

    如果你的分配有一个start-stop-daemon ,你应该使用它,因为它理论上有任何关于你的平台的特殊知识,并为你打理。 只需将该命令封装在脚本中,并将其作为--exec传递给init.d/nginx start-stop-daemon

我已经写了一个简单的程序datelog来根据logging的date分割公共日志,而不是当前系统时间,当程序看到日志行时。 这可能是也可能不是正确的,或者是其他日志分割器已经做的,但是写我自己的东西比找出其他人做的更快。

在logging的请求中使用年份和月份,然后将行写入包含从logging的数据计算得出的YYYYMM的文件或pipe道。 是的,这对于通用的日志格式有些特别。 第一个[假定划定date。 谨防IPv6地址。 🙂

对于日志分析,重要的是每个日志实际上只包含每个月份的请求,并且每个日志理想情况下应该完成正确的分析结果。 根据日志分割器中的当前时间来确定文件名是不够的,因为从23:59:59开始的缓慢的请求将在日志文件中错误的月份结束。

我在nginx中通过一个名为fifo的方式来使用它,在nginx启动之前,这个方法被选中。 请注意,在程序中错误检测和缓冲输出之间有一个权衡,因为出于性能方面的考虑,datelog当前更喜欢缓冲输出,所以请确保你的设置真正起作用,特别是在使用shellpipe道时,为了不丢失任何日志数据。

源代码: http : //stuge.se/datelog.c

请随时给我任何反馈,当然补丁!

你可以使用简单的bash脚本和cron来实现这个function:

 #!/bin/bash DATE=$(date +%Y-%m-%d-%H%M) mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE kill -USR1 `cat /var/run/nginx.pid` sleep 1 gzip /var/log/nginx/access.log.$DATE gzip /var/log/nginx/error.log.$DATE 

更多关于设置crontab等的细节在这里find: 通过Cron旋转Nginx日志文件

恐怕我不能真正理解你的问题:由于nginx不支持任何内置的logrotation,你将不得不采取类似

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

在/etc/cron.daily的某个地方(当然你需要用完整的path名限定上面的文件名),或者安装apache2工具来访问rotatelogs。