使用logrotate轮询Nginx的日志

之前有人说 使用有名管道(mkfifo)+cronolog比较方便 这里我不推荐  因为涉及到Linux系统里面的阻塞和非阻塞问题。我们可以做这个测试

[bash]mkfifo test.log
echo something >test.log[/bash]

这时候你会发现echo被阻塞在这里 不能结束 也不能进行。因为没有任何东西在读test.log这个有名管道,可以再开一个终端做个测试

[bash]md5sum <test.log[/bash]

这时候 原来那个终端里面的echo也正常停止了

nginx也是工作在这样的阻塞模式下面 如果使用有名管道来轮询日志 一旦轮询日志的cronolog挂了 Nginx也就被阻塞在那里 无法提供服务。

logrotate好处很多 可以设定周期 系统也自带 还能压缩 唯一的“缺点”是不能设定保存轮询日志的目录在原日志的不同分区 因为它是英国rename来实现的。

这里我们先写一个脚本 来让nginx重新打开日志

[bash]nano /usr/local/bin/nginx-re-open-log[/bash]

写入

[bash]#!/bin/bash
kill -USR1 ps aux |grep nginx |grep master |awk '{print $2}' || exit 1
exit 0
[/bash]

[bash]chmod +x /usr/local/bin/nginx-re-open-log[/bash]

然后写logrotate配置文件

[bash]nano /etc/logrotate.d/nginx[/bash]

写入

/usr/local/nginx/logs/*/*.log
/usr/local/nginx/logs/*.log
{
daily
rotate 3
missingok
notifempty
compress
sharedscripts
olddir /home/data/httplogs/old_log
postrotate
nginx-re-open-log
endscript
}

logrotate参数表
daily 轮询周期设定为每日天 其他参数还有weekly monthly
rotate 保存的轮询数目
missingok 如果日志不存在 忽略之
notifempty 如果日志为空 忽略之
compress 使用GZ压缩日志
sharedscripts 当这个选项启用的时候 做完所有的日志轮询前/后再运行pre/post

脚本 否则每个日志轮询前/后都运行一遍pre/post脚本

olddir 保存轮询日志的目录 必须和原日志在同一个分区
prerotate/endscript 轮询结束前运行的脚本 脚本内容从prerotate开始 到endscript结束
postrotate/endscript 轮询结束后运行的脚本 脚本内容从postrotate开始 到endscript结束

更多内容 参加man手册 http://linuxcommand.org/man_pages/logrotate8.html

Author Info :
  • From:使用logrotate轮询Nginx的日志
  • URL:https://blog.ihipop.com/2011/04/2218.html
  • Please Reserve This Link,Thanks!
  • 《使用logrotate轮询Nginx的日志》上有1条评论

    回复 freetstar 取消回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注