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

rav*_*avi 1 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)?;
Run Code Online (Sandbox Code Playgroud)

这帮助我记录所有级别的消息。但是,长时间记录到文件可能是一个危险的提议。因此,我正在寻找可以限制保留的日志数据量的东西。我遇到过RollingFileAppender,但找不到Policy.

请指导我完成这个。我主要是在寻找程序化配置。

Web*_*rix 7

您可以通过使用实现它,并从箱子。RollingFileAppender CompoundPolicyFixedWindowRollerSizeTriggerlog4rs

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

  1. FixedWindowRoller

指定FixedWindowRoller以固定方式滚动日志文件,window_size如下所示:

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

指定SizeTrigger声明文件的大小限制以触发Roller如下:

let size_limit = 5 * 1024; // 5KB as max log file size to roll
let size_trigger = SizeTrigger::new(size_limit);
Run Code Online (Sandbox Code Playgroud)
  1. CompoundPolicy

声明如下CompoundPolicy使用它RollingFileAppender

let compound_policy = CompoundPolicy::new(Box::new(size_trigger),Box::new(fixed_window_roller));
Run Code Online (Sandbox Code Playgroud)

然后在您的Config, 您需要使用RollingFileAppender才能获得所需的行为。

let window_size = 3; // log0, log1, log2
let fixed_window_roller = 
FixedWindowRoller::builder().build("log{}",window_size).unwrap();
Run Code Online (Sandbox Code Playgroud)

有了这个实现,你得到了一个滚动的文件window size 3roll size 5KB


注意: 如果你想有一个custom rollerandcustom trigger为你自己的目的,你可以实现你自己的Triggerand Rollerfrom 各自的 trait