使用 Linux 自带的 logrotate 管理你的所有日志
我们在开发的过程中,会创建非常多的日志,对日志进行 rotate 是一个基本要求。
所谓的rotate
,可以理解为对日志按照一定的规则进行切分。例如,每天晚上0点生成一个新的日志文件,并把老的文件归档。又或者每个日志文件超过多少 MB 以后就自动切分,并把老的内容单独存档或者压缩。存档以后的日志文件保存多少个。超过数量以后先删除老日志再删除新日志。
如果我们使用的是 Python,那么我们可以使用自带的logging
模块或者第三方的logoru
来写日志。但如果我们使用像是 MongoDB这种第三方的软件,那么要对日志进行 rotate 就非常麻烦了。如果不加以管理,MongoDB 的日志很容易就达到几十GB。
还有其他软件,他们的日志散落在系统的各个位置,我们应该如何替他们 rotate 呢?
如果你的系统是 Linux,那么主流发行版一般都会自带一个软件,叫做logrotate
,通过简单的配置,就能让它帮你管理系统中各个地方的日志。
我们以 MongoDB 为例来进行说明。
MongoDB 的日志默认放在/var/log/mongodb
文件夹中,如下图所示:
如果不干涉,那么所有的日志内容会无限制追加到这一个mongod.log
文件中。并且,如果你的 MongoDB 正在运行,即使你使用rm
命令删除了这个文件,它占用的空间也不会释放。
但使用logrotate
来管理这个文件以后,它能通过truncate
操作清空这个文件,从而实现释放空间的目的。
logrotate
的配置文件地址有两个,第一个主配置文件地址为/etc/logrotate.conf
,其内容如下:
另一个专门用于存放配置文件的地址为/etc/logrotate.d/
,它里面的每一个文件都是一个配置文件,如下图所示:
我们要使用logrotate
来管理 MongoDB,所以就在/etc/logrotate.d/
文件夹中创建一个mongodb
文件(文件名可以任意取),内容如下:
1 | /var/log/mongodb/*.log { |
如下图所示:
这个配置文件的意义如下:
*第一行用于指定 MongoDB 日志文件的地址为/var/log/mongodb/
文件夹下面所有以.log
结尾的文件。
rotate 5
表示保留5份日志文件- copytruncate 表示,日志满足要求以后,先复制一份,然后把原来的日志文件清空
- missingok 表示如果这个文件夹下面为空,也没关系,自动忽略
- compress 表示要把日志进行压缩
- maxsize 200M 表示每个日志最多200MB,达到200MB 以后,就进行 rotate。
- daily 表示每天检查一次
保存这个文件,logrotate
将会每天自动检查 MongoDB 的日志文件,如果发现它大小达到了200MB,那么首先会把这个日志复制出来一份(此时将会占用400MB 空间),然后把原来的日子文件内容清空(此时恢复200MB 空间占用)。被复制出来的日志文件会被压缩,并存放在当前文件夹中。当日志数量达到5个的时候,第六个日志文件生成,最开始压缩的那个文件被删除。从而保证 MongoDB 的日志及其备份总共占用空间不超过1GB。
logrotate
非常强大,还有非常多的配置参数用于实现各种日志管理的操作,大家可以执行命令man logrotate
查看它的帮助文档。