我正在开发Rust中的一个项目,该项目旨在由系统管理员通过CLI使用。 在这个程序中,我希望有这样的行:
warn!("File {} not found, proceeding to next file", file_path);
我不会在软件的上下文中考虑错误,但我仍然希望我的用户知道。
但是,Rust的日志记录系统默认只打印ERROR
日志级别的消息,我发现更改此默认值的唯一方法是设置RUST_LOG
环境变量 - 我不知道我希望我的用户不得不这样做。我想我可以创建一个包装器脚本,只设置变量和exec
s程序,但我宁愿不这样做。
有没有办法从程序内部以编程方式更改默认级别?
答案 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();