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
相关产品推荐
相关产品推荐

