暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

玩转linux日志切割工具logrotate

分布式存储技术进阶 2019-12-25
1834

日志文件记载了系统中发生的事件的重要信息,以及程序运行过程中可能发生的故障错误信息,在问题定位和故障排查、系统性能分析中具有重要的作用。

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

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

指定日志文件删除之前转储的次数,指没有备份,指保留个备份

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 {

  

}


文章转载自分布式存储技术进阶,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论