如何通过Ubuntu Tomcat日志精准定位异常请求,有效提升网站稳定性?
- 内容介绍
- 文章标签
- 相关推荐
Tomcat 的日志往往是排查故障的唯一窗口。但许多运维同学会面临以下痛点:
- 日志文件分布在不同方法,难以一次性定位。按理说,
- 手工逐行看日志耗时长。特别是大流量网站每天产生数百 MB 日志。
- 错误信息往往被“INFO”“DEBUG”等正常输出淹没,导致异常请求被漏检。
- 缺乏自动化报警,一旦出现严重错误只能等到业务受影响后才发现。
下面通过一套完整的流程。让您在 Ubuntu 环境下快速精准定位 Tomcat 异常请求,从而明显提高网站稳定性。
一、日志位置与关键文件
Ubuntu 程序中 Tomcat 的默认日志目录通常是 /var/log/tomcat8/。至于主要文件包括,
-
catalina.out: 容器级别标准输出和错误输出。说起来, -
$CATALINA_HOME/logs/localhost_access_log.*: 每日访问日志。 -
$CATALINA_HOME/logs/*.log: 各种应用及容器内部日志。
快速定位文件方法的技巧
// 查看当前 Tomcat 安装目录
$ sudo find / -name catalina.out
// 或者使用 systemd 服务单元检查配置
$ systemctl status tomcat8.service | grep -i "Loaded"
二、常见异常模式与日志特征
了解异常模式可以让我们在筛选时直接匹配关键信息。从常见模式如下来看,
| 异常类型 | 典型日志特征 |
|---|---|
| 404 Not Found | "HTTP/1.1 404 Not Found" |
| 500 Internal Server Error | "HTTP/1.1 500 Internal Server Error" |
| SQL 错误 | "SQL syntax" 或 "SQLException" + 错误码。例如 "SQLSTATE" |
| Mysql 超时或连接错误 | "Communications link failure" 或 "Could not connect to database" |
| OutOfMemoryError 等资源耗尽错误 | "java.lang.OutOfMemoryError" |
| AOP / Spring MVC 调用栈异常 | "NullPointerException" 或类似堆栈跟踪行号提示 "at com.xxx..." |
三、命令行工具快速筛选异常请求
痛点这方面,手工复制粘贴、频繁打开编辑器查看单条记录效率极低。方法这方面,使用 grep、awk 等工具一次性提取关键信息。
a) 提取 ERROR 与 INFO 条目并保留时间戳和 URL
// 搜索 ERROR 并打印时间戳 + 请求信息
$ grep "ERROR" /var/log/tomcat8/catalina.out \
| awk '{print $1。$2,$7,$8,$9}' | less
再看说明,- 第一个字段通常为日期;第二个为时间,第七到第九字段一般包含 HTTP 方法、URI 和协议;- 您可以根据实际日志格式调整 awk 字段索引。如果想同时搜索多种关键字,可以使用正则表达式组合:
// 同时搜索 ERROR 和 WARN 并输出时间 + 消息
$ grep -E "" /var/log/tomcat8/catalina.out \
| awk '{print $1,$2。""}'
b) 利用时间段过滤
// 假设程序时间格式为 yyyy-MM-dd HH:mm:ss $ d=$ $ grep "$d" /var/log/tomcat8/catalina.out> recent.log
从痛点来看,手动复制粘贴导致遗漏关键上下文。 说到方法,一次性将所有异常信息导出至 CSV 或 JSON。再交给后端分析脚本或可视化工具处理。
四、进阶分析与自动化监控程序搭建方案
至于痛点。缺少实时监控,一旦出现高并发导致内存溢出,业务瞬间不可用。说到方法,建立 ELK 堆栈或 Loki+Grafana 组合。实现实时聚合与告警,
a) ELK 基础部署示例
# 安装 Java JDK sudo apt-get update && sudo apt-get install -y default-jdk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.10-amd64.deb sudo dpkg -i elasticsearch-7.17.10-amd64.deb
sudo sed -i 's/#cluster.name:/cluster.name: my-cluster/' /etc/elasticsearch/elasticsearch.yml sudo systemctl enable elasticsearch && sudo systemctl start elasticsearch
echo " input { file { path => \"/var/log/tomcat8/catalina.out\" startposition => \"beginning\" sincedbpath => \"/dev/null\" } } output { elasticsearch { hosts => index => \"tomcat-%{+YYYY.MM.dd}\" } }" | sudo tee /etc/logstash/conf.d/filebeat.conf
sudo systemctl enable logstash && sudo systemctl start logstash
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.10-amd64.deb sudo dpkg -i kibana-7.17.10-amd64.deb sudo systemctl enable kibana && sudo systemctl start kibana
// 打开浏览器访问 http://localhost:5601,创建索引模板并进行可视化。
b) 脚本自动解析 & 报告生成
# parsetomcatlogs.py import re,json,datetime,os
LOG_FILE = "/var/log/tomcat8/catalina.out"
patternerror = re.compile .*ERROR.*") pattern404 = re.compile pattern_500 = re.compile
def analyze: data = {"errors":,"404":。"500": } with open as f: for line in f: if patternerror.search: ts = patternerror.search.group data.append}) if pattern404.search: ts = line.split+" "+line.split data.append}) if pattern500.search: ts = line.split+" "+line.split data.append}) # 输出 JSON 报告,可进一步推送邮件或 Slack 通知 with open as out: json.dump
if name == "main": analyze
再看运行方式,bash
python3 parse_tomcat_logs.py && cat /tmp/tomcat_report.json
至于痛点,单次脚本执行后仍需人工判断哪些条目需要主要关注。方法的观点是,结合阈值触发邮件报警。例如连续出现超过 N 次同类错误则立即通知运维团队。
) 报警程序集成示例
bash
sudo apt-get install -y mailutils
REPORT=$1 # 指定前面生成的 JSON 报告方法
ERRORCOUNT=$ NOTIFYTHRESHOLD=5
if;n SUBJECT=" Tomcat Errors Exceeded Threshold " echo "$SUBJECT" | mailx -aFrom:"" -s"$SUBJECT"
# Slack webhook 示例: curl -X POST -H 'Content-type: application/json' --data '{"text":"'"${SUBJECT}"'"}' https://hooks.slack.com/services/TOKEN/HOOKID/PATHID fi
再看运行方式。bash
bash send_alert.sh /tmp/tomcat_report.json
小结这方面,
- 通过 `grep`+`awk` 快速筛选关键字段;
- 实现实时聚合和可视化;不过,
- 自动解析并生成结构化报告;
- 邮件+Slack 实时通报;
-
定期回顾报表,更新阈值和正则表达式。
五、实战案例 & 建议
案例一某电商网站上线后短短两小时内发生数百次 HTTP 500,并伴随大量 OutOfMemoryError。怎么说呢,利用上述脚本,在第一分钟即发现 OOM 高峰,并触发 Slack 通知。运维团队及时重启 JVM 并调整 GC 参数,避免了全站宕机。
案例二某 SaaS 产品每日访问量达千万级,但偶尔出现 “HTTP 404 Not Found” 的浪潮。通过 ELK Dashboard 可视化每分钟请求次数。将 “404” 集群可视为热图,帮助前端团队修复路由错误。
建议
| 步骤 | 操作 |
|---|---|
| ① 定位日志 | 确认 与 /var/log/ 的方法一致 |
| ② 建立正则库 | 按业务场景
pattern_* 正则 |
| ③ 自动采集 | 部署 Logstash 或 Filebeat 将 catalina.out 推送至 Elasticsearch |
| ④ 可视化监控 | 在 Kibana 创建仪表盘展示 error_rate。out_of_memory,slow_request 等指标 |
| ⑤ 阈值报警 | 在 Grafana 设置阈值> N → 邮件/SMS 通知 |
| ⑥ 周期评审 | 每月回顾报表,根据新业务需求调整规则 |
Tomcat 的日志往往是排查故障的唯一窗口。但许多运维同学会面临以下痛点:
- 日志文件分布在不同方法,难以一次性定位。按理说,
- 手工逐行看日志耗时长。特别是大流量网站每天产生数百 MB 日志。
- 错误信息往往被“INFO”“DEBUG”等正常输出淹没,导致异常请求被漏检。
- 缺乏自动化报警,一旦出现严重错误只能等到业务受影响后才发现。
下面通过一套完整的流程。让您在 Ubuntu 环境下快速精准定位 Tomcat 异常请求,从而明显提高网站稳定性。
一、日志位置与关键文件
Ubuntu 程序中 Tomcat 的默认日志目录通常是 /var/log/tomcat8/。至于主要文件包括,
-
catalina.out: 容器级别标准输出和错误输出。说起来, -
$CATALINA_HOME/logs/localhost_access_log.*: 每日访问日志。 -
$CATALINA_HOME/logs/*.log: 各种应用及容器内部日志。
快速定位文件方法的技巧
// 查看当前 Tomcat 安装目录
$ sudo find / -name catalina.out
// 或者使用 systemd 服务单元检查配置
$ systemctl status tomcat8.service | grep -i "Loaded"
二、常见异常模式与日志特征
了解异常模式可以让我们在筛选时直接匹配关键信息。从常见模式如下来看,
| 异常类型 | 典型日志特征 |
|---|---|
| 404 Not Found | "HTTP/1.1 404 Not Found" |
| 500 Internal Server Error | "HTTP/1.1 500 Internal Server Error" |
| SQL 错误 | "SQL syntax" 或 "SQLException" + 错误码。例如 "SQLSTATE" |
| Mysql 超时或连接错误 | "Communications link failure" 或 "Could not connect to database" |
| OutOfMemoryError 等资源耗尽错误 | "java.lang.OutOfMemoryError" |
| AOP / Spring MVC 调用栈异常 | "NullPointerException" 或类似堆栈跟踪行号提示 "at com.xxx..." |
三、命令行工具快速筛选异常请求
痛点这方面,手工复制粘贴、频繁打开编辑器查看单条记录效率极低。方法这方面,使用 grep、awk 等工具一次性提取关键信息。
a) 提取 ERROR 与 INFO 条目并保留时间戳和 URL
// 搜索 ERROR 并打印时间戳 + 请求信息
$ grep "ERROR" /var/log/tomcat8/catalina.out \
| awk '{print $1。$2,$7,$8,$9}' | less
再看说明,- 第一个字段通常为日期;第二个为时间,第七到第九字段一般包含 HTTP 方法、URI 和协议;- 您可以根据实际日志格式调整 awk 字段索引。如果想同时搜索多种关键字,可以使用正则表达式组合:
// 同时搜索 ERROR 和 WARN 并输出时间 + 消息
$ grep -E "" /var/log/tomcat8/catalina.out \
| awk '{print $1,$2。""}'
b) 利用时间段过滤
// 假设程序时间格式为 yyyy-MM-dd HH:mm:ss $ d=$ $ grep "$d" /var/log/tomcat8/catalina.out> recent.log
从痛点来看,手动复制粘贴导致遗漏关键上下文。 说到方法,一次性将所有异常信息导出至 CSV 或 JSON。再交给后端分析脚本或可视化工具处理。
四、进阶分析与自动化监控程序搭建方案
至于痛点。缺少实时监控,一旦出现高并发导致内存溢出,业务瞬间不可用。说到方法,建立 ELK 堆栈或 Loki+Grafana 组合。实现实时聚合与告警,
a) ELK 基础部署示例
# 安装 Java JDK sudo apt-get update && sudo apt-get install -y default-jdk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.10-amd64.deb sudo dpkg -i elasticsearch-7.17.10-amd64.deb
sudo sed -i 's/#cluster.name:/cluster.name: my-cluster/' /etc/elasticsearch/elasticsearch.yml sudo systemctl enable elasticsearch && sudo systemctl start elasticsearch
echo " input { file { path => \"/var/log/tomcat8/catalina.out\" startposition => \"beginning\" sincedbpath => \"/dev/null\" } } output { elasticsearch { hosts => index => \"tomcat-%{+YYYY.MM.dd}\" } }" | sudo tee /etc/logstash/conf.d/filebeat.conf
sudo systemctl enable logstash && sudo systemctl start logstash
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.10-amd64.deb sudo dpkg -i kibana-7.17.10-amd64.deb sudo systemctl enable kibana && sudo systemctl start kibana
// 打开浏览器访问 http://localhost:5601,创建索引模板并进行可视化。
b) 脚本自动解析 & 报告生成
# parsetomcatlogs.py import re,json,datetime,os
LOG_FILE = "/var/log/tomcat8/catalina.out"
patternerror = re.compile .*ERROR.*") pattern404 = re.compile pattern_500 = re.compile
def analyze: data = {"errors":,"404":。"500": } with open as f: for line in f: if patternerror.search: ts = patternerror.search.group data.append}) if pattern404.search: ts = line.split+" "+line.split data.append}) if pattern500.search: ts = line.split+" "+line.split data.append}) # 输出 JSON 报告,可进一步推送邮件或 Slack 通知 with open as out: json.dump
if name == "main": analyze
再看运行方式,bash
python3 parse_tomcat_logs.py && cat /tmp/tomcat_report.json
至于痛点,单次脚本执行后仍需人工判断哪些条目需要主要关注。方法的观点是,结合阈值触发邮件报警。例如连续出现超过 N 次同类错误则立即通知运维团队。
) 报警程序集成示例
bash
sudo apt-get install -y mailutils
REPORT=$1 # 指定前面生成的 JSON 报告方法
ERRORCOUNT=$ NOTIFYTHRESHOLD=5
if;n SUBJECT=" Tomcat Errors Exceeded Threshold " echo "$SUBJECT" | mailx -aFrom:"" -s"$SUBJECT"
# Slack webhook 示例: curl -X POST -H 'Content-type: application/json' --data '{"text":"'"${SUBJECT}"'"}' https://hooks.slack.com/services/TOKEN/HOOKID/PATHID fi
再看运行方式。bash
bash send_alert.sh /tmp/tomcat_report.json
小结这方面,
- 通过 `grep`+`awk` 快速筛选关键字段;
- 实现实时聚合和可视化;不过,
- 自动解析并生成结构化报告;
- 邮件+Slack 实时通报;
-
定期回顾报表,更新阈值和正则表达式。
五、实战案例 & 建议
案例一某电商网站上线后短短两小时内发生数百次 HTTP 500,并伴随大量 OutOfMemoryError。怎么说呢,利用上述脚本,在第一分钟即发现 OOM 高峰,并触发 Slack 通知。运维团队及时重启 JVM 并调整 GC 参数,避免了全站宕机。
案例二某 SaaS 产品每日访问量达千万级,但偶尔出现 “HTTP 404 Not Found” 的浪潮。通过 ELK Dashboard 可视化每分钟请求次数。将 “404” 集群可视为热图,帮助前端团队修复路由错误。
建议
| 步骤 | 操作 |
|---|---|
| ① 定位日志 | 确认 与 /var/log/ 的方法一致 |
| ② 建立正则库 | 按业务场景
pattern_* 正则 |
| ③ 自动采集 | 部署 Logstash 或 Filebeat 将 catalina.out 推送至 Elasticsearch |
| ④ 可视化监控 | 在 Kibana 创建仪表盘展示 error_rate。out_of_memory,slow_request 等指标 |
| ⑤ 阈值报警 | 在 Grafana 设置阈值> N → 邮件/SMS 通知 |
| ⑥ 周期评审 | 每月回顾报表,根据新业务需求调整规则 |

