Linux 下配置滚动日志之 rotatelogs

上一篇 Linux 下配置滚动日志之 logrotate, 介绍了定时服务 logrotate 的方式对日志进行滚动,删除旧归档。logrotate 是目前流行 Linux 发行版内置的定时服务,默认每日根据配置文件来滚动日志文件。那么它可能有一个弊端就是,如果每日增长的日志超大,同时会暴盘,那么就必须调整 logrotate 这个 cron 定时服务为每小时,或自定义的 cron 表达式来控制。

而本文所介绍的 rotatelogs 工具(与 logrotate 名称太过相似) 是采用管道操作的方式来控制日志的滚动,可以基于实时监控的日志文件大小来滚动日志,也可以配置像 logrotate 来定时滚动日志。rotatelogs 是出自于 Apache HTTP Server 家族的,它被用于 Apache HTTP Server 的就错误日志,访问日志的滚动控制。

类似于 rotatelogs 的工具不有一个老旧的 cronolog,也是应用管道操作控制日志,它早已无人问津,最近更新在五年前,且功能很弱,只带滚动,不能清理旧归档,磁盘空间占用仍然是无上限。

rotatelogs 的安装

安装了 Apache 2.4 及以上的版本就已经有了 rotatelogs 命令。在 Dabian 及其衍生版上可以单独安装,命令是

sudo apt-get install apache2-utils

在红帽系列 Linux 上也可以找到像 apache2-utils 的 rpm 包,但是安装它的依赖恐怕很麻烦。

安装好后,用 man rotatelogs 查看帮助手册

rotatelogs 的功能

关于 rotatelogs 的功能,可查看 rotatelogs - Piped logging program to rotate Apache logs, 主要的功能描述如下

  1. 可基于时间间隔或文件心寸来滚动日志文件
  2. 能同时指定间隔时间与文件最大小尺寸,那么两者中任意一个条件到达了都会进行日志滚动
  3. 可以指定最多保留日志归档文件数目
  4. 归档文件可以指文件名格式,如 /var/log/errorlog.%Y-%m-%d
  5. 能够在发生日志滚动产生新文件后执行一条命令

缺陷是日志归档文件不支持压缩,使用了 -n 来达到删除旧日志归档时,不能在文件名中使用模式(%)。

应用举例

假设有一个持续向控制台输出 "Hello World!" 的程序

$ java Test | rotatelogs -n 5 stdout.log 5M

stdout.log 大小达到 5M 后滚动为 stdout.log.1,因为 -n 5 指定最多为五个文件,所以最后的日志文件只有 stdout.log, stdout.log.1, stdout.log.2, stdout.log.3 和 stdout.log.4

$ java Test | rotatelogs -n 5 stdout.log 3600

每一个小时滚动一次日志,最多 5 个文件

$ java Test | rotatelogs  stdout.log.%Y-%m-%d-%H_%M_%S 5M

指定文件名模式生成日志归档,文件尺寸达到 5M 滚动一次,如: stdout.log.2018-06-12-04_43_03,但不产生 stdout.log 文件。但使用了文件名模式后便不能用 -n 指定保留日志文件数目,所以会一直在产生日志归档。必须另加定时任务去清队旧的日志文件

$ java Test | rotatelogs -L stdout.log stdout.log.%Y-%m-%d 86400 20M

当前正在输出的日志文件是  stdout.log,方便 tail -f stdout.log 查看实时日志输出。归档日志文件是 stdout.log.2018-06-12 那样的文件,每日一次日志滚动,或文件名达到上限 20 M 时。如果同一天产生的归档文件名相同则会进行覆盖

$ java Test | rotatelogs stdout.log 5M

文件大小 5M 时滚动,文件名是 stdout.out.1528779417, stdout.out.1528779420, ...。没有 stdout.log 文件,并且文件数目不限制

$ java Test | rotatelogs -t stdout.log 5M

日志不滚动,只会生成 stdout.log 一个文件,日志满了就清掉从来。

$ java Test | rotatelogs -L stdout.log stdout.log 5M

这条命令产生的日志输出很奇怪,如下的文件

stdout.1528780849
stdout.1528780854
stdout.1528780859
stdout.log
stdout.log.1528780850
stdout.log.1528780856

两套文件名,不知道 stdout.1528780849 这样的文件名从何而来,连 log 字样都从文件名中移除了。

类别: Linux/Unix. 标签: . 阅读(70). 订阅评论. TrackBack.

Leave a Reply

avatar