
引
言
日志文件记载了系统中发生的事件的重要信息,以及程序运行过程中可能发生的故障错误信息,在问题定位和故障排查、系统性能分析中具有重要的作用。
但是随着程序运行时间的逐渐增加,日志文件也会不断积累,尤其是一些频繁的请求或操作,可能会导致日志量剧增。当日志文件持续增长时,需要定时对日志文件进行切割、压缩、转储,否则会影响日志写入速度,长久来看也会影响软件或者系统性能,更不便于开发或者维护人员查询、归档,更有甚者,如果日志短时间剧增,可能会占据大量内存空间,严重影响设备或者应用程序的正常运行。


logrotate是CentOS系统自带的一个非常有用的日志切割工具,不需要安装额外组件,即可实现日志截断、压缩以及删除清理的功能,在linux程序开发中被广泛的使用。
列如用户可以根据时间周期或者日志大小(size)增加自定义配置文件,进行轮询检测,当检测周期到达或者日志包大小到达或者超过阈值,logrotate会自动进行日志分割、压缩,生成新的日志文件,并根据历史日志保存个数的配置,对压缩后的历史日志进行清理,避免日志文件无限制增长。若当前系统没有安装,可以使用yum命令进行安装,方法如下:
yum -y install logrotate crontabs
软件包信息说明:
[root@localhost ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
安装完成后,需要重启rsyslog服务:
systemctl restart rsyslog.service
从logrotate的软件包信息看,它默认的主配置文件是/etc/logrotate.conf。另外还定义了一个目录logrotate.d,用户可以在该目录下面增加需要日志自动分割处理的程序的配置。在logrotate运行过程中,该目录里面的所有文件都会被自动的读入到/etc/logrotate.conf中执行。logrotate.conf中一般都是默认的配置项,如果觉得默认配置项不符合个人需求,用户可以在logrotate.d中重新配置。实际运行时,logrotate会自动加载该目录下面的配置文件,将缺省值替换成用户自定义的配置项。
需要注意的是logrotate并不能实时监控日志文件的大小,需要借助于定时轮询机制crond来运行的,需要先了解下linux的crond服务。




在LINUX中,周期执行的任务一般由cron这个守护进程来处理。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
cron的配置文件称为“crontab”,是“cron table”的简写。cron的定
时任务文件可以放在/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、 /etc/cron.monthly/等目录下面,
分别按小时、天、周、月等轮询周期,读取对应的配置脚本文件,执行定时任务。
logrotate这个任务默认放在cron的每日定时任务cron.daily下面,查看其默认的执行脚本:





可看到,到轮询时间(daily)到达,cron会执行该脚本,会拉起logrotate进程,读取默认配置文件logrotate.conf,当然在logrotate里面会把用户自定义的配置策略加载进去,再逐一判断对应的日志文件是否需要进行裁剪、清理等操作。logrotate默认的执行策略就是按天为周期,如果在时间运行过程中,日志文件增加的比较快,则需要修改成以小时为周期的策略(hourly)。
操作要点:
需要将logrotate的定时任务脚本文件从/etc/daily目录下拷贝到/etc/hourly,如果所有日志都按照按小时轮询的话,那就需要mv脚本而不是cp。当然这种情况下由于轮询的周期变短,对系统性能有一定的影响。可以只需要将日志文件大小增长过快的
配置项改成按小时轮询的策略。那么cron的执行脚本文件就不需要让logrotate去执行所有的配置,只需要读取对应的配置文件即可:
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.d/xxxx。
完成脚本修改后,需要重启cron服务来让配置生效:
sudo systemctl restart crond




logrotate配置项介绍:
参数 | 功能说明 |
compress | 通过gzip 压缩转储以后的日志 |
nocompress | 不需要压缩时,用这个参数 |
uncompresscmd | 解压日志,默认是gunzip |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断 |
nocopytruncate | 备份日志文件但是不截断 |
create mode owner group | 转储文件,使用指定的文件模式创建新的日志文件 |
nocreate | 不建立新的日志文件 |
delaycompress | 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩 |
errors address | 专储时的错误信息发送到指定的Email 地址 |
ifempty | 即使是空文件也转储,这个是 logrotate 的缺省选项 |
notifempty | 如果是空文件的话,不转储 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
prerotate/endscript | 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行 |
postrotate/endscript | 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行 |
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
rotate count | 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 |
tabootext [+] list | 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ |
size | 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及K (sizek)或者M (sizem)、G |
缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。

缺省配置中的配置项简介:
weekly 指定所有的日志文件每周转储一次。
rotate 4 指定转储文件的保留 4份。
dateext 日期作为日志压缩包的后缀,用于日志文件是否已经生成的判断依据
create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。如果设置的是以小时为轮询周期,还需要设置dateformat参数,该参数定义了日志经过压缩处理后的文件名称格式,默认是按年月天的后缀格式(-%Y%m%d),如果是按小时轮询的话,需要改成-%Y%m%d%H的格式。
compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。
include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。
当前环境include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d目录。
include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d ,/etc/logrotate.d/里的每个文件配置会覆盖或追加该文件默认的参数,如果未指定参数,则采用logrotate.conf中默认的参数,比如logrotate.conf中,rotate默认为4, test(四章中的例子)文件指定rotate为50,将覆盖rotate配置。




举例配置一个logrotate定时任务
服务器上配置
/var/log/debug.log{
daily ;每天转储
rotate 30 ;保留30个备份
compress ;压缩转储的备份文件
copytruncate ;备份当前日志并截断
nocreate ;不创建新的日志文件
delaycompress ;转储的日志文件到下一次转储时才压缩
notifempty ;日志为空不转储
dateext ;为日志文件打上日期标签
}
如果有安装nginx,可以参考nginx里的配置例子
/var/log/nginx/*log {
create 0644 nginx nginx
daily
rotate 10
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
第一行定义的是日志文件的路径,可以用*通配,一般可以定义成*.log来匹配所有日志文件。也可以指定多个文件,用空格隔开,比如
/var/log/nginx/access.log /var/log/nginx/error.log {
}






