簡體   English   中英

是否可以在編譯時更改應用程序的日志級別?

[英]Is it possible to change the log level for an application at compile time?

我不想在運行時依賴環境變量,而是編譯一個完全剝離出非錯誤日志消息的調試版或發行版。

是否可以在Cargo.toml或通過cargo / rustc命令行參數更改應用程序的日志級別?

我不相信日志包具有完全內置的請求功能。

一種方法可以靜態設置日志記錄級別 如果您使用任何這些貨物功能編譯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_ off以獲得相同的功能。

優化器可能會看到此靜態值並刪除不可能的代碼。 如果發生這種情況,那么你應該好好去!

如果您想絕對確定 ,可以通過使用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`
$

對於一些社論,我不同意這樣做。 當某些事情發生時,那就是你想要記錄某事的能力。 在大多數情況下,我不認為檢查布爾值的成本是否足夠昂貴以保證這一點。 我也懷疑在大多數情況下你會有兆字節的文字。

總有例外 - 也許您需要在緊密循環中記錄某些內容,或者您​​必須編譯以適應空間有限的微控制器。

請注意,我沒有嘗試使用“發布”版本的概念來結合日志消息。 我保證有時您會希望使用這些消息進行發布構建,因此最好將這兩個概念正交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM