gpt4 book ai didi

logging - 是否可以在编译时更改应用程序的日志级别?

转载 作者:行者123 更新时间:2023-11-29 07:51:26 25 4
gpt4 key购买 nike

我不想在运行时依赖环境变量,而是希望编译一个调试或发布版本,并完全去除非错误日志消息。

是否可以在 Cargo.toml 中或通过 cargo/rustc 命令行参数更改应用程序的日志级别?

最佳答案

我不认为 log crate 具有完全内置的请求功能。

a way to statically set the logging level .如果您使用这些 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)*) => { }
}

运行 yield :

$ RUST_LOG=info cargo run
Running `target/debug/log`
INFO:log: Hello, world!
$ RUST_LOG=info cargo run --features=slim
Running `target/debug/log`
$

对于一些社论,我不同意这样做。当出现问题时,就是您想要记录某些内容的能力的时候。在大多数情况下,我认为 bool 值检查的成本不会高到足以保证这样做。我也怀疑在大多数情况下您会拥有数兆字节的文本。

总有异常(exception)——也许您需要在一个紧密的循环中记录一些东西,或者您必须编译以适应空间有限的微 Controller 。

请注意,我没有尝试将删除日志消息与“发布”构建的概念结合起来。我保证有时您会想要包含这些消息的发布版本,因此最好让这两个想法相互正交。

关于logging - 是否可以在编译时更改应用程序的日志级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34538397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com