[英]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.