我希望在编译调试或发行版本时,不依赖于运行时的环境变量,并完全剥离非错误日志消息。
是否可以通过Cargo.toml
或通过cargo
/rustc
命令行参数改变应用程序的日志级别?
我希望在编译调试或发行版本时,不依赖于运行时的环境变量,并完全剥离非错误日志消息。
是否可以通过Cargo.toml
或通过cargo
/rustc
命令行参数改变应用程序的日志级别?
我不相信log crate恰好内置了所请求的功能。
有一种静态设置记录级别的方法。如果你使用任何这些Cargo特性编译log crate,则日志级别将在那个点上被限制:
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`
$
就编辑而言,我不同意这样做。当出现故障时,您最希望能够记录某些内容。在大多数情况下,我认为检查布尔值的成本不足以保证这一点。我还怀疑,在大多数情况下,您不会有几兆字节的文本。
总会有例外情况 - 也许您需要在紧密循环中记录某些内容,或者您必须编译以适应具有有限空间的微控制器。
请注意,我没有尝试将剥离日志消息与“发布”构建的概念耦合在一起。我保证,有时您会希望使用这些消息进行发布构建,因此最好使这两个想法正交。
env_logger
的文档(http://rust-lang-nursery.github.io/log/env_logger/),你会发现你可以为不同的模块启用不同的日志级别(`RUST_LOG=module1=level,module2=level`),这样你就可以为你感兴趣的一个模块启用 info 日志,甚至是特定的打印!我还更新了答案,加入了我在源代码挖掘中发现的一些东西,这可能已经足够好了。 - ShepmasterRUST_LOG=my_module=info ./application1; RUST_LOG=my_module=error ./application2
。日志模块/级别设置是每个运行实例的。 - Shepmaster
str
字面量到内存中,那么性能上也会有(非常微小的)提升。 - Peter Hall