温馨提示×

怎么优化ubuntu tomcat日志

小樊
41
2026-08-31 11:49:53
栏目: 智能运维

优化 Ubuntu (Linux) 下的 Tomcat 日志,主要目的是解决磁盘空间占用过大排查问题时日志难以定位以及提高性能

Tomcat 的日志主要分为以下几类:

  1. Catalina 输出:标准输出和错误输出(catalina.out)。
  2. 访问日志:Access Log(记录谁访问了你的网站)。
  3. 应用日志:通过 log4j 或 logback 等框架产生的日志。

以下是分步骤的优化方案:


1. 优化 catalina.out (最重要的一步)

catalina.out 是 Tomcat 最头疼的日志文件,因为它默认会不断增长,且不会自动切割。

方法 A:使用 cronologlogrotate 进行按日期切割 (推荐)

这是最常用的方法。我们修改 Tomcat 的启动脚本 catalina.sh

步骤 1: 安装 cronolog

sudo apt-get update
sudo apt-get install cronolog

步骤 2: 修改 catalina.sh 找到 Tomcat 安装目录下的 bin/catalina.sh。 搜索 touch "$CATALINA_OUT" 或者 >> "$CATALINA_OUT" 2>&1

通常我们会将启动相关的日志输出管道重定向到 cronolog。 找到类似下面的代码行(不同版本可能略有不同):

# 旧代码
>> "$CATALINA_OUT" 2>&1 &

改为 (建议修改 catalina.sh 中的 else 分支,即 start 命令部分): 更好的做法是在 catalina.sh 中找到 org.apache.catalina.startup.Bootstrap "$@" start \ 这一行,将其修改为:

      org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
      | /usr/bin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null &

注意:如果是 Tomcat 9,有时直接在 catalina.sh 改比较复杂,另一种思路是修改 conf/logging.properties 或者直接用下面的 Logrotate 方案。

方法 B:使用 logrotate (系统级管理,更稳妥)

如果不想修改 Tomcat 源码,可以用 Ubuntu 自带的 logrotate 来管理。

创建配置文件:

sudo nano /etc/logrotate.d/tomcat

填入以下内容(请根据你的实际路径修改):

/opt/tomcat/logs/catalina.out {
    daily
    rotate 7
    missingok
    dateext
    compress
    notifempty
    copytruncate
}
  • daily: 每天切割。
  • rotate 7: 保留7份备份。
  • compress: 压缩旧日志(节省空间)。
  • copytruncate: 复制后清空原文件(Tomcat 不需要重启)。

方法 C:截断 catalina.out (临时救急)

如果日志已经爆满,可以立即执行:

# 清空文件内容,但不删除文件(Tomcat 进程不会报错)
sudo truncate -s 0 /opt/tomcat/logs/catalina.out
# 或者
sudo sh -c 'echo > /opt/tomcat/logs/catalina.out'

2. 优化 logging.properties (JULI 日志)

Tomcat 使用 java.util.logging (JULI) 来处理自身的日志。配置文件位于 conf/logging.properties

优化建议:

  1. 提高日志级别:生产环境不需要 FINEFINER,改为 INFOWARNING
    .level = INFO
    1catalina.org.apache.juli.AsyncFileHandler.level = INFO
    2localhost.org.apache.juli.AsyncFileHandler.level = INFO
    
  2. 定期清理旧日志:在 logging.properties 中设置 rotatable 和保留天数(部分版本支持,如果不支持请配合 logrotate)。

3. 优化访问日志 (Access Log)

访问日志 (localhost_access_log.txt) 会记录每一个 HTTP 请求,流量大时非常占空间。

文件位置: conf/server.xml

找到 AccessLogValve 配置:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
       prefix="localhost_access_log" suffix=".txt"
       pattern="%h %l %u %t "%r" %s %b" />

优化方案:

  1. 开启压缩:如果磁盘空间非常紧张,可以考虑在日志生成后压缩(Tomcat 本身不直接支持 gzip 输出,建议配合 logrotate)。
  2. 减少不需要的字段:如果你不需要记录 User-Agent 或 Referer,可以简化 pattern。
  3. 关闭日志(慎用):如果不需要排查访问记录,可以直接注释掉这个 Valve。
    <!-- 注释掉这段 -->
    <!-- <Valve className="org.apache.catalina.valves.AccessLogValve" ... /> -->
    

4. 优化应用日志 (Log4j / Logback)

这是你的 Java 代码打印的日志(如 System.outlogger.info)。

核心原则:不要在代码里用 System.out.println,要用日志框架。

推荐配置 (Logback 示例):

如果你使用 Spring Boot 或 Logback,务必配置 logback-spring.xmllogback.xml,开启滚动策略 (RollingPolicy)

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/myapp.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天切割,保存30天,总大小不超过10GB -->
            <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

5. 终极方案:不使用 catalina.out

如果你已经使用了 Log4j 或 Logback 来管理应用日志,其实 catalina.out 里主要只剩下启动信息和异常堆栈。

你可以修改 bin/catalina.sh,将标准输出重定向到 /dev/null

修改 catalina.sh 找到 CATALINA_OUT 变量,将其改为 /dev/null(但这会导致启动脚本输出丢失,需谨慎)。

更推荐的做法是:确保 conf/logging.properties 中的 ConsoleHandler 被移除或级别调高,这样 Tomcat 自身就不会往控制台打印太多东西。


总结:一键检查清单

  1. 磁盘空间:运行 df -h 检查。
  2. 日志大小:运行 du -sh /opt/tomcat/logs/* 查看哪个文件最大。
  3. 立即清理truncate -s 0 catalina.out
  4. 长期策略
    • 配置 logrotate 管理 catalina.out
    • 修改 conf/logging.properties 将级别改为 INFO
    • 确认应用层(Logback/Log4j2)开启了按天滚动自动删除旧文件策略。

0