1. 使用logrotate实现自动化日志轮转与管理
logrotate是Linux系统原生工具,可自动处理Tomcat日志的轮转、压缩、删除及邮件通知,避免日志文件过大占用磁盘空间。配置步骤如下:
sudo apt-get install logrotate,CentOS使用sudo yum install logrotate)。/etc/logrotate.d/目录下新建tomcat文件,添加以下内容(根据实际路径调整):/usr/local/tomcat/logs/catalina.out {
daily # 每天轮转一次
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(当前日志下次轮转时再压缩)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
copytruncate # 复制原日志后截断,避免重启Tomcat
}
sudo logrotate -d /etc/logrotate.d/tomcat测试配置语法;无误后用sudo logrotate -f /etc/logrotate.d/tomcat强制执行。logrotate会随系统cron定时任务(默认每天运行)自动执行。2. 调整Tomcat原生日志级别,减少不必要的输出
Tomcat默认使用java.util.logging框架,日志级别INFO会记录大量常规信息,可调整为WARNING或ERROR以过滤无关日志。操作步骤:
conf/logging.properties文件,找到以下配置项并修改:org.apache.catalina.level = WARNING # 控制Tomcat核心日志级别
org.apache.coyote.level = WARNING # 控制HTTP连接器日志
org.apache.jasper.level = WARNING # 控制JSP引擎日志
3. 切换至Log4j/Logback等成熟日志框架
Tomcat原生日志功能有限,切换至Log4j或Logback可获得更灵活的日志管理(如按日期/大小滚动、多appender支持、异步日志等)。以Log4j 2为例:
log4j-core-2.x.jar、log4j-api-2.x.jar放入Tomcat/lib目录。conf目录下新建log4j2.xml,配置滚动策略(如按天分割、压缩):<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="${catalina.base}/logs/app.log"
filePattern="${catalina.base}/logs/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 按天滚动 -->
<SizeBasedTriggeringPolicy size="10MB"/> <!-- 超过10MB滚动 -->
</Policies>
<DefaultRolloverStrategy max="20"/> <!-- 最多保留20个日志文件 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
bin/catalina.sh中添加-Dlog4j.configurationFile=${catalina.base}/conf/log4j2.xml,重启Tomcat生效。4. 配置Tomcat访问日志轮转
Tomcat访问日志(记录客户端请求信息)默认存储在logs目录下(如localhost_access_log.*.txt),需启用轮转以避免文件过大。操作步骤:
conf/server.xml文件,找到AccessLogValve配置项,添加rotatable="true"(启用轮转)和maxDays(保留天数)属性:<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
rotatable="true"
maxDays="30"
pattern="%h %l %u %t "%r" %s %b" />
maxDays设置自动删除旧文件。5. 编写Shell脚本定期清理旧日志
若不想使用logrotate,可通过Shell脚本定期删除旧日志。示例如下:
clear_tomcat_logs.sh,内容如下:#!/bin/bash
LOG_DIR="/usr/local/tomcat/logs"
KEEP_DAYS=30
find "$LOG_DIR" -type f -name "*.log" -mtime +$KEEP_DAYS -exec rm -rf {} \;
find "$LOG_DIR" -type f -name "*.out" -mtime +$KEEP_DAYS -exec rm -rf {} \;
find "$LOG_DIR" -type f -name "*.txt" -mtime +$KEEP_DAYS -exec rm -rf {} \;
echo "$(date '+%F %T') - 清理完成,删除$KEEP_DAYS天前的日志文件" >> "$LOG_DIR/cleanup.log"
chmod +x clear_tomcat_logs.sh。crontab -e添加0 0 * * * /path/to/clear_tomcat_logs.sh,表示每天凌晨0点执行。6. 限制特定组件的日志输出
若某些组件(如第三方库、特定应用)产生过多日志,可在conf/logging.properties中为其设置更高日志级别(如WARNING或SEVERE),减少不必要的日志输出。示例如下:
com.example.thirdparty.level = WARNING # 限制com.example.thirdparty包的日志级别
org.apache.tomcat.jdbc.pool.level = WARNING # 限制数据库连接池日志
此方法可针对性减少特定组件的日志量,不影响其他组件的日志记录。