Linux系统自带的logratate自带的日志滚动压缩的工具,性能很高,经常使用来压缩程序的日志。
参考:
lograte 实现方式原理
参考:
http://www.cnblogs.com/sailrancho/p/4784763.html
记住默认滚动的方式是最好的,建议不要去改成第二种(copyctruncate)。
第二种方式是,比如你要滚动,nginx_access.log,copyctruncate的实现方式是,
第一步: cp nginx_access.log nginx_acessess.log-20170708
第二步: echo "" > nginx_access.log
优点是:
nginx_access.log 的文件句柄 ,file 的inode永远不变,应用程序写的文件句柄一直同一个。
缺点是:
第一步和第二步的这个时间过程中的日志会丢失。
而第一种方式是:create的方式:
第一步: mv nginx_access.log nginx_acessess.log-20170708
第二步: touch nginx_access.log(logrotate 做到动作)
优点是:
日志不会丢失,mv重命名之后,nginx的程序写入的日志将会是nginx_acessess.log-20170708(因为inode没有改变),所以不会丢失日志。但是为了解决 日志如何才能写入到新的文件access.log中,所有logratate中提供了 滚动之后,可以执行脚本比如 reload nginx 重新nginx,所以nginx会重读access.log这个日志文件。
比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/data1/logs/nginx/*.log
/data2/logs/nginx/*.log{
daily
missingok #如果日志文件不存在,logratete 会报错,这个来关闭这个报错。
rotate 32
compress
delaycompress #延迟一天进行压缩,通compress一同使用
notifempty # Do not rotate the log if it is empty
sharedscripts #无论日志匹配了几个,postrotate 脚本只执行一次
postrotate
[ -f /data1/env/nginx/logs/nginx.pid ] && kill -USR1 `cat /data1/env/nginx/logs/nginx.pid`
endscript
}
|
####
其他疑问和解决:
1. 如何改变滚动的日志的权限,
参数:
create mode owner group
默认滚动的新日志的权限,是和上一个日志权限继承过来的。
2. 压缩的时间
决定/usr/sbin/logrotate -f /etc/logrotate.conf 这个的执行时间。默认是
cat /etc/cron.daily/logrotate 和 cat /etc/anacrontab
决定了默认是在凌晨3:00多点的随机时间执行。
如果要改成每天定时呢?
推荐方案:
第一步: 注释默认
cat /etc/cron.daily/logrotate 文件内容注释
第二步:添加压缩的crontab
# Puppet Name: # 零点压缩日志
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.conf >/dev/null 2>&1