当线上出现Bug时,通过日志快速定位问题的步骤如下:
1. 定位日志文件
- Tomcat默认日志路径:
${TOMCAT_HOME}/logs/
catalina.out
:核心日志(启动、运行信息)catalina.yyyy-MM-dd.log
:按日期归档的日志localhost.yyyy-MM-dd.log
:应用上下文相关日志localhost_access_log.yyyy-MM-dd.txt
:访问日志(请求路径、状态码)
- 应用自定义日志:根据日志框架(如Log4j、Logback)配置的路径查找,通常在应用目录或
/var/log/
下。
2. 常用命令与技巧
实时监控日志
# 实时跟踪最新日志(Debug时常用)
tail -f ${TOMCAT_HOME}/logs/catalina.out
# 监控包含"ERROR"的实时日志
tail -f catalina.out | grep "ERROR"
搜索关键字
# 查找所有ERROR或Exception(不区分大小写)
grep -E -i "ERROR|Exception" catalina.out
# 显示错误行及前后50行(上下文分析)
grep -A 50 -B 50 "NullPointerException" catalina.out
# 按时间范围过滤(例如14:00到15:00)
sed -n '/2023-10-25 14:00:/,/2023-10-25 15:00:/p' catalina.out
分页查看与过滤
# 分页查看日志(支持搜索:按/输入关键字)
less catalina.2023-10-25.log
# 统计错误出现次数
grep "ERROR" catalina.out | wc -l
# 查找访问日志中的500错误
grep " 500 " localhost_access_log.2023-10-25.txt
日志截取与归档
# 查看最近100行日志
tail -n 100 catalina.out
# 将某个时间段的日志保存到文件
sed -n '/2023-10-25 14:00:/,/2023-10-25 15:00:/p' catalina.out > error.log
3. 高级排查
- 线程堆栈分析:若怀疑死锁或高CPU,使用
jstack
生成线程快照。 - 内存分析:检查GC日志(需JVM启用
-Xloggc:/path/to/gc.log
)。 - 网络与进程:结合
netstat
、ps
、top
查看资源占用。
4. 示例流程
- 确定问题时间:用户反馈14:00出现500错误。
- 定位访问日志:
grep " 500 " localhost_access_log.2023-10-25.txt | grep "14:"
- 查找对应错误日志:
grep "2023-10-25 14:" catalina.out | grep -C 20 "NullPointerException"
- 分析堆栈:根据日志中的异常类型和代码行定位Bug。
5. 工具推荐
- 文本处理:
grep
、awk
、sed
- 日志聚合:ELK(Elasticsearch+Logstash+Kibana)
- 自动化监控:Prometheus+Grafana
通过以上步骤,可高效定位并解决大多数线上问题。