之前有人说 使用有名管道(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
}
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
学习