Tomcat 服务器日志是诊断应用问题、监控服务器状态和确保安全性的关键。下面我将为你提供一份超详细的 Tomcat 日志讲解,涵盖日志类型、位置、配置、核心日志文件解析以及实用的分析技巧。
一、Tomcat 日志体系概览
Tomcat 的日志主要分为两大类:
Tomcat 自身运行日志:记录容器启动、关闭、部署、内部错误等信息。
应用日志:记录部署在 Tomcat 上的 Web 应用程序输出的日志(通常通过
log4j2、
logback、
java.util.logging 等框架生成)。
二、日志文件位置与类型
默认情况下,日志位于 $CATALINA_BASE/logs 目录($CATALINA_BASE 通常是 Tomcat 安装目录)。
核心日志文件:
catalina.out / catalina.yyyy-mm-dd.log
- catalina.out: 在 Unix/Linux 系统下,如果使用
startup.sh 启动且未重定向,所有标准输出和错误输出会打印到此文件。它不会自动轮转,可能变得非常大。
- catalina.yyyy-mm-dd.log: 每日生成的 Catalina 引擎核心日志。记录了 Tomcat 启动、关闭、部署/卸载应用、严重错误等信息。这是诊断 Tomcat 本身问题的首要文件。
- 内容示例:
INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/9.0.68
INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Nov 9 2022 20:35:00 UTC
INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.68]
INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [2,357] milliseconds
localhost.yyyy-mm-dd.log
- 用途:记录 Web 应用内部的日志。如果你在应用中使用了
java.util.logging(JUL)且未配置其他日志框架,Servlet 和 Filter 等产生的日志常会出现在这里。
- 注意:很多应用使用
log4j2 或 logback,它们的输出通常不在这里,而是由应用自身配置决定(如输出到 app.log)。
localhost_access_log.yyyy-mm-dd.txt
manager.yyyy-mm-dd.log / host-manager.yyyy-mm-dd.log
- 专门记录 Tomcat 管理平台(
/manager/html)和虚拟主机管理平台(/host-manager/html)的访问和操作日志。
其他可能文件:
catalina.{yyyy-mm-dd}.out:在某些配置下,标准输出会按日期轮转。
*.gz:旧日志的压缩包。
三、日志配置详解
配置文件位于 $CATALINA_BASE/conf/。
1.
logging.properties(主要配置文件)
此文件控制 java.util.logging 框架的行为,决定了 catalina.*.log 和 localhost.*.log 等文件的输出。
-
关键配置项:
# 设置全局日志级别(SEVERE > WARNING > INFO > CONFIG > FINE > FINER > FINEST)
.level = INFO
# 配置 Catalina (引擎) 日志
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = 2localhost.org.apache.juli.FileHandler
# 定义名为 “2localhost.org.apache.juli.FileHandler” 的文件处理器
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
# 配置 catalina 日志处理器
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
1catalina.org.apache.juli.FileHandler.encoding = UTF-8
# 配置 localhost 日志处理器
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
2localhost.org.apache.juli.FileHandler.encoding = UTF-8
-
修改日志级别: 如果想看到更详细的调试信息,可以将对应组件的 level 改为 FINE 或 ALL。例如,要调试连接器(Connector),可以添加:
org.apache.coyote.http11.level = FINE
2.
server.xml(配置访问日志)
在 server.xml 的 <Host> 标签内,可以找到或配置 AccessLogValve。
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b"
fileDateFormat="yyyy-MM-dd"
rotatable="true"
encoding="UTF-8" />
- pattern:可以自定义。常用的扩展模式:
%D:请求处理时间(毫秒)
%F:响应发送完成时间(毫秒)
%{User-Agent}i:客户端浏览器信息
%{Referer}i:请求来源
%T:处理请求所花费的时间(秒)
pattern="%h %l %u %t "%r" %s %b %Dms %{User-Agent}i"
四、应用日志与 Tomcat 日志的集成
你的 Web 应用(如 Spring Boot)通常有自己的日志配置(logback-spring.xml, log4j2.xml)。关键是如何让它与 Tomcat 环境协同工作。
最佳实践:应用日志独立输出
避免日志重复与丢失
- 确保不要将应用日志同时配置到
System.out/System.err(会进入 catalina.out)和独立的日志文件,除非你明确需要。
- 对于
catalina.out 无限增长问题,在生产环境中,强烈建议禁用 ConsoleHandler(在 logging.properties 中注释掉),并通过启动脚本将标准输出重定向到按日期轮转的文件,或使用 logrotate 等工具管理。
五、日志分析与故障排查实战
1. 启动失败
- 查看
catalina.yyyy-mm-dd.log 的最后部分。常见原因:- 端口被占用:
Address already in use
- 应用上下文初始化失败:
Context [/yourapp] startup failed due to previous errors
web.xml 或 servlet 类解析错误。
- JDK 版本不兼容。
2. 应用报错(500, NullPointerException等)
- 首先查看应用自己的日志文件(如
myapp-app.log)。
- 其次查看
localhost.yyyy-mm-dd.log,Tomcat 会把未捕获的异常和错误打印到这里。
- 结合访问日志
localhost_access_log...,找到出错请求的具体时间、参数和 URL。
3. 性能排查
- 在访问日志模式中添加
%D (处理时间)。分析慢请求。
- 查看
catalina.out 中是否有 Thread pool is exhausted 或类似警告,表明线程池不足。
- 启用连接器调试日志(在
logging.properties 中设置 org.apache.coyote.level = FINE),分析请求/响应细节。
4. 内存泄漏
- 查看
catalina.yyyy-mm-dd.log 中是否有 The web application [...] created a ThreadLocal ... 之类的严重警告。
- 在应用关闭或热部署时,注意观察是否有
SEVERE 级别的内存泄漏报告。
5. 访问问题(404, 403)
- 查看访问日志,确认请求的 URL 和响应状态码。
- 查看
catalina.log,确认应用是否部署成功。
六、高级技巧与工具
实时查看日志:
# 查看 catalina.out 尾部并实时刷新
tail -f $CATALINA_BASE/logs/catalina.out
# 同时查看多个日志文件
tail -f $CATALINA_BASE/logs/catalina.out $CATALINA_BASE/logs/localhost*.log $CATALINA_BASE/logs/myapp-app.log
日志聚合与分析:在生产环境中,使用 ELK Stack(Elasticsearch, Logstash, Kibana)或 Graylog 等工具集中收集、索引和可视化所有 Tomcat 服务器和应用日志。
使用 grep, awk, sed 进行快速分析:
# 查找所有错误
grep -E "ERROR|SEVERE" catalina.yyyy-mm-dd.log
# 统计404状态码的数量
awk '{print $9}' localhost_access_log.2023-10-05.txt | grep '404' | wc -l
# 找出最慢的10个请求(如果模式包含 %D)
awk '{print $(NF-1), $0}' localhost_access_log.txt | sort -nr | head -10
总结
| 日志文件 |
主要用途 |
关键信息 |
故障排查侧重 |
|---|
| catalina.xxx.log |
Tomcat 引擎生命周期 |
启动、关闭、部署、严重错误 |
Tomcat 自身启动失败、部署失败 |
| localhost.xxx.log |
应用内部日志 (JUL) |
Servlet异常、应用上下文事件 |
应用抛出的未捕获异常 |
| localhost_access_log |
HTTP 请求记录 |
客户端IP、URL、状态码、耗时 |
访问问题、性能分析、攻击追踪 |
| 应用自身日志 |
应用业务逻辑 |
自定义的 INFO/DEBUG/ERROR 日志 |
业务逻辑错误、数据库问题等 |
理解并熟练利用这些日志,你就能像一位经验丰富的侦探一样,快速定位和解决 Tomcat 服务器及其上应用运行过程中的绝大多数问题。