有没有办法以编程方式更改日志包的默认日志记录级别?

时间:2014-10-01 13:12:43

标签: logging environment-variables rust

我正在开发Rust中的一个项目,该项目旨在由系统管理员通过CLI使用。 在这个程序中,我希望有这样的行:

warn!("File {} not found, proceeding to next file", file_path);

我不会在软件的上下文中考虑错误,但我仍然希望我的用户知道。

但是,Rust的日志记录系统默认只打印ERROR日志级别的消息,我发现更改此默认值的唯一方法是设置RUST_LOG环境变量 - 我不知道我希望我的用户不得不这样做。我想我可以创建一个包装器脚本,只设置变量和exec s程序,但我宁愿不这样做。

有没有办法从程序内部以编程方式更改默认级别?

4 个答案:

答案 0 :(得分:3)

不,这是不可能的。只需浏览liblog库的代码,您就可以看到所有日志级别配置都存储在全局变量中,这些变量只使用Once原语修改一次,并且无法修改此配置。 / p>

Rust记录非常简单;如果你想要更复杂的东西,你必须自己做。 liblog提供了一个扩展点,一个名为Logger的特征,它可能会用于您的目的。

答案 1 :(得分:2)

以下是我认为您正在寻找的example

#[macro_use]
extern crate log;
use log::{LogRecord, LogLevel, LogMetadata, LogLevelFilter, SetLoggerError};

struct SimpleLogger;

impl log::Log for SimpleLogger {
    fn enabled(&self, metadata: &LogMetadata) -> bool {
        metadata.level() <= LogLevel::Warn
    }

    fn log(&self, record: &LogRecord) {
        if self.enabled(record.metadata()) {
            // I can probably change colors here
            println!("{} - {}", record.level(), record.args());
        }
    }
}

pub fn init() -> Result<(), SetLoggerError> {
    log::set_logger(|max_log_level| {
        max_log_level.set(LogLevelFilter::Warn);
        Box::new(SimpleLogger)
    })
}

fn main() {

    init(); // probably should do something better here

    info!("I am info");
    warn!("I am warn");
    error!("I am error");
}

答案 2 :(得分:0)

感谢Vladimir's answer,我挖掘了liblog来源,并最终找到了一种hacky(可能是性感)的方式:

fn main() {
    use std::os;
    os::setenv("RUST_LOG", "warn");
}

如果在任何日志记录之前完成此操作,则日志系统将被设置为好像是从外部设置的。

答案 3 :(得分:0)

这里有个窍门

if env::var("RUST_LOG").is_err() {
    env::set_var("RUST_LOG", "info")
}
env_logger::init();