如何解决日志文件大小与 logback 中的 SizeBasedTriggerPolicy 不一致
我使用带有 FixedWindowRollingPolicy 和 SizeBasedTriggerPolicy 的 RollingFileAppender 定义了 getLoggerWithAppender() API。日志文件大小设置为 5000(用于测试目的)。最大索引设置为 10。但是,当我运行测试用例时,它会生成文件大小不一致的日志文件,这是意料之中的。我尝试按照 SizeBasedTriggeringPolicy limit is not working 中的示例进行操作,但没有帮助。
package main
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.contrib.jackson.JacksonJsonFormatter;
import ch.qos.logback.contrib.json.classic.JsonLayout;
import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
import ch.qos.logback.core.util.FileSize;
import org.slf4j.LoggerFactory;
import java.io.File;
class JavaLogger {
public static Logger getLoggerWithAppende(String loggerName) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
RollingFileAppender fileAppender = new RollingFileAppender();
fileAppender.setContext(loggerContext);
fileAppender.setFile("./log/" + File.separator + "logfile.log");
fileAppender.setAppend(false);
// Rolling policy
FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy();
rollingPolicy.setContext(loggerContext);
rollingPolicy.setFileNamePattern("./log/" + File.separator + "logfile-%i.log");
rollingPolicy.setParent(fileAppender);
rollingPolicy.start();
rollingPolicy.setMinIndex(1);
rollingPolicy.setMaxIndex(10);
fileAppender.setRollingPolicy(rollingPolicy);
// Rollover trigger policy
SizeBasedTriggeringPolicy triggeringPolicy = new SizeBasedTriggeringPolicy();
triggeringPolicy.setContext(loggerContext);
triggeringPolicy.setMaxFileSize(FileSize.valueOf("5000"));
triggeringPolicy.start();
fileAppender.setTriggeringPolicy(triggeringPolicy);
// JSON log message encoder
LayoutWrappingEncoder layoutEncoder = new LayoutWrappingEncoder();
JacksonJsonFormatter jacksonJsonFormatter = new JacksonJsonFormatter();
JsonLayout jsonLayout = new JsonLayout();
jsonLayout.setTimestampFormat("yyyy-MM-dd HH:mm:ss.SSS");
jsonLayout.setContext(loggerContext);
jsonLayout.setAppendLineSeparator(true);
jsonLayout.setIncludeException(true);
jsonLayout.setIncludeMDC(true);
jsonLayout.setJsonFormatter(jacksonJsonFormatter);
layoutEncoder.setLayout(jsonLayout);
layoutEncoder.setContext(loggerContext);
layoutEncoder.start();
fileAppender.setEncoder(layoutEncoder);
fileAppender.start();
// configures logger
Logger logger = loggerContext.getLogger(loggerName);
logger.setLevel(Level.ALL);
logger.addAppender(fileAppender);
logger.setAdditive(false);
return logger;
}
}
测试程序如下。
package main
import ch.qos.logback.classic.Logger;
public class LoggerMain {
public static void main(String[] args) {
Logger logger = JavaLogger.getLoggerWithAppende("test");
for (int i = 0; i < 1000; i++) {
logger.debug("This is debug1 message");
logger.error("This is error1 message");
logger.warn("This is warn1 message");
logger.trace("This is trace1 message");
logger.info("This is info1 message");
}
}
}
它生成的输出日志文件大小是。每个日志文件大小应该在 5K 左右,但正在创建的日志文件大小多种多样。
ls -lrt
total 1424
-rw-r--r-- 1 user staff 8959 Mar 13 01:47 logfile-7.log
-rw-r--r-- 1 user staff 9102 Mar 13 01:47 logfile-6.log
-rw-r--r-- 1 user staff 18200 Mar 13 01:47 logfile-5.log
-rw-r--r-- 1 user staff 36404 Mar 13 01:47 logfile-4.log
-rw-r--r-- 1 user staff 72806 Mar 13 01:47 logfile-3.log
-rw-r--r-- 1 user staff 145614 Mar 13 01:47 logfile-2.log
-rw-r--r-- 1 user staff 291224 Mar 13 01:47 logfile-1.log
-rw-r--r-- 1 user staff 128691 Mar 13 01:47 logfile.log
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。