Как я могу использовать RollingFileAppender log4rs для включения скользящего журнала? - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь создать регистратор на основе скользящей политики.Ниже приведен пример, который мне удалось реализовать:

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 Ответ

3 голосов
/ 28 мая 2019

Вы можете реализовать это с помощью RollingFileAppender CompoundPolicy, FixedWindowRoller и SizeTrigger из log4rs crate.

Для создания логики скользящего файла необходимо реализовать следующее:

  1. 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 и Roller изсоответствующие черты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...