温馨提示×

centos java日志如何滚动切割

小樊
56
2026-09-12 00:24:14
栏目: 编程语言

在 CentOS 上,Java 应用日志的“滚动切割”通常有两种主流做法:

  1. 使用 Java 日志框架自身能力(Logback / Log4j2 / Log4j)
  2. 使用 Linux 系统工具 logrotate(推荐用于标准输出或文件)

下面分别说明。


一、使用 Java 日志框架(推荐,最常用)

1️⃣ Logback(Spring Boot 默认)

示例 logback-spring.xml:

<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</fileNamePattern>
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
</appender>

✅ 按天切割
✅ 保留 7 天

也可按大小切割:

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>/var/log/myapp/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    <maxFileSize>100MB</maxFileSize>
    <maxHistory>30</maxHistory>
</rollingPolicy>

2️⃣ Log4j2

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

二、使用 logrotate(CentOS 系统级)

适合:

  • 日志直接写文件
  • 标准输出重定向
  • 不想改 Java 配置

示例配置

/etc/logrotate.d/myapp

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

关键参数说明

参数 作用
daily 每天切割
rotate 7 保留 7 份
compress gzip 压缩
copytruncate 不重启 Java 进程
missingok 文件不存在不报错

⚠️ 重要:Java 写文件必须用 copytruncate,否则会一直写旧文件。


三、Spring Boot 推荐方案

✅ 最佳实践:

  • 使用 Logback
  • 日志写文件
  • 不用 nohup > app.log &

例如:

java -jar app.jar

日志由 Logback 管理。


四、常见坑

❌ Java 进程不释放文件句柄
✅ 用 copytruncate 或框架自带滚动

❌ 日志权限问题
✅ 日志目录给运行用户权限

❌ 磁盘写满
✅ 设置 maxHistory / rotate


五、总结

场景 推荐方式
Spring Boot Logback
老系统 Log4j
运维统一管控 logrotate
容器 输出到 stdout

如果你愿意,可以告诉我:

  • Java 版本
  • 日志框架
  • 是否 Spring Boot
  • 是否容器

我可以给你一份可直接用的配置。

0 踩