一、概述
在Unix上运行Tomcat时,控制台输出(console output)一般被重定向到catalina.out。所有写入到System.err/out的内容都将被写入这个文件。包括:
- java.lang.ThreadGroup.uncaughtException(..)打印的未捕获异常
- 线程转储(如果是通过system信号触发的)
在Context里面设置swallowOutput属性,可以将老应用里面的直接调用System.out/err时的输出重定向到日志系统。但是该属性尤其限制:它只适用于直接调用System.out/err时,并且只在请求处理阶段。
默认catalina.out不会rotate,如果catalina.out大小超过2GB,则tomcat会挂掉,无法启动,并且不显示任何异常。要避免这种情况,需要经常rotate catalina.out。
本文介绍两种方法来按天或者按大小来rotate。
二、方法1:基于/usr/sbin/logrotate实现 按天或者当size大于2M时,自动rotate
需要管理员权限。
1. 操作步骤
1.1 创建如下文件
/etc/logrotate.d/tomcat
1.2 在上面文件中写入如下内容:
/home/ops/gongdaoshun/tomcat7-fms-ni/logs/catalina.out {
copytruncate
daily
rotate 7
compress
missingok
size 2M
}
2. 配置文件的效果
daily: 每天rotate
rotate 7: 至多保留7个日志文件
compress: 压缩rotate后的文件
size 2M: 当日志大于2M时rotate
3. 工作原理
每晚cron守护进程会运行罗列在/etc/cron.daily/目录下的任务;
这会触发/etc/cron.daily/logratate文件,此文件一般在安装linux时被放入,它会执行命令: “/usr/sbin/logrotate /etc/logrotate.conf“;
/etc/logrotate.conf包含了/etc/logrotate.d/下的所有脚本;
最终触发/etc/logrotate.d/tomcat
4. 手动触发日志rotate
执行/usr/sbin/logrotate /etc/logrotate.conf即可。
5. 设置crontab
如果不想每天晚上才去check,而想每隔一段时间就去check以下,则可以设置crontab。
例如如下设置,使得linux没隔一个小时去查看日志带下,并在必要时rotate。
* */1 * * * /usr/sbin/logrotate /etc/logrotate.conf
注意,设置crontab的用户要具有执行logrotate的权限。
三、方法2:将tomcat的日志有java log切换成Log4j,实现按天rotate
切换操作指南:
http://tomcat.apache.org/tomcat-7.0-doc/logging.html#Using Log4j
参考链接:
https://dzone.com/articles/how-rotate-tomcat-catalinaout
http://tomcat.apache.org/tomcat-7.0-doc/logging.html
https://wiki.apache.org/tomcat/FAQ/Logging#Q10