我正在尝试基于滚动策略构建记录器。以下是我能够实施的最接近的方法:
let logfile = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("{d} {l}::{m}{n}")))
.build("log/output.log")?;
let config = Config::builder()
.appender(Appender::builder().build("logfile", Box::new(logfile)))
.build(Root::builder()
.appender("logfile")
.build(LevelFilter::Debug))?;
log4rs::init_config(config)?;
这有助于我记录所有级别的消息。但是,长时间记录到文件可能是一个危险的提议。因此,我正在寻找可以限制保留的日志数据量的东西。我碰到了RollingFileAppender
,但是找不到Policy
的正确用法。
请指导我。我主要是在寻找编程配置。
答案 0 :(得分:3)
您可以通过使用log4rs
板条箱中的RollingFileAppender
CompoundPolicy
,FixedWindowRoller
和SizeTrigger
来实现它。
您需要实现以下内容才能创建滚动文件逻辑:
FixedWindowRoller
指定FixedWindowRoller
将日志文件滚动到固定的window_size
中,如下所示:
let window_size = 3; // log0, log1, log2
let fixed_window_roller =
FixedWindowRoller::builder().build("log{}",window_size).unwrap();
SizeTrigger
指定SizeTrigger
来声明触发Roller
的文件的大小限制,如下所示:
let size_limit = 5 * 1024; // 5KB as max log file size to roll
let size_trigger = SizeTrigger::new(size_limit);
CompoundPolicy
声明CompoundPolicy
以便在RollingFileAppender
中使用它,如下所示:
let compound_policy = CompoundPolicy::new(Box::new(size_trigger),Box::new(fixed_window_roller));
然后在您的Config
中,您需要使用RollingFileAppender
才能获得所需的行为。
let config = Config::builder()
.appender(
Appender::builder()
.filter(Box::new(ThresholdFilter::new(LevelFilter::Debug)))
.build(
"logfile",
Box::new(
RollingFileAppender::builder()
.encoder(Box::new(PatternEncoder::new("{d} {l}::{m}{n}")))
.build("logfile", Box::new(compound_policy))?,
),
),
)
.build(
Root::builder()
.appender("logfile")
.build(LevelFilter::Debug),
)?;
通过此实现,您可以获得window size 3
和roll size 5KB
的滚动文件
注意: 如果您出于自己的目的想要拥有custom roller
和custom trigger
,则可以实现自己的Trigger
和{{ 3}}的特征