在负载均衡(如 LVS/Nginx 转发)模式下查看两台 Tomcat 的动态日志,核心是「实时跟踪每台 Tomcat 的日志文件」,并可通过「日志关键词过滤」「多终端聚合」等方式定位请求走向。以下是分场景的实操方案,覆盖基础实时查看、聚合分析、精准定位请求等需求:
一、基础方案:单台 Tomcat 动态日志查看(最常用)
Tomcat 的核心日志分为 访问日志 (记录所有 HTTP 请求)和 应用日志(如业务报错、Tomcat 运行日志),分别对应不同文件,需针对性跟踪:
1. 实时跟踪 Tomcat 访问日志(判断请求是否转发到该节点)
访问日志默认路径:TOMCAT_HOME/logs/localhost_access_log.*.txt(或自定义命名,如你之前配置的 blog_access_log.txt)。
bash
# 登录 Tomcat 节点(如 tomcat01),实时跟踪访问日志(动态刷新)
tail -f /usr/local/tomcat/logs/localhost_access_log.2025-12-08.txt
# 若你自定义了访问日志名称(如 blog_access_log.txt),则:
tail -f /usr/local/tomcat/logs/blog_access_log.txt
-
关键作用 :只要负载均衡将请求转发到该 Tomcat,日志会立即显示请求的
Host头、请求路径、状态码等,可直接判断「该节点是否收到请求」。 -
过滤关键请求 (如只看某域名/路径):
bash# 只显示包含 www.cloudcpblog.com 的请求 tail -f /usr/local/tomcat/logs/blog_access_log.txt | grep "www.cloudcpblog.com" # 只显示 500 错误的请求(定位服务异常) tail -f /usr/local/tomcat/logs/blog_access_log.txt | grep " 500 "
2. 实时跟踪 Tomcat 应用/运行日志(定位报错)
应用日志默认路径:TOMCAT_HOME/logs/catalina.out(包含 Tomcat 启动日志、应用代码报错、JVM 信息等)。
bash
# 实时跟踪 catalina.out,动态查看报错/运行信息
tail -f /usr/local/tomcat/logs/catalina.out
# 过滤报错关键词(如 Exception/Error)
tail -f /usr/local/tomcat/logs/catalina.out | grep -i "exception\|error"
- 关键作用:若请求到达 Tomcat 但业务报错(如数据库连接失败、代码异常),可在此日志中找到具体堆栈信息。
二、进阶方案:同时查看两台 Tomcat 的动态日志(聚合分析)
负载均衡模式下,需同时观察两台 Tomcat 的日志,判断「请求是否按负载规则分发」(如轮询、权重),有 3 种常用方式:
方式 1:多终端分屏(最简单)
- 打开 2 个 SSH 终端,分别登录
tomcat01和tomcat02; - 各自执行
tail -f跟踪访问日志,同时操作客户端访问域名,观察两台日志的请求记录(如轮询模式下会交替出现请求)。
方式 2:使用 multitail 工具(单终端聚合多日志)
multitail 可在单个终端同时显示多个远程/本地日志,适合无多终端的场景:
bash
# 1. 安装 multitail(CentOS/Rocky Linux)
yum install -y multitail
# 2. 同时跟踪两台 Tomcat 的访问日志(需先配置 SSH 免密登录,避免重复输密码)
multitail \
-l "ssh root@tomcat01 'tail -f /usr/local/tomcat/logs/blog_access_log.txt'" \
-l "ssh root@tomcat02 'tail -f /usr/local/tomcat/logs/blog_access_log.txt'"
- 操作快捷键 :
- 按
j/k切换日志窗口; - 按
Ctrl+C退出; - 按
F可过滤关键词(如输入www.cloudcpblog.com只看目标请求)。
- 按
方式 3:日志集中收集(ELK,适合生产环境)
若为生产环境,推荐搭建 ELK 栈(Elasticsearch + Logstash + Kibana):
- 在两台 Tomcat 上部署
Filebeat,实时采集访问日志/应用日志; Filebeat将日志发送到Logstash清洗、打标签(如标记tomcat01/tomcat02);Elasticsearch存储日志,Kibana提供可视化面板,可:- 实时搜索所有日志(按节点、时间、请求路径过滤);
- 统计两台 Tomcat 的请求量(验证负载均衡权重是否生效);
- 定位某条请求具体落在哪个 Tomcat 节点。
三、精准方案:定位「单个请求」落在哪个 Tomcat 节点
若需追踪「某一次客户端请求」具体转发到了哪台 Tomcat,可通过「请求唯一标识」实现:
-
客户端请求时添加自定义头/参数 (如
trace-id):bash# 用 curl 发送请求,添加自定义 trace-id=123456 curl -H "trace-id: 123456" http://www.cloudcpblog.com -
修改 Tomcat 访问日志格式,记录自定义头 :
编辑 Tomcat 的conf/server.xml,在<AccessLogValve>的pattern中添加%{trace-id}i(记录trace-id头):xml<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="blog_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" "%{trace-id}i"" /> -
重启 Tomcat 后,在两台日志中搜索
trace-id=123456:bash# 在 tomcat01 搜索 grep "123456" /usr/local/tomcat/logs/blog_access_log.txt # 在 tomcat02 搜索 grep "123456" /usr/local/tomcat/logs/blog_access_log.txt- 哪个节点的日志能搜到,说明请求转发到了该节点。
四、关键注意事项
- 日志时间同步 :确保两台 Tomcat 节点的系统时间同步(执行
ntpdate ntp.aliyun.com),否则日志时间不一致会导致分析混乱; - 负载均衡转发规则 :若使用 Nginx 负载均衡,需确保配置中开启
proxy_set_header Host $host;(传递域名),否则 Tomcat 访问日志的Host头会显示 IP,无法匹配虚拟主机; - 日志轮转 :若 Tomcat 开启了日志轮转(如按天生成日志文件),需确认跟踪的是当天的日志文件(如
localhost_access_log.2025-12-08.txt),而非历史文件。
总结
| 场景 | 推荐方案 |
|---|---|
| 快速验证单节点是否收到请求 | tail -f 跟踪访问日志 |
| 同时观察两台节点的请求分发 | multitail 聚合日志 / 多终端分屏 |
| 生产环境长期监控/分析 | ELK 日志集中收集 |
| 定位单个请求的转发节点 | 自定义 trace-id + 日志过滤 |
按以上方法,可清晰掌握负载均衡模式下两台 Tomcat 的请求接收、运行状态,快速定位「请求未转发」「节点报错」「负载规则未生效」等问题。