configratation对象java_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 的功能

可基于时间间隔或文件心寸来滚动日志文件

能同时指定间隔时间与文件最大小尺寸,那么两者中任意一个条件到达了都会进行日志滚动

可以指定最多保留日志归档文件数目

归档文件可以指文件名格式,如 /var/log/errorlog.%Y-%m-%d

能够在发生日志滚动产生新文件后执行一条命令

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

应用举例

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

public class Test {

public static void main(String[] args) {

while(true) {

System.out.println("Hello World!");

}

}

}

1

2

3

4

5

6

7

publicclassTest{

publicstaticvoidmain(String[]args){

while(true){

System.out.println("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 字样都从文件名中移除了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值