如何使用log4rs改变正在运行的进程的日志级别?

问题描述 投票:2回答:1

我试图在Rust程序的运行过程中动态地改变日志级别。

我使用了如下的log4rs 其例 他们声称这是可能的。

但是当我运行下面的程序时,它就崩溃了--当我试图改变日志级别时--我认为这是日志API的限制(根据这个。https:/github.comrust-langlogblobmastersrclib.rs#L1278)。)

有没有其他方法可以让我在运行时改变日志级别?

以下是我想做的事情。

use log4rs::append::console::ConsoleAppender;
use log4rs::append::console::Target;
use log4rs::config::{Appender, Config, Root}; 

use log::*;

fn main() {
    let level_info = log::LevelFilter::Info; 
    let level_trace = log::LevelFilter::Trace;


    let stderr = ConsoleAppender::builder().target(Target::Stderr).build();
    let config = Config::builder().appender(
        Appender::builder()
            .build("stderr", Box::new(stderr)),
    ).build(
        Root::builder()
            .appender("stderr")
            .build(level_info),
    ).unwrap();

    log4rs::init_config(config).unwrap(); 


    error!("error"); //should print 
    warn!("warn");   //should print
    info!("info");   //should print
    debug!("debug"); //should  not print
    trace!("trace"); //should  not print 


    let stderr = ConsoleAppender::builder().target(Target::Stderr).build();
    let config = Config::builder().appender(
        Appender::builder()
            .build("stderr", Box::new(stderr)),
    ).build(
        Root::builder()
            .appender("stderr")
            .build(level_trace),
    ).unwrap();

    log4rs::init_config(config).unwrap(); 


    error!("error2"); //should print
    warn!("warn2");   //should print
    info!("info2");   //should print
    debug!("debug2"); //should print
    trace!("trace2"); //should print  

}

输出:

2020-04-20T12:07:53.351080400+01:00 ERROR use_log4rs - error
2020-04-20T12:07:53.354078400+01:00 WARN use_log4rs - warn
2020-04-20T12:07:53.356077200+01:00 INFO use_log4rs - info
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: SetLoggerError(())', src\main.rs:48:5
logging rust
1个回答
2
投票

你只能调用 init_config 一次。然而,它返回一个带有 set_config 方法,你可以在事后调用它来更改配置。

let hndl = log4rs::init_config(config).unwrap();

// ...
// Apply new config:
hndl.set_config(config);

Playground

© www.soinside.com 2019 - 2024. All rights reserved.