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

时间:2015-12-30 22:43:59

标签: logging rust rust-cargo

我不想在运行时依赖环境变量,而是编译一个完全剥离出非错误日志消息的调试版或发行版。

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

1 个答案:

答案 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`
$

对于一些社论,我不同意这样做。当某些事情发生时,那时你大多数想要记录某些东西的能力。在大多数情况下,我不认为检查布尔值的成本是否足够昂贵以保证这一点。我也怀疑在大多数情况下你会有兆字节的文字。

总有例外 - 也许您需要在紧密循环中记录某些内容,或者您​​必须编译以适应空间有限的微控制器。

请注意,我没有尝试使用“发布”版本的概念来结合日志消息。我保证有时您会希望使用这些消息进行发布构建,因此最好将这两个想法正确化。