Rust中如何使用log4rs日誌?

banq發表於2022-03-25

使用 log4rs 進行高階日誌記錄:輪換、保留、模式、多個記錄器?
我們的任務是為 rust 中的交易機器人實現日誌記錄。我們有幾種交易策略,並希望有單獨的記錄器和單獨的檔案。我們希望對檔案進行輪換,以便當檔案大小達到特定點時,會建立一個新檔案。此外,我們希望將舊檔案壓縮然後刪除以節省記憶體並避免記憶體不足。

為了實現這一切,我們將使用loglog4rs crates。Log4rs 理解我們需要的一切。我們只需要設定適當的配置。此配置可以透過以下兩種方式之一完成:透過YAML 檔案或以程式設計方式。
對於我們的任務,我們將選擇 YAML 檔案。如果您需要更多動態,使用庫實體和方法編寫等效程式碼非常簡單。我將在文章末尾分享我們案例的此類程式碼。


日誌輸出單獨的日誌檔案
要將我們的日誌訊息轉發到不同的檔案,我們必須定義單獨的記錄器並將每個記錄器繫結到特定的字串。日誌箱有多個宏,例如error!()、warn!()、info!()、debug!()和trace!()。
當您呼叫這樣的宏來記錄訊息時,該宏應該設定當前日誌事件的特定記錄器。預設情況下,宏檢查為呼叫此宏的當前模組設定的記錄器,然後宏將此記錄器繫結到當前日誌事件。
讓我們看一下示例以瞭解其含義。假設我們有一個名為test_crate的箱子。在這個箱子裡,我們有一個帶有函式func_in_test_module()的模組

mod test_module {
    use log::error;

    fn func_in_test_module() {
        error!("An error occurred!");
    }
}


當我們呼叫error!()宏時,它會將記錄器設定為“test_crate::test_module”。如果我們用這樣的名稱定義我們的自定義記錄器,它將用於當前的日誌事件。
對於某些情況,這種方法可能是合適的,但對於其他情況,我們希望有更大的靈活性。因此,或者我們可以顯式地為log 宏提供目標值:

mod test_module {
    use log::error;

    fn func_in_test_module() {
        error!(target: "foo", "An error occurred!");
    }
}


因此,我們應該使用名稱“foo”定義記錄器,它將繫結到當前日誌事件。
現在我們可以動態地決定為特定的日誌宏呼叫使用什麼記錄器,併為記錄器指定我們想要的任何名稱。
 
更多點選標題

相關文章