欢迎光临白事网
详情描述

Tomcat 服务器日志是诊断应用问题、监控服务器状态和确保安全性的关键。下面我将为你提供一份超详细的 Tomcat 日志讲解,涵盖日志类型、位置、配置、核心日志文件解析以及实用的分析技巧。

一、Tomcat 日志体系概览

Tomcat 的日志主要分为两大类:

Tomcat 自身运行日志:记录容器启动、关闭、部署、内部错误等信息。 应用日志:记录部署在 Tomcat 上的 Web 应用程序输出的日志(通常通过 log4j2logbackjava.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)且未配置其他日志框架,ServletFilter 等产生的日志常会出现在这里。
  • 注意:很多应用使用 log4j2logback,它们的输出通常不在这里,而是由应用自身配置决定(如输出到 app.log)。

localhost_access_log.yyyy-mm-dd.txt

  • 用途HTTP 访问日志。记录每一个到达 Tomcat 的 HTTP/HTTPS 请求,格式可配置。
  • 默认格式%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

  • 专门记录 Tomcat 管理平台(/manager/html)和虚拟主机管理平台(/host-manager/html)的访问和操作日志。

其他可能文件

  • catalina.{yyyy-mm-dd}.out:在某些配置下,标准输出会按日期轮转。
  • *.gz:旧日志的压缩包。

三、日志配置详解

配置文件位于 $CATALINA_BASE/conf/

1. logging.properties(主要配置文件)

此文件控制 java.util.logging 框架的行为,决定了 catalina.*.loglocalhost.*.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 改为 FINEALL。例如,要调试连接器(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 环境协同工作。

最佳实践:应用日志独立输出
  • 配置应用日志框架,将日志输出到独立的文件,如 /logs/myapp-app.log,并进行按日期/大小轮转。
  • 好处:与 Tomcat 系统日志分离,便于管理和排查问题。
  • 在 Spring Boot 中配置 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 &
    • 更好的方式是使用 Linuxlogrotate 服务来轮转 catalina.out

五、日志分析与故障排查实战

1. 启动失败
  • 查看 catalina.yyyy-mm-dd.log 的最后部分。常见原因:
    • 端口被占用:Address already in use
    • 应用上下文初始化失败:Context [/yourapp] startup failed due to previous errors
    • web.xmlservlet 类解析错误。
    • 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 服务器及其上应用运行过程中的绝大多数问题。

相关帖子
租房押金被黑中介以各种理由克扣,收集哪些证据有助于成功要回款项?
租房押金被黑中介以各种理由克扣,收集哪些证据有助于成功要回款项?
大丰区短视频制作#模版网站开发设计,企业解决方案
大丰区短视频制作#模版网站开发设计,企业解决方案
雪豹的瞳孔和猫不一样?盘点“雪山精灵”的5个冷知识
雪豹的瞳孔和猫不一样?盘点“雪山精灵”的5个冷知识
为什么钩针编织能缓解压力?手作过程中的专注力训练与情绪疗愈原理
为什么钩针编织能缓解压力?手作过程中的专注力训练与情绪疗愈原理
大丰区殡葬一条龙服务价格-丧事白事一条龙,白事追悼会服务
大丰区殡葬一条龙服务价格-丧事白事一条龙,白事追悼会服务
面对一些生活必需品的价格波动,普通家庭可以采取哪些策略来平稳开支?
面对一些生活必需品的价格波动,普通家庭可以采取哪些策略来平稳开支?
手机号不再使用,但忘记绑定了哪些应用,有什么方法可以全面查询和解绑?
手机号不再使用,但忘记绑定了哪些应用,有什么方法可以全面查询和解绑?
对于网络上流传的历史类或社会类文章,普通读者可以从哪些角度评估其可信度?
对于网络上流传的历史类或社会类文章,普通读者可以从哪些角度评估其可信度?
AJAX POST数据中有特殊符号(转义字符)导致数据丢失的解决方法
AJAX POST数据中有特殊符号(转义字符)导致数据丢失的解决方法
明明知道熬夜不好,为什么就是控制不住自己?如何克服报复性熬夜?
明明知道熬夜不好,为什么就是控制不住自己?如何克服报复性熬夜?
不同城市间关于父母随迁落户的具体执行细则,主要差异体现在哪里?
不同城市间关于父母随迁落户的具体执行细则,主要差异体现在哪里?
南阳市殡葬服务公司一站式办理-办理丧葬服务,殡葬策划
南阳市殡葬服务公司一站式办理-办理丧葬服务,殡葬策划
如何清晰理解劳务派遣合同中关于工作岗位、地点与期限的关键条款?
如何清晰理解劳务派遣合同中关于工作岗位、地点与期限的关键条款?
独生子女继承父母房产,是否就完全不需要经过公证这个步骤?
独生子女继承父母房产,是否就完全不需要经过公证这个步骤?
如果我想在2026年使用电子产权证办理户口迁移,具体需要哪些步骤和线上材料?
如果我想在2026年使用电子产权证办理户口迁移,具体需要哪些步骤和线上材料?
汕头市网站SEO优化#企业网站建设设计,专业设计团队
汕头市网站SEO优化#企业网站建设设计,专业设计团队
2026年个人信用记录应该如何正确查询,哪些渠道是官方认可且免费的?
2026年个人信用记录应该如何正确查询,哪些渠道是官方认可且免费的?
2026年,如果两种养老保险都交过,退休时能合并计算待遇吗?
2026年,如果两种养老保险都交过,退休时能合并计算待遇吗?
在网络时代,个人如何理解并行使法律中提及的“被遗忘权”?
在网络时代,个人如何理解并行使法律中提及的“被遗忘权”?