You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RollingFileAppender无法创建日志文件,FileAppender可正常创建的问题

RollingFileAppender无法创建日志文件,FileAppender正常的解决办法

问题现象

使用RollingFileAppender时无法生成日志文件,但切换为FileAppender后日志文件能正常创建。代码中执行fileAppender = new RollingFileAppender();无日志文件生成,执行fileAppender = new FileAppender();则正常。

原代码

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.rolling.RollingFileAppender;

public class LoggerUtils {
    private static final String FILE_APPENDER = "FILE_APPENDER";
    public static void main(String[] args) throws InterruptedException {
        Logger foo = createLoggerFor("foo");
        Logger bar = createLoggerFor("bar");
        foo.info("this is from foo log");
        bar.info("this is from bar log");
    }

    private static Logger createLoggerFor(String string) {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        
        PatternLayoutEncoder ple = new PatternLayoutEncoder();
        ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
        ple.setContext(lc);
        ple.start();
        FileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<ILoggingEvent>();
        fileAppender.setFile("test_two.log");
        fileAppender.setEncoder(ple);
        fileAppender.setContext(lc);
        fileAppender.start();

        Logger logger = (Logger) LoggerFactory.getLogger(string);
        logger.addAppender(fileAppender);
        logger.setLevel(Level.DEBUG);
        logger.setAdditive(false);
        logger.warn("Testing....");

        return logger;
    }
}

问题原因

RollingFileAppender**必须配置滚动策略(RollingPolicy)**才能正常工作,它依赖滚动策略来决定何时、如何滚动日志文件。而你的代码仅初始化了RollingFileAppender的基础属性,未设置任何滚动策略,导致Appender无法正常启动,自然不会生成日志文件。

解决方案

为RollingFileAppender添加滚动策略,比如常用的SizeAndTimeBasedRollingPolicy,该策略可以同时根据文件大小和时间来滚动日志。修改后的代码如下:

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.util.FileSize;

public class LoggerUtils {
    private static final String FILE_APPENDER = "FILE_APPENDER";
    public static void main(String[] args) throws InterruptedException {
        Logger foo = createLoggerFor("foo");
        Logger bar = createLoggerFor("bar");
        foo.info("this is from foo log");
        bar.info("this is from bar log");
    }

    private static Logger createLoggerFor(String string) {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        
        PatternLayoutEncoder ple = new PatternLayoutEncoder();
        ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
        ple.setContext(lc);
        ple.start();

        RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>();
        rollingFileAppender.setFile("test_two.log");
        rollingFileAppender.setEncoder(ple);
        rollingFileAppender.setContext(lc);

        // 配置滚动策略
        SizeAndTimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new SizeAndTimeBasedRollingPolicy<>();
        rollingPolicy.setContext(lc);
        // 设置滚动后的日志文件名格式
        rollingPolicy.setFileNamePattern("test_two.%d{yyyy-MM-dd}.%i.log");
        // 设置单个日志文件的最大大小
        rollingPolicy.setMaxFileSize(FileSize.valueOf("10MB"));
        // 设置保留的日志文件最大数量
        rollingPolicy.setMaxHistory(30);
        // 设置滚动策略关联的Appender
        rollingPolicy.setParent(rollingFileAppender);
        rollingPolicy.start();

        rollingFileAppender.setRollingPolicy(rollingPolicy);
        rollingFileAppender.start();

        Logger logger = (Logger) LoggerFactory.getLogger(string);
        logger.addAppender(rollingFileAppender);
        logger.setLevel(Level.DEBUG);
        logger.setAdditive(false);
        logger.warn("Testing....");

        return logger;
    }
}

说明

  • SizeAndTimeBasedRollingPolicy是常用的滚动策略,支持按时间和文件大小滚动日志
  • fileNamePattern定义了滚动后日志文件的命名规则,%d是时间格式,%i是文件索引(当单个时间周期内文件超过最大大小时递增)
  • maxFileSize设置单个日志文件的上限
  • maxHistory设置保留的历史日志天数

内容的提问来源于stack exchange,提问作者pavan kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:05:32