我不想在运行时依赖环境变量,而是编译一个完全剥离出非错误日志消息的调试版或发行版。
是否可以在Cargo.toml
或通过cargo
/ rustc
命令行参数更改应用程序的日志级别?
答案 0 :(得分:3)
我不相信日志包已经完全内置所请求的功能。
有a way to statically set the logging level。如果您使用任何这些货物功能编译log
包,那么日志级别将限制在该点:
release_max_level_off
release_max_level_error
release_max_level_warn
release_max_level_info
release_max_level_debug
release_max_level_trace
您可以在非发布版本中删除release_
以获取相同的功能。
优化器可能会看到此静态值并删除不可能的代码。如果发生这种情况,那么你应该好好去!
如果你想绝对肯定,你可以通过使用Cargo功能创建自己的条件编辑来近似它。这是一个简单的例子,它将打印一个值与否,具体取决于该功能是否已启用:
#[cfg(not(feature = "slim"))]
macro_rules! my_info {
($x: expr) => { println!("{:?}", $x) }
}
#[cfg(feature = "slim")]
macro_rules! my_info {
($x: expr) => { }
}
fn main() {
my_info!("Hello, world!");
}
这在Cargo.toml
:
[features]
slim = []
编译/运行程序时,您可以选择有哪些功能:
$ cargo run
Running `target/debug/log`
"Hello, world!"
$ cargo run --features=slim
Running `target/debug/log`
$
然后只需将记录器宏包装在您自己的有条件编译的宏中:
#[cfg(not(feature = "slim"))]
macro_rules! my_info {
($($arg: tt)*) => { info!($($arg)*) }
}
#[cfg(feature = "slim")]
macro_rules! my_info {
($($arg: tt)*) => { }
}
运行收益率:
$ RUST_LOG=info cargo run
Running `target/debug/log`
INFO:log: Hello, world!
$ RUST_LOG=info cargo run --features=slim
Running `target/debug/log`
$
对于一些社论,我不同意这样做。当某些事情发生时,那时你大多数想要记录某些东西的能力。在大多数情况下,我不认为检查布尔值的成本是否足够昂贵以保证这一点。我也怀疑在大多数情况下你会有兆字节的文字。
总有例外 - 也许您需要在紧密循环中记录某些内容,或者您必须编译以适应空间有限的微控制器。
请注意,我没有尝试使用“发布”版本的概念来结合日志消息。我保证有时您会希望使用这些消息进行发布构建,因此最好将这两个想法正确化。