Rust 日誌和跟蹤

作爲開發人員,我們必須處理軟件中發生的錯誤、警告、bug 和事件,因此,通過監控和記錄重要日誌來理解軟件的結構和行爲,從而有效地收集足夠的數據,可以幫助我們更快地找到根本原因。

有時,日誌和跟蹤這兩個術語可以互換使用,但它們並不完全相同。我們將學習如何在 Rust 應用程序中使用 tracing crate 集成日誌和跟蹤,它們是每個軟件不可或缺的一部分。

日誌

假設你設計了一個由超過 50,000 名用戶使用的應用程序,但是它在生產中突然停止工作。你如何知道發生了什麼?如果你在你的應用中放置了一段代碼來記錄錯誤或警告的發生,你就可以很容易地查看這些數據 (日誌文件),並找出在應用停止工作或經歷停機前記錄了些什麼信息,這將幫助你更快地找到問題的原因。

在 Rust 生態系統中,集成日誌的工具是 log crate。它提供了一個抽象的 API,其他庫負責實現日誌記錄。其他庫可以以任何他們想要的方式實現日誌記錄,統一使用標準的日誌記錄級別 (在 Rust 中作爲宏實現)。

以下是通過標準宏定義的不同日誌級別:

use log::{ info, warn, error, debug, };

debug!("Something weird occured: {}", someDebugVariable);
error!("{}""And error occured");
info!("{:?}""Take note");
warn!("{:#?}""This is important");

讓我們使用它的一個實現 (你可以在文檔中找到更多),env_logger 庫。它允許你使用環境變量來配置日誌,像這樣:

RUST_LOG=info cargo run

首先在你的 Cargo.toml 文件中加入依賴:

[dependencies]
env_logger = "0.9.0"
log = "0.4.16"

接下來,在要添加日誌記錄的文件中導入 log 及其日誌級別宏。對於這個例子,我們將把它放在 main.rs 文件中:

然後,在使用宏之前需要初始化 env_logger,如下所示:

use log::{ info, error, debug, warn };
fn main() {
    env_logger::init();
    error!("{}""And error occured");
    warn!("{:#?}""This is important");
    info!("{:?}""Take note");
    debug!("Something weird occured: {}""Error");
}

error 日誌級別是默認日誌級別,並且是日誌級別層次結構中的最高級別。

跟蹤

跟蹤包括在執行過程中從頭到尾監視代碼邏輯流。特別是當你正在設計一個大型應用程序,其中有太多的東西可能會出錯,調試可能是一件痛苦的事情。跟蹤爲你提供了活躍代碼的系統視圖。

Rust 的 tracing 庫爲開發者提供了一個全面的框架,它允許你從你的 Rust 程序中收集結構化的、基於事件的診斷信息。

代碼跟蹤包括三個不同的階段:

  1. 在應用程序源代碼中添加跟蹤代碼

  2. 在程序執行期間,跟蹤事件被寫入跟蹤系統以進行分析

  3. 分析和評估跟蹤系統收集的信息以發現和理解應用程序中的問題

就像 log 一樣,Rust trace 提供了一個健壯的 API,它允許庫開發人員實現收集跟蹤數據所需的功能。

讓我們以 trace-subscriber 庫爲例,看看如何將跟蹤集成到 Rust 應用中。將 trace-subscriber 添加到依賴列表中,請確保將 tracing 也添加爲依賴項。

[dependencies]
tracing = "0.1.34"
tracing-subscriber = "0.3.11"

接下來,在你的 main.rs 文件中導入跟蹤及其日誌級別:

use tracing::{info, error, Level};
use tracing_subscriber::FmtSubscriber;

fn main() {
    let subscriber = FmtSubscriber::builder()
        .with_max_level(Level::TRACE)
        .finish();
    tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");
    let number_of_teams: i32 = 3;
    info!(number_of_teams, "We've got {} teams!", number_of_teams);
}

在上面的代碼中,我們構建了一個訂閱者,該訂閱者用於記錄跟蹤的事件,並進行格式化表示。而且級別設置爲 TRACE,該級別可以捕獲關於應用程序行爲的所有細節,並啓用 error、warning、info 和 debug 級別。

你可以結合 opentelemetry-prometheus 庫將 tracing 的記錄發給 prometheus ,進行可視化分析。

總結

沒有一個軟件是完美的,你應該設置日誌記錄和跟蹤,以幫助監控應用程序,跟蹤錯誤,並在用戶對你大吼大叫之前修復它們。

本文翻譯自:

https://blog.logrocket.com/comparing-logging-tracing-rust/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/WRFUmvUXTgW5D_Ubgz5CTg