ubuntu

Ubuntu Tomcat日志清理的最佳实践是什么

小樊
36
2025-10-22 08:47:21
栏目: 智能运维

使用Logrotate实现自动化日志轮转与压缩
Logrotate是Ubuntu系统自带的日志管理工具,可自动处理Tomcat日志的轮转、压缩、删除及权限维护,避免手动操作的繁琐与风险。需创建或编辑/etc/logrotate.d/tomcat配置文件,针对Tomcat主要日志文件(如catalina.out、访问日志)设置参数:

/var/log/tomcat/catalina.out {
    daily                # 每天轮转一次(可根据磁盘空间调整,如weekly/monthly)
    rotate 7             # 保留最近7天的日志文件
    compress             # 使用gzip压缩旧日志(节省空间)
    missingok            # 若日志文件不存在,不报错继续执行
    notifempty           # 若日志文件为空,不进行轮转
    copytruncate         # 先复制原日志内容,再清空原文件(避免重启Tomcat)
    create 640 tomcat tomcat  # 创建新日志文件,权限640,所有者为tomcat用户(需提前创建)
    sharedscripts        # 所有日志轮转完成后统一执行postrotate脚本
    postrotate
        /bin/kill -USR1 $(cat /var/run/tomcat.pid) 2>/dev/null || true  # 向Tomcat进程发送USR1信号,使其重新打开日志文件(避免日志丢失)
    endscript
}

配置完成后,Logrotate会随系统cron任务(通常每日执行)自动运行。可通过logrotate -d /etc/logrotate.d/tomcat测试配置语法,或logrotate -f /etc/logrotate.d/tomcat强制立即执行。

配置Tomcat内置日志轮转(可选补充)
若不想依赖外部工具,可通过修改Tomcat的conf/logging.properties文件,使用java.util.logging.FileHandler实现日志轮转。关键配置项如下:

# 控制台日志轮转(可选)
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# 文件日志轮转(针对特定日志,如catalina)
handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
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.limit = 10485760  # 单个日志文件最大10MB(10*1024*1024字节)
1catalina.org.apache.juli.FileHandler.count = 5       # 保留5个备份文件
1catalina.org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter

修改后需重启Tomcat使配置生效。此方法适合需要更细粒度控制的场景,但灵活性不如Logrotate。

定期清理过期日志脚本(辅助手段)
对于无法通过轮转工具覆盖的日志(如localhost_access_log.*.txtmanager.log),可编写Shell脚本定期删除过期文件(如7天以上)。示例脚本:

#!/bin/bash
LOG_PATH="/var/log/tomcat"  # Tomcat日志目录(根据实际路径修改)
find "$LOG_PATH" -name "catalina.*.log" -mtime +7 -exec rm -f {} \;  # 删除7天前的catalina日志
find "$LOG_PATH" -name "localhost_access_log.*.txt" -mtime +7 -exec rm -f {} \;  # 删除7天前的访问日志
find "$LOG_PATH" -name "manager.*.log" -mtime +7 -exec rm -f {} \;    # 删除7天前的manager日志
find "$LOG_PATH" -name "*.gz" -mtime +30 -exec rm -f {} \;           # 删除30天前的压缩日志
echo "$(date '+%Y-%m-%d %H:%M:%S') - Logs cleanup completed." >> "$LOG_PATH/cleanup.log"  # 记录清理操作

赋予脚本执行权限(chmod +x /path/to/clear_tomcat_logs.sh),并通过crontab -e设置定时任务(如每日23:59执行):

59 23 * * * /path/to/clear_tomcat_logs.sh

此方法作为补充,可清理Logrotate未覆盖的特殊日志。

调整日志级别减少不必要的输出
过高的日志级别(如FINEFINER)会产生大量无用日志,增加磁盘占用。可通过修改conf/logging.properties文件调整日志级别,推荐设置为INFOWARNING

# 全局日志级别(默认为INFO)
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = java.util.logging.ConsoleHandler

# 控制台处理器级别(与全局一致)
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

调整后重启Tomcat,可减少不必要的日志输出。

注意事项

0
看了该问题的人还看了