温馨提示×

CentOS Java日志如何滚动

小樊
57
2026-08-19 04:34:04
栏目: 编程语言

CentOS 上,Java 应用的日志滚动(Log Rotation)常见有 三种方式,按使用频率从高到低说明,并给出可直接用的配置示例。


一、使用 Linux 自带 logrotate(最常用 ✅)

适合:标准 Java 应用(Spring Boot、Tomcat、普通 jar)

1️⃣ 示例:滚动 /var/log/myapp/app.log

sudo vim /etc/logrotate.d/myapp
/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0644 app app
    copytruncate
}

参数说明

参数 作用
daily 按天滚动
rotate 7 保留 7 份
compress 压缩旧日志
delaycompress 下次再压缩
missingok 日志不存在不报错
notifempty 空文件不滚动
copytruncate 复制后清空(Java 常用)
create 新建日志文件权限

copytruncate 对 Java 很重要
因为 Java 默认不会重新打开日志文件。


2️⃣ 测试是否生效

logrotate -d /etc/logrotate.d/myapp  # 模拟执行
logrotate -f /etc/logrotate.d/myapp  # 强制执行

二、Java 日志框架自带滚动(推荐 ✅✅)

如果你使用 Logback / Log4j2,这是最规范的方式


✅ Logback(Spring Boot 默认)

logback-spring.xml 示例:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/myapp/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/var/log/myapp/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

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

✅ 优点:

  • 自动压缩
  • 不依赖系统
  • 不丢日志
  • 支持按大小 + 时间

✅ Log4j2

<RollingFile name="FileAppender"
             fileName="/var/log/myapp/app.log"
             filePattern="/var/log/myapp/app-%d{yyyy-MM-dd}-%i.log.gz">
    <PatternLayout>
        <Pattern>%d %p %c - %m%n</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100MB"/>
    </Policies>
    <DefaultRolloverStrategy max="7"/>
</RollingFile>

三、Tomcat 日志滚动(特殊场景)

1️⃣ catalina.out 滚动

Tomcat 不会自动滚动 catalina.out,推荐用 logrotate

sudo vim /etc/logrotate.d/tomcat
/opt/tomcat/logs/catalina.out {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

四、常见问题 & 避坑

❌ Java 日志不滚动?

  • 没用 copytruncate
  • 应用没重新打开文件
  • 日志框架没配置滚动

❌ 日志被截断?

  • 不要用 truncate
  • 优先用 日志框架滚动

✅ 最佳实践

场景 建议
Spring Boot Logback
老系统 logrotate
容器 日志框架 + stdout

五、我可以帮你定制

你可以直接告诉我:

  • ✅ Java 版本
  • ✅ Spring Boot / 普通 jar / Tomcat
  • ✅ 日志路径
  • ✅ 是否容器(Docker)

我可以给你 完全可用的配置

0