通过 Ubuntu Tomcat 日志提升系统稳定性的实操方案
一 日志体系与定位
- 日志集中位置:Tomcat 日志默认在 $CATALINA_HOME/logs,常见文件与作用如下:
- catalina.out:标准输出与错误,包含启动/停止与未捕获异常。
- localhost..log:与本地主机相关的事件与应用日志。
- localhost_access_log..txt:访问日志,用于分析请求量与慢请求。
- 管理应用:manager..log、host-manager..log。
- 快速定位与排查命令:
- 实时查看:
tail -f $CATALINA_HOME/logs/catalina.out
- 关键字检索:
grep -i "error\|exception\|failed" $CATALINA_HOME/logs/catalina.out
- 访问日志分析慢请求:
awk '$NF > 3 {print $0}' $CATALINA_HOME/logs/localhost_access_log.* | sort -kNF | tail
- 进程与端口:
ps aux | grep tomcat、ss -ltnp | grep 8080
- JVM 线程转储(卡顿时):
jstack <TOMCAT_PID> > threaddump.txt
- 资源监控:
top/htop、vmstat 1 60、iostat -x 1 60
- 建议将日志统一到 /var/log/tomcat/,便于权限与集中管理。
二 日志配置与轮转
- 访问日志 Valve(server.xml):在 conf/server.xml 的 Host 中启用 AccessLogValve,便于分析流量与慢请求。
- 日志级别(conf/logging.properties):生产环境将 java.util.logging 级别调为 WARN/ERROR,仅在排障时临时提升到 INFO/DEBUG,避免日志洪泛影响性能与磁盘。
- 日志轮转与压缩(logrotate):创建 /etc/logrotate.d/tomcat
- 按日期分割 catalina.out(可选):使用 cronolog,在 bin/catalina.sh 中把标准输出重定向为
org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina.%Y-%m-%d.out" &
- 精简与归档:按需关闭不必要的访问日志或降低访问日志级别;对历史日志做离线归档与备份。
三 监控告警与可视化
- 实时与趋势分析:
- 命令行:
tail -f、grep、awk、sort | uniq -c 做热点接口、错误码、异常频次统计。
- 资源联动:将日志关键字告警与 CPU/内存/磁盘IO 监控结合,避免单看日志误判。
- 集中化平台:
- 搭建 ELK(Elasticsearch/Logstash/Kibana) 或 Graylog,统一采集 catalina.out、localhost、访问日志,构建错误趋势、Top URL、响应时延分布等可视化面板。
- 告警规则示例:1 分钟内出现 > N 次 ERROR 或 5xx 比例 > X% 触发 PagerDuty/企业微信/钉钉告警。
四 从日志驱动的优化闭环
- 典型问题—日志信号—优化动作(示例)
- 频繁 OutOfMemoryError:catalina.out 出现内存溢出 → 调整 -Xms/-Xmx/-XX:MetaspaceSize,排查内存泄漏(借助堆转储),优化大对象/缓存策略。
- 线程耗尽/响应变慢:访问日志高并发 + catalina.out 线程池满/超时 → 调整 maxThreads/acceptCount,优化慢查询与阻塞调用,增加实例水平扩展。
- 数据库/外部依赖异常:应用日志堆栈指向 SQLException/Timeout → 检查连接池(如 maxActive/timeBetweenEvictionRunsMillis)、慢 SQL、网络与熔断策略。
- 磁盘告警 + catalina.out 无法写入:日志未轮转或磁盘满 → 立即执行 logrotate,清理历史归档,扩容磁盘或迁移日志目录。
- 重启循环:catalina.out 启动即报错 → 校验 server.xml/web.xml 配置、应用依赖与权限,回滚最近变更。
- 例行巡检清单(建议每周/每月):
- 错误率、5xx 比例、P95/P99 时延趋势;Top 错误类型与 Top URL。
- GC 暂停与 Full GC 次数(结合 GC 日志);线程池使用率与队列积压。
- 磁盘空间与日志保留策略合规性;备份可用性与恢复演练。