Tomcat 服务器日志是诊断应用问题、监控服务器状态和确保安全性的关键。下面我将为你提供一份超详细的 Tomcat 日志讲解,涵盖日志类型、位置、配置、核心日志文件解析以及实用的分析技巧。
Tomcat 的日志主要分为两大类:
Tomcat 自身运行日志:记录容器启动、关闭、部署、内部错误等信息。 应用日志:记录部署在 Tomcat 上的 Web 应用程序输出的日志(通常通过log4j2、logback、java.util.logging 等框架生成)。
默认情况下,日志位于 $CATALINA_BASE/logs 目录($CATALINA_BASE 通常是 Tomcat 安装目录)。
catalina.out / catalina.yyyy-mm-dd.log
startup.sh 启动且未重定向,所有标准输出和错误输出会打印到此文件。它不会自动轮转,可能变得非常大。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
java.util.logging(JUL)且未配置其他日志框架,Servlet 和 Filter 等产生的日志常会出现在这里。log4j2 或 logback,它们的输出通常不在这里,而是由应用自身配置决定(如输出到 app.log)。localhost_access_log.yyyy-mm-dd.txt
%h %l %u %t "%r" %s %b%h:远程主机名(或IP)%l:远程逻辑用户名(通常为 -)%u:远程认证用户(通常为 -)%t:请求日期和时间%r:请求行(如 GET /index.html HTTP/1.1)%s:HTTP 状态码%b:发送的字节数(不包括头)127.0.0.1 - - [05/Oct/2023:14:23:01 +0800] "GET /myapp/api/user?id=1 HTTP/1.1" 200 1234
192.168.1.100 - - [05/Oct/2023:14:23:02 +0800] "POST /myapp/api/login HTTP/1.1" 401 12
manager.yyyy-mm-dd.log / host-manager.yyyy-mm-dd.log
/manager/html)和虚拟主机管理平台(/host-manager/html)的访问和操作日志。其他可能文件:
catalina.{yyyy-mm-dd}.out:在某些配置下,标准输出会按日期轮转。*.gz:旧日志的压缩包。配置文件位于 $CATALINA_BASE/conf/。
此文件控制 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
在 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" />
%D:请求处理时间(毫秒)%F:响应发送完成时间(毫秒)%{User-Agent}i:客户端浏览器信息%{Referer}i:请求来源%T:处理请求所花费的时间(秒)pattern="%h %l %u %t "%r" %s %b %Dms %{User-Agent}i"你的 Web 应用(如 Spring Boot)通常有自己的日志配置(logback-spring.xml, log4j2.xml)。关键是如何让它与 Tomcat 环境协同工作。
/logs/myapp-app.log,并进行按日期/大小轮转。logback (logback-spring.xml):<property name="LOG_PATH" value="${catalina.base:-.}/logs/myapp" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
System.out/System.err(会进入 catalina.out)和独立的日志文件,除非你明确需要。catalina.out 无限增长问题,在生产环境中,强烈建议禁用 ConsoleHandler(在 logging.properties 中注释掉),并通过启动脚本将标准输出重定向到按日期轮转的文件,或使用 logrotate 等工具管理。startup.sh):# 修改最后一行,将输出重定向
exec "$PRGDIR"/"$EXECUTABLE" start "$@" > "$CATALINA_BASE/logs/catalina.out" 2>&1 &
Linux 的 logrotate 服务来轮转 catalina.out。catalina.yyyy-mm-dd.log 的最后部分。常见原因:Address already in useContext [/yourapp] startup failed due to previous errorsweb.xml 或 servlet 类解析错误。myapp-app.log)。localhost.yyyy-mm-dd.log,Tomcat 会把未捕获的异常和错误打印到这里。localhost_access_log...,找到出错请求的具体时间、参数和 URL。%D (处理时间)。分析慢请求。catalina.out 中是否有 Thread pool is exhausted 或类似警告,表明线程池不足。logging.properties 中设置 org.apache.coyote.level = FINE),分析请求/响应细节。catalina.yyyy-mm-dd.log 中是否有 The web application [...] created a ThreadLocal ... 之类的严重警告。SEVERE 级别的内存泄漏报告。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 服务器及其上应用运行过程中的绝大多数问题。