7.2 监控与日志管理 本节摘要:观测是调优与排障的前提。本节给出四类核心指标的看板与告警阈值、JMX 远程监控的开通配置、六类日志的分工地图与访问日志的格式设计,最后是日志治理三板斧(轮转、留存、脱敏)。学完你的服务从"黑盒"变成"仪表盘",7.3 与 7.4 的排障动作全部依赖本节建的观测面。 7.1 的每个"观测"动作都需要基础设施支撑:指标从哪来、日志去哪看。本节把这些基建配齐——先指标后日志,先看懂再告警。 四类指标:看什么、 Threshold 设多少 图 7-2:核心指标看板四象限 图 7-2:核心指标看板四象限 四象限的指标全部可以从 Tomcat 自带的 JMX 暴露里取到。开通远程 JMX 是第一步。
本节摘要:观测是调优与排障的前提。本节给出四类核心指标的看板与告警阈值、JMX 远程监控的开通配置、六类日志的分工地图与访问日志的格式设计,最后是日志治理三板斧(轮转、留存、脱敏)。学完你的服务从"黑盒"变成"仪表盘",7.3 与 7.4 的排障动作全部依赖本节建的观测面。
7.1 的每个"观测"动作都需要基础设施支撑:指标从哪来、日志去哪看。本节把这些基建配齐——先指标后日志,先看懂再告警。

四象限的指标全部可以从 Tomcat 自带的 JMX 暴露里取到。开通远程 JMX 是第一步。
# bin 目录 setenv.sh:开通 JMX 远程 强口令与内网限制必配 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=true \ -Dcom.sun.management.jmxremote.port=9010 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=true"
接上可视化工具后能看到一串名称规范的托管对象,常用的几组记下来:连接器一组的请求计数与线程池、应用一组的状态与会话数、数据源一组的活跃与等待。监控平台接 JMX 或直接用其导出器,四象限的仪表盘就齐了。
| 日志 | 回答的问题 | 排障时先看它当 |
|---|---|---|
| catalina 与 stdout | 容器启动与全局异常 | 起不来 |
| localhost | 部署与应用初始化细节 | 部署失败 |
| manager | 管理端操作记录 | 发布事故 |
| access 访问日志 | 每个请求的来龙去脉 | 慢与错 |
| gc 垃圾回收日志 | 内存与停顿节奏 | 怀疑泄漏 |
| localhost 对应的堆栈 | 应用异常完整栈 | 定位代码 |
访问日志的格式值得专门设计——默认格式没有耗时字段,压测与排障都吃亏。改造 pattern 加两个占位符:处理耗时与收到响应的字节数。
<!-- AccessLogValve 增加耗时与字段的格式 --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="access" suffix=".log" pattern="%h %t "%r" %s %b %D %{X-Forwarded-For}i" rotatable="true" maxDays="30"/>
10.8.1.23 [21/Aug/2026:15:22:01] "GET /order/list HTTP/1.1" 200 15230 45 118.92.10.7
一行末尾三个值:状态 200、响应 15K、耗时 45 毫秒,最后是前置代理传来的真实 IP(呼应 1.2 的地址还原)。有耗时列之后,慢请求的筛选一条命令搞定——这是 7.4 性能排查的地基。
日志治理三板斧收尾。轮转:容器日志走 logging.properties 的天数与大小配置,访问日志用 Valve 的 rotatable 与 maxDays;留存:合规要多久留多久,磁盘预算按峰值流量乘天数估;脱敏:访问日志别记录查询串里的手机号令牌,pattern 里少放敏感头,安全与合规一票否决。磁盘被日志写满导致服务假死是经典事故,三板斧缺一不可。
⚠️ 常见坑:日志时间与服务器时间差八小时——JVM 时区参数没配。setenv 里加一条时区设定,与业务库时区保持一致,否则跨系统比对日志时间会是灾难性的折磨。全部日志基建配好后,下一章进入实战排障。
监控平台之外,运维常需要一条命令立刻判断状态。三条命令覆盖三个象限的快速体检。
# 一看线程:忙线程比例 exec 线程总数 jstack $(ps -ef | grep catalina | grep -v grep | awk '{print $2}') \ | grep -c 'catalina-exec'
# 二看内存:当前堆与垃圾回收概况 每秒输出一次共五次 jstat -gcutil $(ps -ef | grep catalina | grep -v grep | awk '{print $2}') 1000 5
S0 S1 E O M YGC YGCT FGC FGCT 0.00 98.44 61.20 35.02 95.10 412 3.880 2 0.310 0.00 98.44 73.85 35.02 95.10 413 3.889 2 0.310
# 三看日志水位:容器日志的轮转策略在 logging.properties 收口 1catalina.org.apache.juli.AsyncFileHandler.maxDays = 30 1catalina.org.apache.juli.AsyncFileHandler.rotatable = true
读数的门道:年轻代使用率(E 列)来回跳动是健康节律,老年代(O 列)缓慢抬升后回落说明回收正常,只升不降连续观察数小时就要怀疑泄漏;两列计数(年轻代回收次数与整堆回收次数)的增长速率突然变化,通常对应流量或代码的变更,配合发布时间线可以定位到版本。这三条命令贴在值守手册首页,紧急时刻不用翻平台。
观测面建好了,下一节实战第一场:服务起不来、应用部署失败,两条决策树走到底。