温馨提示×

Tomcat日志分割如何实现

小樊
53
2025-10-06 19:19:19
栏目: 智能运维

Tomcat日志分割常见实现方法

1. 使用Cronolog工具分割

Cronolog是专为日志分割设计的工具,可按时间将catalina.out拆分为每日或自定义格式的文件,减少单文件体积。

  • 安装Cronolog:通过包管理器(如CentOS的yum)安装,命令为yum install cronolog;或从官网下载源码编译安装(./configure && make && make install)。
  • 修改Tomcat启动脚本:编辑bin/catalina.sh,找到CATALINA_OUT变量设置处(通常有两处),将其值改为带时间格式的路径(如CATALINA_OUT="$CATALINA_BASE/logs/catalina.%Y%m%d.out"),并注释掉touch "$CATALINA_OUT"行(避免重复创建空文件)。
  • 调整日志输出管道:将原脚本中>> "$CATALINA_OUT" 2>&1 &替换为2>&1 | /usr/local/sbin/cronolog "$CATALINA_OUT" >> /dev/null &(路径需与which cronolog结果一致)。
  • 重启Tomcat:执行bin/shutdown.sh && bin/startup.sh使配置生效,日志将按日期分割为catalina.YYYYMMDD.out格式。

2. 使用Logrotate工具(Linux系统)

Logrotate是Linux系统自带的日志管理工具,支持按时间/大小分割、压缩、删除旧日志,无需修改Tomcat代码。

  • 安装Logrotate:通过包管理器安装(如yum install logrotate),系统默认已包含该工具。
  • 创建配置文件:在/etc/logrotate.d/目录下新建tomcat文件,添加以下内容(以分割catalina.out为例):
    /opt/tomcat/logs/catalina.out {
        daily          # 每日分割(可选:weekly/monthly)
        copytruncate   # 复制原日志并清空(适用于正在写入的文件)
        rotate 30      # 保留30份旧日志
        compress       # 用gzip压缩旧日志(如catalina.out-20250930.gz)
        missingok      # 日志不存在时不报错
        notifempty     # 日志为空时不分割
        dateext        # 使用日期作为备份文件后缀(如catalina.out-20250930)
    }
    
  • 测试与强制执行:用logrotate -d /etc/logrotate.d/tomcat测试配置语法(无错误则继续);用logrotate -f /etc/logrotate.d/tomcat强制立即分割(验证是否生效)。

3. 使用Log4j(推荐用于需要精细控制的场景)

Log4j是Java常用日志框架,支持按大小、时间分割日志文件,且能控制日志级别、格式,适用于Tomcat应用日志管理。

  • 添加依赖:将log4j-corelog4j-apitomcat-juli-adapters等JAR包放入Tomcat/lib目录(确保版本兼容,如Log4j 2.x)。
  • 配置Log4j:在conf目录下创建log4j2.xml(或log4j.properties),示例配置(按天分割catalina.log,保留30天):
    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <RollingFile name="RollingFile" fileName="${catalina.base}/logs/catalina.log"
                         filePattern="${catalina.base}/logs/catalina-%d{yyyy-MM-dd}-%i.log.gz">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 按天分割 -->
                    <SizeBasedTriggeringPolicy size="10MB"/> <!-- 单个文件超过10MB时分割 -->
                </Policies>
                <DefaultRolloverStrategy max="30"/> <!-- 保留30份备份 -->
            </RollingFile>
        </Appenders>
        <Loggers>
            <Root level="info">
                <AppenderRef ref="RollingFile"/>
            </Root>
        </Loggers>
    </Configuration>
    
  • 指定配置文件路径:在catalina.sh中添加JVM参数:-Dlog4j.configurationFile=${catalina.base}/conf/log4j2.xml
  • 重启Tomcat:使Log4j加载配置,日志将按规则分割并压缩。

4. 使用Tomcat自身JUL配置(无需额外工具)

Tomcat默认使用java.util.logging(JUL)框架,可通过修改conf/logging.properties文件实现日志自动分割(适用于简单场景)。

  • 修改配置文件:找到handlers行(默认为handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler),新增或修改1catalina.org.apache.juli.FileHandler参数:
    1catalina.org.apache.juli.FileHandler.level = INFO
    1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    1catalina.org.apache.juli.FileHandler.prefix = catalina.
    1catalina.org.apache.juli.FileHandler.maxDays = 730  # 保留2年(730天)
    1catalina.org.apache.juli.FileHandler.maxLength = 10485760  # 单个文件最大10MB(可选)
    1catalina.org.apache.juli.FileHandler.formatter = org.apache.juli.VerbatimFormatter
    
  • 重启Tomcat:配置生效后,日志将按maxDays(时间)或maxLength(大小)自动分割,旧日志会自动删除。

0