优化Ubuntu Tomcat日志记录的方法
日志级别决定了Tomcat记录日志的详细程度,默认的INFO级别会生成大量常规操作日志,增加磁盘占用和查找成本。可根据需求调整为更高级别:
WARNING:仅记录警告及以上级别的日志(如资源不足、配置问题),适合生产环境日常运行;ERROR:仅记录错误级别的日志(如应用崩溃、数据库连接失败),进一步减少日志量;FATAL:仅记录致命错误(如JVM崩溃),适合极端性能敏感场景。conf/logging.properties文件,调整核心日志记录器的级别(如org.apache.catalina.level、org.apache.catalina.startup.level)。修改后需重启Tomcat使配置生效。日志轮转可自动分割、压缩旧日志,避免单个日志文件过大占用磁盘空间。推荐使用系统自带的logrotate工具:
/etc/logrotate.d/tomcat配置文件,添加以下内容(以Tomcat 9为例):/var/log/tomcat9/*.log {
daily # 每天轮转一次
missingok # 日志文件丢失时不报错
rotate 7 # 保留最近7个轮转文件
compress # 压缩旧日志(节省空间)
notifempty # 日志为空时不轮转
create 640 tomcat adm # 新日志文件权限及属主(需根据实际Tomcat用户调整)
sharedscripts # 多个日志文件匹配时只执行一次postrotate
postrotate
if [ -f /var/run/tomcat9.pid ]; then
sudo kill -USR1 `cat /var/run/tomcat9.pid` # 通知Tomcat重新打开日志文件
fi
endscript
}
sudo logrotate -f /etc/logrotate.d/tomcat,检查是否有错误;logrotate默认每天自动运行(可通过/etc/logrotate.conf调整频率)。同步日志记录会阻塞应用线程,直到日志写入磁盘,影响高并发场景下的性能。Tomcat 8及以上版本支持异步日志(AsyncFileHandler):
conf/logging.properties文件,将默认的ConsoleHandler或FileHandler替换为AsyncFileHandler,例如:handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.rotatable = true
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 30
访问日志可记录用户的HTTP请求信息(如IP、URL、响应状态、耗时),用于分析用户行为、排查性能问题。需在conf/server.xml中配置AccessLogValve:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" # 日志目录(相对于Tomcat根目录)
prefix="localhost_access_log" # 日志文件前缀
suffix=".txt" # 日志文件后缀
rotatable="true" # 启用轮转
maxDays="30" # 保留30天
pattern="%h %l %u %t "%r" %s %b" /> # 日志格式(包含IP、用户、时间、请求、状态码、响应大小)
pattern常用变量说明:%h(客户端IP)、%r(请求行,如GET /index.html HTTP/1.1)、%s(响应状态码)、%b(响应大小,单位字节)。某些组件(如启动过程、第三方库)的详细日志可能干扰问题排查,可通过logging.properties限制其日志级别:
org.apache.catalina.startup(启动日志)设置为WARNING,减少启动时的冗余信息:org.apache.catalina.startup.level = WARNING
org.hibernate)的日志级别设置为ERROR,避免过多的SQL调试日志:org.hibernate.level = ERROR
原始日志数据难以直接用于分析,可使用工具进行集中管理和可视化:
grep、awk、tail -f等命令行工具快速查找关键字(如grep "ERROR" /var/log/tomcat9/catalina.out);