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这个日志文件。




比如:

/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