扩展Log4j支持日志文件根据时间分割文件和过期文件自动删除功能

为了实现我们的需求,我们先看一下原始的Log4j 是如何实现日志文件的管理的。

RollingFileAppender

  • 在log4j中Appender 负责将日志写入日志文件中,实际生产环境中服务长期运行,日志文件会非常多,所以我们一般使用RollingFileAppender 来将日志根据规则进行切割,写入不同的日志文件中。

  • 在log4j内置的类是 org.apache.log4j.RollingFileAppender,这个类默认功能比较单一,通过参数 maxBackupIndex 配置Rolling File的个数,maxFileSize 配置每个日志文件的大小,然后滚动输出日志。

  • log4j:apache-log4j-extras:1.2.17 这个扩展包中,又重新扩展了一个新的类org.apache.log4j.rolling.RollingFileAppender。这个RollingFileAppender 可以根据检查文件大小或者打印日志的时间不同参数进行Rolling File,但是这个这个Appender 丢失了删除日志文件的功能(完全没有maxBackupIndex 参数了…)。

TriggeringPolicy

  • org.apache.log4j.rolling.RollingFileAppenderTriggeringPolicy 来表示进行Rolling Log File的策略。官方提供了两种 org.apache.log4j.rolling.SizeBasedTriggeringPolicyorg.apache.log4j.rolling.TimeBasedRollingPolicy 两种策略实现,用户也可以根据自己的需求扩展新的Policy。

TriggeringPolicy.isTriggeringEvent()

  • TriggeringPolicy.isTriggeringEvent() 方法判断为true时,进行Rolling File操作;
  • o.g.l.r.SizeBasedTriggeringPolicy 中的 isTriggeringEvent() 的判断条件是日志文件大小大于 maxFileSize。
  • o.g.l.r.TimeBasedRollingPolicy 中的 isTriggeringEvent() 是根据系统时间和FileNamePattern 参数来计算Rolling File的文件名,当Rolling File的文件名发生变化,进行Rolling File操作;

rollover

  • TriggeringPolicyisTriggeringEvent()方法返回True后,o.a.l.rolling.RollingFileAppender 开始执行 rollover() 方法
  • rollover() 方法先等待上一次的rollover正常执行结束
  • 通过policy 的rollingPolicy.rollover(getFile()) 方法,返回 RolloverDescription对象,表示Rolling File的一系列动作。
  • 同步执行RolloverDescription 中的 Synchronous Action操作(例如重明命名文件)并等待成功。
  • 启动异步线程,执行RolloverDescription 中的 Asynchronous Action操作(例如压缩日志文件等)。
  • Action的概念可以是一个单独的任务操作,也可以是一组任务操作(CompositeAction

总结

对于Long Running的Java进程,我们不仅仅需要进行Rolling File的操作,还需要对历史Log File进行清理。所以我参考了 TimeBasedRollingPolicy 代码,实现了ExtendedTimeBasedRollingPolicy类。原来的类中,asynchronous 就是单独的 compressAction 负责对日志文件进行压缩(满足条件时),我们将这个对象换成 CompositeAction,再加入我们想要的负责清理文件的 PurgeExpiredLogsAction 即可。在 PurgeExpiredLogsAction 中,我们可以灵活的根据日志的文件名,日志的文件的个数,文件的大小等条件,进行历史日志文件的删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值