欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

logrotate切割Tomcat日志catalina.out

程序员文章站 2024-02-28 20:22:28
...

背景

需要Flume采集Tomcat的日志catalina.out,就需要按天切分日志,过程中遇到一些坑,记录一下,供遇到相同问题的同学参考。

环境

CentOS 6.5(非root权限)、Tomcat 6.0.35、logrotate 3.15.1(由于后面提到的特殊需求,后来自己安装的logrotate版本,没有使用系统集成的版本)

方案

前期考虑过的几种方案:

  1. logrotate、cronolog 等日志切分工具
  2. 改造Tomcat的日志框架为可支持时间切分的log4j等
  3. 自己写脚本重启Tomcat、备份日志,cron定时执行

最终基于以下优势决定使用logrotate:

  1. CentOS自带的工具,不需要额外安装、配置环境(不需要高版本功能的话)
  2. 对Tomcat本身脚本无侵入,不需要重启

实现

用到的路径

  • 系统继承的logrotate(最终没有使用):/usr/sbin/logrotate
  • 自己安装的logrotate:/home/hadoop/bin/logrotate
  • Tomcat路径:/home/hadoop/apache-tomcat-6.0.35
  • logrotate配置文件路径:/home/hadoop/apache-tomcat-6.0.35/tomcat-log-cut

logrotate配置文件:tomcat-log-cut

/home/hadoop/apache-tomcat-6.0.35/logs/catalina.out {
    rotate 7
    dateext
    dateyesterday # 这个参数高版本的logrotate才支持
    dateformat .%Y%m%d
    notifempty
    missingok
    copytruncate
}

测试方法

logrotate的-d参数用于调试,不会真正执行文件切分

/home/hadoop/bin/logrotate -s /tmp/logrotate.status -d -f /home/hadoop/apache-tomcat-6.0.35/tomcat-log-cut

logrotate的-v参数用于真正执行文件切分同时打印详细日志

/home/hadoop/bin/logrotate -s /tmp/logrotate.status -v -f /home/hadoop/apache-tomcat-6.0.35/tomcat-log-cut

cron配置

# Tomcat catalina.out logrotate
0 0 * * * /home/hadoop/bin/logrotate -s /tmp/logrotate.status -f /home/hadoop/apache-tomcat-6.0.35/tomcat-log-cut

遇到的几个坑

root权限

logrotate默认使用/var/lib/logrotate.status记录状态,需要root权限,可使用-s /xxx/logrotate.status参数来指定其他有权限的文件记录状态

每日执行时间

之前在logrotate配置文件中配了daily参数,并且把配置文件放到了/etc/logrotate.d/下面(需要root权限),但由于logrotate的daily/weekly/monthly使用anacron来执行的,每天执行时间是凌晨3点左右,不想改anacron的配置了,于是就没有再把配置文件托管到/etc/logrotate.d/下,而是放到自定义的目录下手动配置cron来执行,可以精确指定到每天的00:00执行

时间后缀

由于Flume收集文件会根据文件创建时间做HDFS的分片,所以需要每天00:00分执行,而不是23:59,而这样带来的问题是,时间后缀为当天的日期,但其实归档的日志是前一天的,查了下高版本的logrotate是支持配置文件里写dateyesterday参数的,使用前一天的日期做文件后缀,附logrotate github地址:https://github.com/logrotate/logrotate

归档文件重名

由于测试时手动执行生成过日期后缀的日志归档文件,再次执行时会因为文件重名而失败,需要注意将测试的归档文件删掉或移走,不然可能会影响cron定时调起的执行结果,错误信息类似:error: destination /home/hadoop/apache-tomcat-6.0.35/logs/catalina.out.20200217 already exists, skipping rotation