一、使用logrotate实现Tomcat日志自动轮转与清理
logrotate是Debian系统自带的日志管理工具,可自动完成日志轮转、压缩、删除等操作,是处理Tomcat日志的推荐方式。
创建logrotate配置文件:在/etc/logrotate.d/
目录下新建tomcat
文件,内容如下(根据实际路径调整):
/var/log/tomcat/*.log {
daily # 每天轮转一次
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(如catalina.out.1.gz)
delaycompress # 延迟压缩(当前日志不压缩,下次轮转时再压缩)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 tomcat tomcat # 创建新日志文件的权限和所有者(需替换为实际Tomcat用户)
sharedscripts # 所有日志处理完再执行脚本
postrotate # 轮转后执行的命令(可选)
/bin/kill -HUP `cat /var/run/tomcat.pid 2>/dev/null` 2>/dev/null || true
endscript
}
参数说明:daily
指定轮转频率,rotate
控制保留数量,compress
开启压缩,postrotate
用于重启Tomcat以释放日志句柄(避免日志写入中断)。
测试与手动触发:
sudo logrotate -d /etc/logrotate.d/tomcat
(模拟运行,显示将要执行的操作)。sudo logrotate -f /etc/logrotate.d/tomcat
(忽略频率限制,立即处理日志)。二、编写Shell脚本自动化清理旧日志
若需更灵活的清理逻辑(如按大小、自定义路径),可通过Shell脚本实现,配合crontab定时执行。
创建清理脚本:例如/usr/local/bin/clean_tomcat_logs.sh
,内容如下:
#!/bin/bash
LOG_PATH="/var/log/tomcat" # 替换为实际Tomcat日志路径
find "$LOG_PATH" -type f -name "catalina.*.log" -mtime +30 -exec rm -f {} \; # 删除30天前的catalina日志
find "$LOG_PATH" -type f -name "localhost.*.log" -mtime +30 -exec rm -f {} \; # 删除30天前的localhost日志
find "$LOG_PATH" -type f -name "localhost_access_log.*.txt" -mtime +30 -exec rm -f {} \; # 删除30天前的访问日志
脚本说明:find
命令通过-mtime +30
筛选30天前的文件,-exec rm -f {} \;
删除匹配的文件。
赋予执行权限:sudo chmod +x /usr/local/bin/clean_tomcat_logs.sh
。
设置定时任务:通过crontab添加每日执行计划,编辑crontab -e
,添加以下行(每天凌晨2点执行):
0 2 * * * /usr/local/bin/clean_tomcat_logs.sh >> /var/log/tomcat_clean.log 2>&1
说明:>> /var/log/tomcat_clean.log
将脚本输出追加到日志文件,便于排查问题。
三、调整Tomcat日志配置(可选增强措施)
通过修改Tomcat的logging.properties
文件,可实现日志按大小或数量自动分割,减少单一日志文件的大小。
修改配置文件:编辑/path/to/tomcat/conf/logging.properties
,找到java.util.logging.FileHandler
相关配置,修改如下:
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.pattern = ${catalina.base}/logs/catalina.%g.log # 日志文件命名模式(%g为序号)
java.util.logging.FileHandler.limit = 10485760 # 单个日志文件最大10MB(10*1024*1024字节)
java.util.logging.FileHandler.count = 5 # 保留5个备份文件
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
说明:limit
控制单个文件大小,count
控制保留数量,超过限制时会自动创建新文件(如catalina.1.log
、catalina.2.log
)。
重启Tomcat生效:sudo systemctl restart tomcat
(或使用startup.sh
/shutdown.sh
脚本)。
四、高级自动化分析(可选)
若需对日志进行深度分析(如错误统计、趋势可视化),可结合ELK Stack(Elasticsearch+Logstash+Kibana)或简单脚本实现。
简单错误统计脚本:创建/usr/local/bin/analyze_tomcat_logs.sh
,内容如下:
#!/bin/bash
LOG_FILE="/var/log/tomcat/catalina.out"
EMAIL="admin@example.com" # 替换为实际邮箱
ERROR_COUNT=$(grep -i "ERROR" "$LOG_FILE" | wc -l) # 统计ERROR数量
if [ "$ERROR_COUNT" -gt 0 ]; then
echo "Tomcat日志中发现${ERROR_COUNT}个ERROR" | mail -s "Tomcat日志告警" "$EMAIL"
fi
赋予执行权限:sudo chmod +x /usr/local/bin/analyze_tomcat_logs.sh
。
设置定时分析任务:编辑crontab,每天凌晨3点执行分析脚本:
0 3 * * * /usr/local/bin/analyze_tomcat_logs.sh
ELK Stack集成(复杂场景):
sudo apt install elasticsearch logstash kibana
。/etc/logstash/conf.d/tomcat.conf
,添加以下内容:input {
file {
path => "/var/log/tomcat/*.log"
start_position => "beginning"
}
}
filter {
grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{JAVACLASS:class} - %{GREEDYDATA:logmessage}" } }
}
output {
elasticsearch { hosts => ["localhost:9200"] index => "tomcat-logs-%{+YYYY.MM.dd}" }
}
sudo systemctl start elasticsearch logstash kibana
,通过Kibana可视化分析日志。