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

Eya*_*hem 5 logging rust

我试图在 Rust 程序运行期间动态更改日志级别。

我在他们的例子中使用了 log4rs,他们声称这是可能的。

但是当我运行以下程序时它崩溃了 - 当我尝试更改日志级别时 - 我认为这是日志 API 的限制(根据:https: //github.com/rust-lang/log/blob/主控/src/lib.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  

}
Run Code Online (Sandbox Code Playgroud)

输出:

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  

}
Run Code Online (Sandbox Code Playgroud)

Jmb*_*Jmb 5

您只能拨打init_config一次。但是,它返回一个带有set_config方法的句柄,您可以稍后调用该方法来更改配置:

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

// ...
// Apply new config:
hndl.set_config(config);
Run Code Online (Sandbox Code Playgroud)

操场