背景

随着 Tomcat 长时间的运行,在其 logs 下面会产生大量的日志文件,但是 Tomcat 本身并未提供日志清理的功能,在一定时间后会占用一定的系统资源,而且该目录下的日志文件并不是十分重要,所以需要一种机制在一定的时机对日志文件进行管理。

方案

脚本 + 定时任务

1
2
3
4
5
#!/bin/bash

echo " " > /data/tomcat/logs/catalina.out
find /the/path/of/logs/ -type f -name "*.log" -mtime +7 -delete
find /the/path/of/logs/ -type f -name "localhost_*.txt" -mtime +7 -delete

以上是一个简单的 shell 命令,删除7天前的日志文件,将其保存到 clean_tomcat_log.sh,执行 crontab -e 编辑添加该脚本到定时任务。

logrotate

Logrotate 是 Linux 自带的一个命令工具,一般的服务器都默认安装有。通过简单的配置就可以实现上述脚本的功能,而且还能够保存分割日志。
在 /etc/logrotate.d/ 目录下添加 tomcat-logs 配置文件,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/the/path/of/logs/*.log /the/path/of/logs/*.txt {
hourly --每天执行,可供选择的有weekly,monthly,yearly
  rotate 0 --不会保留分割的文件,会立即删除
  missingok --如果有错误也继续
  notifempty --为空则不进行分割
  copytruncate --分割时复制原日志内容到新的备份文件中,保持原日志文件继续滚动,由于复制会有一定的时间差,可能会造成部分日志丢失
  prerotate
   find /the/path/of/logs/ -type f -mtime +30 -print -delete; --删除30天前文件内容有改动的文件
  endscript
  postrotate
    find /the/path/of/logs/ -type f -name "*.1" -print -delete; --删除备份的日志文件
  endscript
}

以上配置可以简单的实现如何管理日志文件,logrotate 还有其他参数,以上只是一个简单的例子。

tomcat-slf4j-logback

该方案通过 Tomcat 结合 logback 可以对 logs 下的日志文件进行管理,这里也推荐使用此方案。

  1. 首先从官网 [1] 下载 Tomcat 对应版本的文件;
  2. 将下载的文件替换到 Tomcat 对应目录下,如果没有其他特殊需求,这样就可以发布项目启动Tomcat了;
    复制 bin/tomcat-juli.jar 到 $CATALINA_HOME/bin 替换已有的 tomcat-juli.jar
    复制 bin/setenv.sh 或者 bin\setenv.bat 到 $CATALINA_HOME/bin 替换已有的 setenv.sh/setenv.bat 脚本(如果 setenv.sh/setenv.bat 脚本有其他自定义参数的设置则只能在源文件基础上进行修改)
    复制 conf/logback.xml 到 $CATALINA_HOME/conf
    复制 conf/logback-access.xml 到 $CATALINA_HOME/conf(之前老一点的版本是logback-access-localhost.xml)
    复制 conf/server.xml 到 $CATALINA_HOME/conf(如果 server.xml 文件有其他内容修改,则需要在源文件上进行修改)
    复制 lib/logback-core-1.1.8.jar,lib/logback-access-1.1.8.jar 到 $CATALINA_HOME/lib(如果发布项目也使用了 logback 需要注意统一版本号,以免造成冲突等问题)
  3. 删除 $CATALINA_HOME/conf/logging.properties 文件。以完全关闭 java.util.logging。
  4. 如果需要手动修改 server.xml 则需要按照以下步骤进行修改:
    如果需要添加自定义的配置 logback-access-localhost.xml 则要添加如下内容:
    1
    <Valve className="ch.qos.logback.access.tomcat.LogbackValve" quiet="true" filename="${catalina.home}/conf/logback-access-localhost.xml" />
    PS:如果使用 1.1.7 以上版本的 logback,${catalina.home} 可以去掉
    如果使用默认的 logback-access.xml 配置文件则添加如下内容:
    1
    <Valve className="ch.qos.logback.access.tomcat.LogbackValve" quiet="true" />
    删除以下内容:
    1
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

至此整个配置过程就结束了,接下来就发布项目,启动 Tomcat 进行测试了。其他一些日志的管理只需要修改 conf/ 下的 logback 配置文件即可。

参考文档

[1] tomcat-slf4j-logback