Tomcat8.5.24日志自动清理(maxDays)功能探究

前言

 测试人员反馈tomcat目录下的日志占用空间很大,需要自动清理。接到这个反馈时,想象着应该是一个很简单的功能,tomcat应该已经实现了日志的自动清理功能。于是乎,我先到网上查询了如何自动清除tomcat日志,结果发现搜索结果最靠谱的也就是自己写个定时清理脚本,放入系统启动计划中。卧槽,不是吧,这功能还得自己单独处理!不应该吧!为了解答自己的疑惑,我毅然访问了tomcat官网,凭借着4级英语的水准,畅游其中,找寻答案。

 果不其然,解决方案被我找到了。那就是设置日志处理handler的maxDays属性!该方案出现在tomcat-8.5文档介绍中,接下来就开始探索之旅。

 Tomcat8.5.24日志自动清理(maxDays)功能探究

一、版本的问题

    1.1、一开始以为Tomcat8.5.×的版本都可以,庆幸自己使用的版本是Tomcat8.5.6。于是打开conf / logging.properties,为handler添加了maxDays属性。但是一测试发现不行,没办法开始查看源码。

  Tomcat8.5.24日志自动清理(maxDays)功能探究

   1.2、经查询org.apache.juli.AsyncFileHandler类存在于tomcat根目录下的 bin / tomcat-juli.jar 包中,可以通过maven进行jar包下载,分析其源码。我跳跃试的尝试了8.5.6, 8.5.15, 8.5.20,这几个版本都没有发现handler的maxDays属性。最终尝试到8.5.24版本时,发现限制日志保存天数的maxDays属性。

  Tomcat8.5.24日志自动清理(maxDays)功能探究

   1.3、当发现8.5.24版本的tomcat-juli jar包可用后,立马替换到了自己的tomcat中(去掉版本号),重启服务。发现服务启动失败,jar包与当前版本的tomcat不匹配。于是升级tomcat,在官网上下载了tomcat 32-bit/64-bit Windows Service Installer,重新注册服务后,发现自动清理功能生效。

   1.4、需要注意的是,这个清理功能按照配置只对catalina,localhost,manager,host-manager 这4类日志文件有效。对于stderr,stdout这两类日志可以通过Tomcat服务管理工具进行设置,过程很简单,将Logging页签下的 Redirect StdoutRedirect Stderror两项清空后,日志就不再输出了。

  Tomcat8.5.24日志自动清理(maxDays)功能探究

    1.5、此外还有localhost_access_log 这一类日志,如果也不需要的话,可以在conf / server.xml 文件中,将Host/Value 下面的日志输出注释掉。如下图。

  Tomcat8.5.24日志自动清理(maxDays)功能探究

二、日志自动清理(maxDays)实现原理解析

  2.1、AsyncFileHandler为指定的一类日志提供处理方案,继承自FileHandler类。FileHandler类中声明有一个maxDays属性,即文件保留天数。默认值是-1,即不执行任何清理操作。

  Tomcat8.5.24日志自动清理(maxDays)功能探究

   Tomcat8.5.24日志自动清理(maxDays)功能探究 

  2.2、FileHandler内部启动了一个过期日志文件清理线程,根据设置的maxDays值进行清理。线程启动源码截图如下,具体线程的实现有兴趣的朋友可以自行看看源码。

    Tomcat8.5.24日志自动清理(maxDays)功能探究   

     Tomcat8.5.24日志自动清理(maxDays)功能探究

       至此关于tomcat自行清理过期的日志文件功能就简单介绍完了,如果没有用过,可以尝试一下!tomcat版本建议使用8.5.24以上,功能上差强人意,又比自己去写清理脚本的方案好些。鉴于网上关于这块功能的文章较少,希望这篇博文能对你有所帮助。