如何使用log4rs的RollingFileAppender合并滚动日志记录?

时间:2019-05-28 15:14:10

标签: rust

我正在尝试基于滚动策略构建记录器。以下是我能够实施的最接近的方法:

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的正确用法。

请指导我。我主要是在寻找编程配置。

1 个答案:

答案 0 :(得分:3)

您可以通过使用log4rs板条箱中的RollingFileAppender CompoundPolicyFixedWindowRollerSizeTrigger来实现它。

您需要实现以下内容才能创建滚动文件逻辑:

  1. FixedWindowRoller

指定FixedWindowRoller将日志文件滚动到固定的window_size中,如下所示:

let window_size = 3; // log0, log1, log2
let fixed_window_roller = 
FixedWindowRoller::builder().build("log{}",window_size).unwrap();
  1. SizeTrigger

指定SizeTrigger来声明触发Roller的文件的大小限制,如下所示:

let size_limit = 5 * 1024; // 5KB as max log file size to roll
let size_trigger = SizeTrigger::new(size_limit);
  1. 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 3roll size 5KB的滚动文件


注意: 如果您出于自己的目的想要拥有custom rollercustom trigger,则可以实现自己的Trigger和{{ 3}}的特征