Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询相关的知识,希望对你有一定的参考价值。
参考技术A有些服务,会自动产生大量的日志文件,如果不限制,会占用磁盘空间。
如果单纯的用定时任务crontab删除,又不太灵活,这时需要日志神器logrotate。
logrotate工具是系统自带为了方便进行日志管理而产生的一个工具。
系统会定时运行 logrotate,一般是每天一次。也是基于定时任务crontab运行的。
配置文件:
主配置文件的位置在 /etc/logrotate.conf,一般配置在 /etc/logrotate.d/子目录下。
如系统默认日志配置:
配置文件参数:
更多信息请参考man logrotate帮助文档
模板是通用的,而配置参数则根据你的需求进行调整,不是所有的参数都是必要的。
在上面的配置文件中,我们只想要轮询一个日志文件,size=50M 指定日志文件大小可以增长到 50MB,dateext 指 示让旧日志文件以创建日期命名。
可自行参考/etc/logrotate.d/目录下系统默认的文件。
logrotate命令:
具体 logrotate 命令格式如下:
要为某个特定的配置调用 logrotate:
排障过程中的最佳选择是使用-d选项以预演方式运行 logrotate。要进行验证,不用实际轮循任何日志文件, 可以模拟演练日志轮循并显示其输出。
正如我们从上面的输出结果可以看到的,logrotate 判断该轮循是不必要的。如果文件的时间小于一天,就会发生了。
强制轮循即使轮循条件没有满足,我们也可以通过使用-f选项来强制 logrotate 轮循日志文件,-v参数提供了详细的输出。
个人项目配置:
项目每天可产生20G左右的日志,显示不能做每日轮询,所以额外需要添加定时任务做每小时,或者每隔多少分钟。
如果轮询日志异常报错如下:
error: skipping “” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.”
需要加 su root root 选项。
同时添加定时任务:
定时任务说明:
第一条,每隔40分钟轮询执行一次logrotate任务。
第二条,每天凌晨4点删除前一天的日志,原因如下:
由于项目系统产生日志格式的原因,会导致以下情况:
如果昨天的分割到4个后(或者1,2,3),时间到第二天后,没法转储递增,会一直停留在4,没法删除,每天会有,久而久之,也会占用磁盘空间。所以需要定时删除。
设置完成
开启定时任务日志,以便查看定时任务是否执行。后续可取消。
重启rsyslog
Logrotate实现Catalina.out日志每俩小时切割
一.Logrotate工具介绍
Logrotate是一个日志文件管理工具,它是Linux默认自带的一个日志切割工具。用来把旧文件轮转、压缩、删除,并且创建新的日志文件。我们可以根据日志文件的大小、天数等来转储,便于对日志文件管理,一般都是通过cron计划任务来完成的,让日志切割实现按小时分割,按天分割等。
二.Logrotate运行机制
系统会定时运行logrotate,一般是每天一次。系统是这么实现按天执行的。crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate。
[[email protected] ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
实际运行时,Logrotate会调用配置文件/etc/logrotate.conf
三.Logrotate的组成
/usr/sbin/logrotate #程序所在位置;
/etc/cron.daily/logrotate #默认让Cron每天执行logrotate一次;
/etc/logrotate.conf #全局配置文件;
/etc/logrotate.d/ #应用自个的配置文件存放目录,覆盖全局配置;
注意:logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。另外,如果/etc/logrotate.d/里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。
四.Logrotate的命令格式
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。
例如:想强行切割日志文件,不等logrotate切割。
[[email protected] ~]# /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat #我是用来测试用的嘿嘿 注意:CentOS7 命令是在/usr/sbin/里。
五.常用配置参数说明
Logrotate功能的实现,最重要的就是它的配置参数
下面介绍下它常用的配置参数:
compress |
启用压缩,指的是轮替后的旧日志,这里默认用的是gzip压缩的 |
daily |
每天轮替 |
dateext |
使用当期日期作为命名格式 |
dateformat .%s |
配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 |
ifempty |
即使日志文件是空的也轮替 |
|
将轮替后的文件发送到指定E-mail地址 |
copytruncate |
用于还在打开中的日志文件,把当前日志备份并截断,是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 |
monthly |
一个月轮替一次 |
nocompress |
如果在logrotate.conf中启用了压缩,这里是做不用压缩的参数 |
nomail |
不发送邮件到任何地址 |
notifempty |
如果日志是空的就不轮替(也就是空日志不切割) |
olddir + 目录 |
轮替后日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
rotate +次数 |
轮替最多保留之前的数据几次,超出的将被删除或邮件接收,设为0则不保存 |
size size |
当日志增长到指定大小的时候开始轮替 |
weekly |
如果当前的星期几比上次轮替的星期几少,或者过了一个多星期,就会发生轮替通常是在每周的第一天轮替,如果logrotate不是每天运行的,会在第一次有机会时进行轮替 |
yearly |
如果当前年份不同于上次轮替的年份,则进行日志轮替 |
Missingok |
如果日志丢失,不报错继续滚动下一个日志 |
六.安装配置Logrotate
#yum安装下
[[email protected] ~]# yum -y install logrotate
#机器已经装好tomcat,下面配置切割tomcat日志的配置文件
[[email protected] ~]# vim /etc/logrotate.d/tomcat
注意:logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。
日志文件的切割轮循设置在独立的配置文件中,它们是放在/etc/logrotate.d/目录下的。
[[email protected] ~]# mkdir -p /var/log/tomcat/oldlog [[email protected] ~]# cat /etc/logrotate.d/tomcat /usr/local/tomcat8/logs/catalina.out { #要切割的日志路径,如果是多个就用空格分隔 notifempty #如果日志是空的就不轮替(也就是空日志不切割) rotate 5000 #轮替最多保留之前的数据5000次 missingok #如果日志丢失,不报错继续滚动下一个日志 compress #启用压缩,指的是轮替后的旧日志,这里默认用的是gzip压缩的 dateext #使用当期日期作为命名格式 dateformat .%Y%m%d-%H点 #配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s olddir /var/log/tomcat/oldlog #轮替后日志文件放入指定的目录 }
注意:我这个配置里没有设置多久切割一次,但是它也是一天切割一次,因为当/etc/logrotate.d/tomcat这个文件没有配置时,默认是每天定时执行/etc/cron.daily/logrotate这个文件,这个文件是一天一次的。
#强制执行切割,查看/var/log/tomcat/oldlog下是否有日志
[[email protected] ~]# /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat reading config file /etc/logrotate.d/tomcat olddir is now /var/log/tomcat/oldlog Allocating hash table for state file, size 15360 B Handling 1 logs rotating pattern: /usr/local/tomcat8/logs/catalina.out forced from command line (5000 rotations) olddir is /var/log/tomcat/oldlog, empty log files are not rotated, old logs are removed considering log /usr/local/tomcat8/logs/catalina.out log needs rotating rotating log /usr/local/tomcat8/logs/catalina.out, log->rotateCount is 5000 Converted ‘ .%Y%m%d-%H点‘ -> ‘.%Y%m%d-%H点‘ dateext suffix ‘.20181226-15点‘ glob pattern ‘.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9]点‘ glob finding old rotated logs failed fscreate context set to unconfined_u:object_r:usr_t:s0 renaming /usr/local/tomcat8/logs/catalina.out to /var/log/tomcat/oldlog/catalina.out.20181226-15点 compressing log with: /bin/gzip set default create context to unconfined_u:object_r:usr_t:s0 set default create context
#查看切割结果
#把之前切割的删除了,因为再定时切割文件是相同的,还是catalina.out.20181226-15点.gz这个文件,所以不会切割成功。
[[email protected] ~]# rm -rf /var/log/tomcat/oldlog/catalina.out.20181226-15点.gz [[email protected] ~]# ls /var/log/tomcat/oldlog/ [[email protected] ~]#
#设置定时任务,每一分钟切割一次(注意:日志里要有内容,因为前面定义空的日志文件是不切割的)
[[email protected] ~]# crontab –e */1 * * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat >>/var/log/tomcat/oldlog/cutting.log
#每俩小时切割一次
[[email protected] ~]# crontab -l 0 */2 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat >> /root/chenjiaxin/cutting.log
#查看定时切割的结果
当然,上面设置一分钟切割一次,是为了实验能尽快看到效果。实际是需要根据公司需要来设置多久来切割一次日志的!
以上是关于Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询的主要内容,如果未能解决你的问题,请参考以下文章