Logrotate 对服务器日志按照小时切割并压缩

背景介绍

对于互联网小公司而言,对于服务日志的处理一般都不咋样,在微服务使用之后之后可能稍微好一些,但还是有很多传统的服务,如:Tomcat,Nginx 等在日志处理的时候仍然不是很友好。主要是很多时候开发需要查看线上服务的日志便于查找 BUG,所以我们很多时候不是在查日志就是查日志的路上。

为了便于开发自己去查看日志于是便使用 Nginx 做了个日志下载站点。但是问题再次来了,那就是日志量太大,不好下载。怎么办?压缩呗。毕竟纯文本压缩比率超级高,100M 的文件能够压缩到几 M 不香吗?

但是即使压缩之后,解压后仍然很多,我们可能只需要查看的是几点到几点的,其它的对于我们没有意义。要是能够按照小时再切割一下就好了。

于是想到了 Linux 的 logrotate。但是默认的规则好像并不能满足我们的需求,因为它最低的时间也是按天计算的。

这时候就需要另外一个东西了,crontab 定时任务。

关于 logrotate

一般在服务器初始化的时候这些工具都已经存在的,但是为了保险,还是手动安装一下:

yum -y install logrotate

服务简单的说明:

服务的主配置文件:/etc/logrotate.conf 

在主配置中可以看到 include /etc/logrotate.d 说明我们可以将用户定义的配置直接放到这下面,系统会自动为我们执行。当然,系统的并不能很好的满足我们需求。

再看看配置模板:

日志文件绝对路径 {
    各种参数...
}

参数包含:

参数说明
compress 日志轮替时候对旧日志就行 gzip 压缩
nocompress 不压缩
daily 按天轮替
dateext 使用当前日期命名旧日志
dateformat .%s 对日期进行格式定制
ifempty 日志没有内容的时候也进行轮替
notifempty 日志是空的就不轮替
mail 将轮替后的文件发送到指定E-mail地址
nomail 不发邮件
copytruncate 轮替时候先拷贝日志,备份拷贝文件,在清空本来的文件,这样不会导致轮替后原文件消失,缺点就是可能丢失小部分日志
monthly 一个月轮替一次
olddir 轮替后日志文件放入指定的目录
rotate 轮替最多保留之前的数据几次
size 当日志增长到指定大小的时候开始轮替
weekly 按周轮替
yearly 按年轮替
Missingok 如果日志丢失,不报错继续滚动下一个日志

切割 Tomcat 日志示例 

说明:

1. 服务器上面有这样一个 tomcat 日志:/data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/catalina.out

2. 我们想将这个文件按每两小时切割一次并压缩,保留 100 个旧的切割,切割的文件保存到:/data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/archives 目录下。

开始配置:

1. 添加 logrotate 配置文件:

vi /etc/logrotate.d/tomcat

内容如下:

# MALL LOGROTATE
/data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/catalina.out {
    notifempty 
    copytruncate
    rotate 100
    missingok
    compress
    dateext
    dateformat .%Y%m%d-%H
    olddir /data/TEST-01-BACKEND/MALL/MALL-WEB-Serice-8000/logs/archives
}

红色部分需要注意,第一个是为了轮替之后原文件还存在,第二个为压缩,第三个定义切割后文件的名称。

2. 手动执行一次轮替:

/usr/sbin/logrotate -vf /etc/logrotate.d/tomcat

这里如果报错:because parent directory has insecure permissions (It's world writable or writable by group which is not "root") 

只需要在配置中参数加入:

su root root

3. 查看轮替后效果:

可以看到原本 300M 左右的被压缩到 64 M。

4. 加入定时任务:

crontab -e

内容如下:

# LOGROTATE
0 */2 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat >> /tmp/logrotate.log

这样就能每隔两小时轮替一次了! 

原文地址:https://www.cnblogs.com/Dy1an/p/12106186.html