首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RollingFileAppender不创建日志文件

RollingFileAppender不创建日志文件
EN

Stack Overflow用户
提问于 2022-11-30 16:30:54
回答 1查看 27关注 0票数 0

当我使用RollingFileAppender时,它不会创建日志文件,但是如果我使用FileAppender,它就会创建日志文件。使用fileAppender =新的RollingFileAppender();没有创建日志文件。使用fileAppender =新的FileAppender();将创建日志文件。

代码语言:javascript
复制
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;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-01 11:20:18

对于RollingFileAppender,您必须同时指定一个RollingPolicy和一个TriggeringPolicy。以下是该链接的引文:

要想有任何用处,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy。

也是

但是,如果它的RollingPolicy也实现了TriggeringPolicy接口,那么只需要显式地指定前者。

实际上,如果您查看RollingFileAppender 这里这里的源代码,就会发现这些策略有“非空”的先决条件:

代码语言:javascript
复制
public void start() {
    if (triggeringPolicy == null) {
        addWarn("No TriggeringPolicy was set for the RollingFileAppender named " + getName());
        addWarn(MORE_INFO_PREFIX + RFA_NO_TP_URL);
        return; // BOOM
    }
    ...
    if (rollingPolicy == null) {
        addError("No RollingPolicy was set for the RollingFileAppender named " + getName());
        addError(MORE_INFO_PREFIX + RFA_NO_RP_URL);
        return; // BOOM
    }
    ...
}

因此,为了纠正这种情况,如果使用标准TimeBasedRollingPolicy,则相关代码可以如下所示:

TimeBasedRollingPolicy可能是最流行的滚动策略。它定义了基于时间的滚转策略,例如按日或按月。

代码语言:javascript
复制
RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<>();
fileAppender.setFile("test_two.log");
fileAppender.setEncoder(ple);
fileAppender.setContext(lc);

TimeBasedRollingPolicy<ILoggingEvent> logFilePolicy = new TimeBasedRollingPolicy<>();
logFilePolicy.setContext(lc);
logFilePolicy.setParent(fileAppender);
logFilePolicy.setFileNamePattern("test_two.log.%d{yyyy-MM-dd_HH}");
logFilePolicy.setMaxHistory(7);
logFilePolicy.start();

fileAppender.setRollingPolicy(logFilePolicy);
fileAppender.start();

使用此代码,我可以看到始终在创建配置的test_two.log文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74631129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档