使用 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
2
3
4
5
6
7
8
/var/log/mongodb/*.log {
rotate 5
copytruncate
missingok
compress
maxsize 200M
daily
}

如下图所示:

这个配置文件的意义如下:

*第一行用于指定 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查看它的帮助文档。