前言
服务器在服务运行的时候,难免会生成大量日志,一般来说遇到日志过多的情况,就会写一个看门狗:监控磁盘容量的大小,如果磁盘剩余空间小于某个值,就去日志文件夹里把一个月或者几个月之前的废弃日志删除掉以达到释放磁盘空间的目的。
但是往往有的时候过期的日志很重要,或者即使是一周的时间内,也会生成容量非常可观的日志,那么就需要使用logrotate命令来管理这些日志,这个命令是linux自带的。
logrotate这个命令的用法请看:https://linux.cn/article-8227-1-rel.html
和https://linux.cn/article-4126-1.html
。
实验开始
首先,假设服务器里某个日志文件夹里的日志auc.log.10
是这样的:
然后在logrotate的配置文件是这么写的:
1
2
3
4
5
6
7
8/mnt/hswx/auc/logs/auc.log.10 { 这里是目标日志的绝对路径
daily 每天执行一次
minsize 200M 文件容量大于200M开始处理,如果到了时间但是没有大于200M,不会处理
compress 压缩
dateext 文件会以日期为后缀
create 777 root root 新建的那个日志文件属性是777
rotate 2 保留最多2个文件
}
然后执行logrotate -vf /etc/logrotate.conf
,看到的效果是:
命令执行后,服务器create了新的auc.log.10
,而且属性变成了777,同时把原有的部分压缩成gz的格式。
上面那个测试的对象是已经过期的日志,现在我们要压缩当前的日志,目的是在压缩了auc.log并且重命名之后,可以生成新的auc.log,同时这个新的auc.log会被写入
。
现在我们尝试一下,把原来的配置文件改成这样:
1
2
3
4
5
6/mnt/hswx/auc/logs/auc.log {
weekly
minsize 200M
compress
rotate 2
}
但是执行之后,我们发现变成了这样:
原来的auc.log
不见了,而出现的auc.log.1
里面的内容是原来auc.log
的内容,可见原有的auc.log
已经被顶掉了。这是因为我们上面的配置文件里面没有加上dateext
,所以默认会以.1、.2、.3
为后缀。
问题是我们没有生成auc.log
,那么这段时间的日志就会找不到auc.log
而凭空消失。可见这个方法没有达到我们的目的,需要改进。
改进之后
我们这个内部模块auc只有重新启动这个进程才会生成auc.log
,既然要解决这样的问题,我们很自然的就想到kill -HUP
这种平滑启动的方式,但是要注意!kill -HUP
对deamon会进行重新读取配置启动,但是对于普通的进程只会把其杀死!而这个auc就是一个普通的java程序,没有配套的守护进程。所以只能使用一般的重启方式来达到生成auc.log
这个目的。
首先我们把原来的配置文件改成这样:
1
2
3
4
5
6
7
8
9
10
11/mnt/hswx/auc/logs/auc.log {
weekly #每周执行
dateext #以日期作为后缀
minsize 200M #到达了200M自动执行,不然即使到了一周的时间也不执行
compress #压缩
rotate 2 #最多保留两个文件
sharedsripts
postrotate #在执行完日志压缩之后就执行如下动作
/bin/bash /root/restart.sh #动作就是执行这个绝对路径的脚本
endscript #收工
}
而这个restart.sh
的内容很简单:
1
2
3
4
cd /mnt && ./stopAUC.sh #停止auc进程
cd /mnt && ./startAUC.sh #启动auc进程
echo HAHAHAHA!!! #表示已经OK了,让我们发出杠铃一般的笑声
现在我们重新跑一下logrotate,logrotate -vf /etc/logrotate.conf
。看一下效果:
可以看到先把日志改名压缩,完事后也执行了restart.sh
这个脚本,再日志里一看,auc.log
也顺利生成了!