Logrotate程序是一个日志文件管理工具。它用于拆分日志文件、压缩和转储、删除旧日志文件和创建新日志文件。以下是logrotate日志轮转记录:1.1logrotate配置文件介绍Linux系统默认安装logrotate,默认配置文件:/etc/logrotate.conf/etc/logrotate.d/logrotate.conf:主配置文件logrotate.d:用于配置相关子系统,用于隔离各个应用配置(Nginx、PHP、Tomcat...)Logrotate是基于CRON来运行的,脚本为/etc/cron.daily/logrotate,日志轮转由系统。Logrotate在实际运行时会调用配置文件/etc/logrotate.conf。Logrotate可以自动或手动触发日志轮转:logrotate-f/etc/logrotate.d/nginxlogrotate-f/etc/logrotate.d/php不过最好先通过Debug选项(-d参数)验证具体的logrotate正式执行命令格式如下:logrotate[OPTION...]-d,--debug:调试模式,测试配置文件是否有错误。-f,--force:强制转储文件。-m,--mail=command:压缩日志后,发送日志到指定邮箱。-s,--state=statefile:使用指定的状态文件。-v,--verbose:显示转储过程。1.2logrotater日志文件切割策略查看logrotate.conf配置:cat/etc/logrotate.confweekly//默认每周执行一次rotate轮转jobrotate4//保留多少日志文件(轮转多少次).默认是保留四个。即指定日志文件被删除前的轮转次数,0表示没有备份create//自动创建一个新的日志文件,新的日志文件与原文件具有相同的权限;因为日志改名了,必须新建一个才能继续存储上一条日志dateext//这个参数很重要!即切割后的日志文件以当前日期的格式结束,如xxx.log-20131216。如果被注释掉,则截出的数字递增,即前面提到的xxx.log-1的格式。compress//是否通过gzip压缩转储后的日志文件,如xxx.log-20131216.gz;如果不需要压缩,就注释掉include/etc/logrotate.d//导入/etc/logrotate.d/目录下的各个应用配置/var/log/wtmp{//只针对/var/设置的参数log/wtmpmonthly//每月切一次,而不是默认的minsize1Mperweek//只有当文件大小超过1M时才创建create0664rootutmp//指定新日志文件的权限以及它所属的用户和组到。rotate1//Onlykeeponelog.}这个wtmp可以记录用户登录系统和系统重启的时间。因为有minsize这个参数,不一定每个月执行一次。.取决于文件大小。Logrotate中其他可配置的参数如下:compress//对gzip压缩后的日志进行压缩转储nocompress//不进行gzip压缩copytruncate//对于还打开的日志文件,备份并截断当前日志;yes在先复制再清除的方法中,复制和清除是有时间差的,可能会丢失部分日志数据。nocopytruncate//备份日志文件但不截断createmodeownergroup//指定旋转时新建文件的属性,如create0777nobodynobodynocreate//不新建日志文件delaycompress//与compress一起使用时,转储的日志文件直到下一次转储才会被压缩。nodelaycompress//覆盖delaycompress选项,dump会同时被压缩。missingok//如果日志丢失,不报错,继续滚动到下一个日志errorsaddress//特殊存储时的错误信息发送到指定的Email地址ifempty//即使日志文件为空也轮转,这是logrotate的默认选项。notifempty//当日志文件为空时,不轮转mail地址//将转储的日志文件发送到指定的E-mail地址nomail//转储olddir目录时不发送日志文件//转储的日志文件放在指定目录,必须和当前日志文件在同一个文件系统中noolddir//转储的日志文件和当前日志文件放在同一个目录下sharedscripts//运行postrotate脚本轮转所有日志然后执行脚本一次。如果不配置,每次logrotation后都会执行脚本prerotate//在logrotatedump之前需要执行的指令,比如修改文件的属性等动作;postrotatemustbeperformedindependently//在logrotatedump之后需要执行的指令restart(kill-HUP)aservice等命令!Daily//指定dump周期为dailyweekly//指定dump周期为weeklymonthly//指定dump周期为monthlyrotatecount//指定日志文件删除前的dump次数,0表示不备份,5表示keep5backupsdateext//使用当前日期作为命名格式dateformat.%s//配合dateext出现在下一行定义文件切割后的文件名。必须和dateext一起使用,只支持%Y%m%d%s这四个参数日志大小可以指定字节(默认)和KB(sizek)或MB(sizem)。当日志文件>=日志大小时转储。以下是合法的格式:(其他格式的单位大小写我没试过)size=5orsize5(dumpif>=5bytes)size=100korsize100ksize=100Morsize100M1.3NGINX日志配置示例参考:vim/etc/logrotate.d/nginx/var/log/weblog/*.log{daily//指定转储周期为dailycompress//通过gzip压缩转储的日志rotate7//保存7天的日志missingok//如果日志文件丢失,不显示错误notifempty//当日志文件为空时,不旋转dateext//使用当前日期作为命名格式,exp:nginx_access.log-20190120sharedscripts//运行postrotate脚本postrotate//执行命令if[-f/run/nginx.pid];thenkill-USR1`cat/run/nginx.pid`fiendscript//endcommand}1.4PHP-FPM日志配置示例参考:vim/etc/logrotate.d/nginx/usr/local/php/var/log/*.日志{dailycompressrotate7missingoknotifemptydateextsharedscriptspostrotateif[-f/usr/local/php/var/run/php-fpm.pid];然后kill-USR2`cat/usr/local/php/var/run/php-fpm.pid`fiendscript}1.5Logrotater日志切割和轮询由于Logrotate是基于CRON的,所以这个日志轮转的时间是由CRON控制的。具体可以查询CRON的配置文件/etc/anacrontab,老版本文件是(/etc/crontab)查看轮转文件:/etc/anacrontabcat/etc/anacrontabSHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootRANDOM_DELAY=45START_HOURS_RANGE=3-2215cron.dailynicerun-parts/etc/cron.daily725cron.weeklynicerun-parts/etc/cron.weekly@monthly45cron.monthlynicerun-parts/etc/cron.monthly使用anacrontab轮换配置文件,日志切割的有效时间在凌晨3点到22点之间,随机延迟时间为45分钟,但是这个配置不能满足我们在现实中,目前的需求是将切割时间调整到每天晚上12点,即每日切割日志为前一天0-24点之间的内容。操作如下:mv/etc/anacrontab/etc/anacrontab.bak//取消日志自动轮转的设置使用crontab作为日志轮转的触发容器,修改Logrotate的默认执行时间vi/etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/run-parts01rootrun-parts/etc/cron.hourly5923*rootrun-parts/etc/cron.daily2240rootrun-parts/etc/cron.weekly4241rootrun-parts/etc/cron.monthly1.6logrotate无法自动轮询日志的解决办法现象:使用logrotate轮询nginx日志。配置好后,发现连续两天nginx日志没有被切。检查后确认配置文件一切正常。这就是为什么??强行启动日志文件维护操作,即使logrotate命令认为不需要,应该也有可能是logroate认为nginx日志太小,不轮询所以需要进行轮询,即在/etc/cron.daily/logrotate脚本中,将-t参数替换为-f参数vim/etc/cron.daily/logrotate!/bin/sh/usr/sbin/logrotate/etc/logrotate.confEXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-flogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit0最后重启cron服务:/etc/init.d/crondrestartStoppingcrond:[OK]Startingcrond:[OK]