Ubuntu Tomcat日志中的异常处理方法
一 定位与查看日志
tail -f $CATALINA_HOME/logs/catalina.outgrep -i 'ERROR\|SEVERE' $CATALINA_HOME/logs/catalina.outsed -n '/2025-12-04 10:00:*/,/2025-12-04 11:00:*/p' $CATALINA_HOME/logs/catalina.outgrep -ic 'ERROR' $CATALINA_HOME/logs/catalina.outgrep ' 500 ' /var/log/tomcat*/localhost_access_log.*.txt二 异常捕获与日志级别
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINEorg.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = java.util.logging.ConsoleHandlerjava.util.logging.ConsoleHandler.encoding=UTF-8;同时在server.xml的Connector上设置URIEncoding="UTF-8",避免中文与异常信息乱码。三 常见异常与处理对照表
| 现象/日志关键词 | 可能原因 | 快速处置 |
|---|---|---|
| 端口占用(如8080) | 其他进程占用端口 | sudo lsof -i :8080 或 `netstat -tulpen |
| ClassNotFoundException / NoClassDefFoundError | 依赖 JAR 缺失或版本冲突 | 将缺失 JAR 放入WEB-INF/lib或**$CATALINA_HOME/lib**;清理工作目录后重部署 |
| OutOfMemoryError | 堆/元空间不足 | 在catalina.sh中增大堆:-Xms512m -Xmx2048m;必要时增加元空间或分析内存泄漏 |
| HTTP 404 | 资源不存在或应用未部署成功 | 检查应用是否部署、上下文路径是否正确、静态资源是否在正确目录 |
| HTTP 500 | 应用代码异常/配置错误 | 查看catalina.out与localhost.[日期].log的堆栈,定位到具体类与方法后修复 |
| 启动失败(LifecycleException 等) | 配置错误(如server.xml)、端口冲突、权限不足 | 回滚最近变更,核对server.xml语法与端口,检查logs/catalina.[日期].log首屏报错 |
| 日志乱码 | 编码不一致 | 设置URIEncoding="UTF-8"与ConsoleHandler.encoding=UTF-8 |
| 访问日志无记录 | AccessLogValve 未启用或路径错误 | 在server.xml中启用并核对directory/prefix |
| 以上对照覆盖了 Ubuntu 上 Tomcat 最常见的问题类型与处置方向,可结合日志关键字快速定位并解决。 |
四 日志轮转与清理
/opt/tomcat/logs/catalina.out { daily rotate 7 compress missingok notifempty copytruncate }rm -f $CATALINA_HOME/logs/*而不通知应用;优先使用copytruncate或先停写再清理。五 一键排查脚本示例
#!/usr/bin/env bash
export CATALINA_HOME=${CATALINA_HOME:-/opt/tomcat9}
LOG_DIR="$CATALINA_HOME/logs"
echo "=== 最近100行 catalina.out ==="
tail -n 100 "$LOG_DIR/catalina.out"
echo -e "\n=== 今日 ERROR/SEVERE 计数 ==="
grep -Ei 'ERROR|SEVERE' "$LOG_DIR/catalina.out" | grep "$(date +%Y-%m-%d)" | wc -l
echo -e "\n=== 占用 8080 端口的进程 ==="
ss -lntp | grep ':8080' || echo "端口 8080 未被占用"
echo -e "\n=== 最近一次启动失败线索 ==="
grep -n "LifecycleException\|Caused by" "$LOG_DIR/catalina.[0-9]*.log" | tail -5
echo -e "\n=== 访问日志中 5xx 统计 ==="
zgrep -E ' 5[0-9]{2} ' "$LOG_DIR/localhost_access_log."*.txt 2>/dev/null | wc -l
将脚本保存为**/usr/local/bin/tomcat-debug.sh**,执行bash /usr/local/bin/tomcat-debug.sh即可快速获取异常排查线索。