欢迎光临白事网
详情描述

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个冷知识
为什么钩针编织能缓解压力?手作过程中的专注力训练与情绪疗愈原理
为什么钩针编织能缓解压力?手作过程中的专注力训练与情绪疗愈原理
那些逐渐淡出人们视野的节庆习俗,承载着怎样的集体记忆与情感?
那些逐渐淡出人们视野的节庆习俗,承载着怎样的集体记忆与情感?
天津市丧事一站式服务|白事入殓服务,为家属解决后顾之忧
天津市丧事一站式服务|白事入殓服务,为家属解决后顾之忧
夏季高温或冬季严寒等极端天气,对宠物托运计划会产生哪些具体影响?
夏季高温或冬季严寒等极端天气,对宠物托运计划会产生哪些具体影响?
外嫁女与兄弟在宅基地继承上发生纠纷,法律通常会如何裁决?
外嫁女与兄弟在宅基地继承上发生纠纷,法律通常会如何裁决?
北京市丧葬服务公司|殡葬悼念会布置,收费透明,1小时上门
北京市丧葬服务公司|殡葬悼念会布置,收费透明,1小时上门
绥化市苹果app开发#网站设计正规公司,收费标准
绥化市苹果app开发#网站设计正规公司,收费标准
秦皇岛市精准获客引流&java开源商城二次开发,定制开发
秦皇岛市精准获客引流&java开源商城二次开发,定制开发
从进化的角度看,为什么人类久坐会带来这么多健康问题与不适?
从进化的角度看,为什么人类久坐会带来这么多健康问题与不适?
比较消费券与现金补贴,哪种方式更能有效刺激社会总体消费需求?
比较消费券与现金补贴,哪种方式更能有效刺激社会总体消费需求?
宣城市殡葬一条龙公司-丧葬一站式服务,丧葬灵棚策划
宣城市殡葬一条龙公司-丧葬一站式服务,丧葬灵棚策划
在缴费阶段,个人养老金账户如何帮助我们合理减少当年的个人所得税负担?
在缴费阶段,个人养老金账户如何帮助我们合理减少当年的个人所得税负担?
如果生物识别模板数据泄露,会比密码泄露更严重吗?2026年我们该如何防范?
如果生物识别模板数据泄露,会比密码泄露更严重吗?2026年我们该如何防范?
在气候变化背景下,未来“超级台风”或“极端暴雨”的破坏力会更强吗?
在气候变化背景下,未来“超级台风”或“极端暴雨”的破坏力会更强吗?
从经济学视角看,家庭内部的无偿照护工作创造了哪些难以估量的社会价值?
从经济学视角看,家庭内部的无偿照护工作创造了哪些难以估量的社会价值?
日常通勤中频繁使用人脸识别门禁,怎样的穿着既得体又便于快速通过?
日常通勤中频繁使用人脸识别门禁,怎样的穿着既得体又便于快速通过?