1. 定位Tomcat关键日志文件
Tomcat的日志文件集中存储在CATALINA_HOME/logs目录(CATALINA_HOME为Tomcat安装路径),需重点监控以下类型日志:
2. 实时查看日志变化
通过Linux命令实时跟踪日志文件更新,快速发现异常:
tail -f:持续显示日志文件末尾新增内容(如tail -f /path/to/tomcat/logs/catalina.out),按Ctrl+C退出;tail -F:类似tail -f,但会自动跟踪日志轮转后的新文件(如日志按天分割后,仍能监控新文件);less -F:结合less的分页功能实时查看(如less -F /path/to/tomcat/logs/catalina.out),按Ctrl+C退出实时模式。3. 过滤与分析关键信息
使用命令行工具快速提取异常或关键信息,缩小问题范围:
grep过滤关键词:查找包含“error”“exception”的错误日志(如tail -f catalina.out | grep -i 'error\|exception');awk提取字段:从访问日志中提取状态码并统计(如awk '{print $9}' localhost_access_log.2025-10-30.txt | sort | uniq -c,可统计各状态码出现次数);sed按时间筛选:提取特定时间段内的日志(如sed -n '/2025-10-30 14:00:/,/2025-10-30 15:00:/p' catalina.out,仅查看14:00-15:00的日志)。4. 配置日志级别调整粒度
通过修改conf/logging.properties文件,调整日志记录的详细程度:
FINE(详细)或SEVERE(仅严重错误),例如:org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE(记录应用部署详细过程);org.apache.catalina.level = SEVERE(仅记录Tomcat核心严重错误);ConsoleHandler或FileHandler的格式,添加时间戳、线程名等信息(如java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n)。5. 使用ELK Stack实现高级分析与可视化
通过ELK(Elasticsearch+Logstash+Kibana)堆栈实现日志的集中存储、分析与可视化:
catalina.out、localhost.log等文件的INFO/ERROR级别日志;6. 利用第三方日志管理工具
选择适合的工具简化日志监控流程:
index=tomcat status=500)、可视化(如仪表盘展示错误率)和告警功能;7. 结合JMX监控Tomcat内部状态
通过JMX(Java Management Extensions)实时监控Tomcat性能指标(如线程池、内存使用、连接数),并与日志结合分析:
bin/catalina.sh文件,添加JVM参数:JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=your_server_ip -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false";jconsole、VisualVM或Prometheus(配合jmx_exporter)连接到Tomcat,监控ThreadPool(活跃线程数)、Memory(堆内存使用率)、Connector(请求处理时间)等指标,若指标异常(如活跃线程数超过200),可结合日志查找原因(如是否有死循环)。8. 自动化脚本辅助监控
编写Shell或Python脚本,自动化执行日志检查与异常处理:
ps命令检查Tomcat进程(如ps -ef | grep tomcat | grep -v grep),若不存在则发送报警;grep查找错误日志,若存在则执行重启命令(如if grep -q 'OutOfMemoryError' catalina.out; then systemctl restart tomcat; fi);logrotate工具自动分割catalina.out(如按天分割、保留7天),防止日志文件过大影响性能(配置示例:/path/to/tomcat/logs/catalina.out { daily rotate 7 compress missingok notifempty })。