RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Rust的Log日志庫(kù)介紹

科技綠洲 ? 來(lái)源:TinyZ ? 作者:TinyZ ? 2023-09-19 14:49 ? 次閱讀

Rust是一門系統(tǒng)級(jí)編程語(yǔ)言,因其安全性、高性能和并發(fā)性而備受歡迎。在Rust應(yīng)用程序中,日志記錄是一項(xiàng)非常重要的任務(wù),因?yàn)樗梢詭椭_(kāi)發(fā)人員了解應(yīng)用程序的運(yùn)行情況并解決問(wèn)題。Rust的Log庫(kù)提供了一種簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)日志記錄,本文將介紹如何使用Rust的Log庫(kù)作為日志門面,并結(jié)合env_logger和log4rs兩個(gè)日志庫(kù)的實(shí)戰(zhàn)用例進(jìn)行深入探討。

Rust的Log庫(kù)

Rust的Log庫(kù)是一個(gè)輕量級(jí)的日志記錄框架,它提供了一個(gè)簡(jiǎn)單的API,可以方便地記錄日志。Log庫(kù)允許您將日志消息發(fā)送到控制臺(tái)、文件或任何其他自定義目標(biāo)。Log庫(kù)還提供了一些有用的功能,如日志級(jí)別、日志過(guò)濾器和日志格式化。

類似于Java語(yǔ)言中的Slf4j日志庫(kù),可以零開(kāi)銷的幫助開(kāi)發(fā)者切換底層依賴的日志庫(kù)實(shí)現(xiàn)。

引入Log庫(kù)依賴

在本系列教程的Cargo篇,我們提到了管理依賴,我們就引入過(guò)log庫(kù),這里回顧一下。在Cargo.toml文件中添加以下依賴項(xiàng), 引入Rust的Log庫(kù)依賴,具體配置如下:

[dependencies]
log = "0.4.0"
##    引入env_logger庫(kù)
env_logger = "0.9.0"

使用Log庫(kù)

在使用Rust的Log庫(kù)之前,您需要初始化日志記錄系統(tǒng)。這可以通過(guò)調(diào)用 log::set_logger() 函數(shù)來(lái)完成,該函數(shù)將日志記錄器注冊(cè)到全局日志記錄器中。 下面是通過(guò)簡(jiǎn)單的示例:

use log::{info, LevelFilter};
use std::io::Write;

fn main() {
    //    使用env_logger日志庫(kù),詳細(xì)的時(shí)候后續(xù)會(huì)深入講解
    env_logger::init();

    log::set_logger(&LOGGER).unwrap();
    log::set_max_level(LevelFilter::Info);

    info!("Hello, world!");
}

在這個(gè)示例中,我們使用了 env_logger 庫(kù)來(lái)初始化日志記錄系統(tǒng)。 env_logger 庫(kù)是一個(gè)流行的Rust日志記錄庫(kù),它提供了一個(gè)簡(jiǎn)單的方法來(lái)配置日志記錄器。在這個(gè)示例中,我們將日志記錄器注冊(cè)到全局日志記錄器中,并設(shè)置日志級(jí)別為 info 。最后,我們使用 info!() 宏來(lái)記錄日志消息。

日志級(jí)別

Rust的Log庫(kù)提供了五個(gè)日志級(jí)別,從最高到最低分別是:

  • ? Error
  • ? Warn
  • ? Info
  • ? Debug
  • ? Trace

默認(rèn)情況下,Log庫(kù)將記錄所有級(jí)別的日志消息。您可以通過(guò)調(diào)用 log::set_max_level() 函數(shù)來(lái)設(shè)置日志級(jí)別的閾值。例如,如果您只想記錄 warn 級(jí)別及以上的日志消息,可以使用以下代碼:

log::set_max_level(LevelFilter::Warn);

日志過(guò)濾器

Rust的Log庫(kù)還提供了一種過(guò)濾器機(jī)制,可以根據(jù)日志記錄器的名稱和日志級(jí)別來(lái)過(guò)濾日志消息。過(guò)濾器可以通過(guò)調(diào)用 log::set_logger() 函數(shù)時(shí)傳遞給日志記錄器。例如,如果您只想記錄名為 myapp::database 的記錄器的 info 級(jí)別及以上的日志消息,可以使用以下代碼:

use log::{info, LevelFilter};
use std::io::Write;

fn main() {
    env_logger::init();

    let filter = log::FilterBuilder::new()
        .target("myapp::database")
        .level(LevelFilter::Info)
        .build();

    log::set_logger(&LOGGER).unwrap();
    log::set_max_level(LevelFilter::Info);

    info!("Hello, world!");
}

在這個(gè)示例中,我們使用了 log::FilterBuilder 來(lái)創(chuàng)建一個(gè)過(guò)濾器,該過(guò)濾器將僅記錄名為 myapp::database 的記錄器的 info 級(jí)別及以上的日志消息。

日志格式化

Rust的Log庫(kù)允許您自定義日志消息的格式。默認(rèn)情況下,Log庫(kù)將使用 {level} {message} 格式化日志消息。您可以通過(guò)調(diào)用 log::set_logger() 函數(shù)時(shí)傳遞一個(gè)自定義的格式字符串來(lái)自定義日志消息的格式。例如,以下代碼將使用自定義的格式字符串來(lái)格式化日志消息:

use log::{info, LevelFilter};
use std::io::Write;

fn main() {
    env_logger::init();

    let format = log::FormatBuilder::new()
        .format(|buf, record| {
            writeln!(buf, "{} [{}] - {}", chrono::Local::now().format("%Y-%m-%d %H:%M:%S"), record.level(), record.args())
        })
        .build();

    log::set_logger(&LOGGER).unwrap();
    log::set_max_level(LevelFilter::Info);

    info!("Hello, world!");
}

在這個(gè)示例中,我們使用了 log::FormatBuilder 來(lái)創(chuàng)建一個(gè)自定義的格式化程序,該程序?qū)⒃谌罩鞠⒅邪瑫r(shí)間戳。我們將自定義的格式化程序傳遞給 log::set_logger() 函數(shù),以便在記錄日志消息時(shí)使用它。

log4rs庫(kù)

log4rs是一個(gè)強(qiáng)大的日志記錄庫(kù),它提供了許多高級(jí)功能,如多個(gè)日志記錄器、多個(gè)輸出目標(biāo)和靈活的日志過(guò)濾器。log4rs庫(kù)是基于Rust的Log庫(kù)構(gòu)建的,因此您可以使用Rust的Log庫(kù)的所有功能以及l(fā)og4rs庫(kù)的高級(jí)功能。

ps:假如你曾經(jīng)接觸過(guò)log4j, 那么你會(huì)發(fā)現(xiàn)log4rs很多概念和設(shè)計(jì)都和log4j相似。

引入log4rs依賴

要使用log4rs庫(kù),您需要在Cargo.toml文件中添加以下依賴項(xiàng):

[dependencies]
log4rs = "1.2.0"

配置yaml

log4rs庫(kù)使用YAML或JSON格式的配置文件來(lái)配置日志記錄器。以下是一個(gè)簡(jiǎn)單的log4rs配置文件示例:

refresh_rate: 30 seconds

appenders:
  stdout:
    kind: console
    encoder:
      pattern: "ff9zflr [{l}] - {m}n"
  file:
    kind: file
    path: "logs/myapp.log"
    encoder:
      pattern: "wjq028k [{l}] - {m}n"

root:
  level: info
  appenders:
    - stdout
    - file

loggers:
  myapp::database:
    level: info
    appenders:
      - file

在這個(gè)示例中,我們定義了兩個(gè)輸出目標(biāo):一個(gè)是控制臺(tái),另一個(gè)是文件。我們還定義了一個(gè)名為 myapp::database 的記錄器,它將日志消息發(fā)送到文件輸出目標(biāo)。最后,我們將根記錄器配置為將日志消息發(fā)送到控制臺(tái)和文件輸出目標(biāo)。

使用log4rs庫(kù)

要使用log4rs庫(kù),您需要在應(yīng)用程序中初始化日志記錄器。以下是一個(gè)簡(jiǎn)單的示例:

use log::{info, LevelFilter};
use log4rs::config::{Config, ConfigHandle};

fn main() {
    let config: Config = log4rs::load_config_file("log4rs.yaml", Default::default()).unwrap();
    let handle: ConfigHandle = log4rs::init_config(config).unwrap();

    info!("Hello, world!");
}

在這個(gè)示例中,我們使用 log4rs::load_config_file() 函數(shù)從文件中加載配置文件。然后,我們使用 log4rs::init_config() 函數(shù)初始化日志記錄器。最后,我們使用 info!() 宏來(lái)記錄日志消息。

log4rs日志過(guò)濾器

log4rs庫(kù)提供了靈活的過(guò)濾器機(jī)制,可以根據(jù)記錄器的名稱、級(jí)別和其他屬性來(lái)過(guò)濾日志消息。以下是一個(gè)示例配置文件,其中定義了一個(gè)過(guò)濾器,該過(guò)濾器將僅記錄名為 myapp::database 的記錄器的 info 級(jí)別及以上的日志消息:

appenders:
  stdout:
    kind: console
    encoder:
      pattern: "ojwz34s [{l}] - {m}n"
  file:
    kind: file
    path: "logs/myapp.log"
    encoder:
      pattern: "5613xd7 [{l}] - {m}n"

root:
  level: info
  appenders:
    - stdout
    - file

loggers:
  myapp::database:
    level: info
    appenders:
      - file
    filters:
      - kind: threshold
        level: info

在這個(gè)示例中,我們定義了一個(gè)過(guò)濾器,該過(guò)濾器將僅記錄名為 myapp::database 的記錄器的 info 級(jí)別及以上的日志消息。

log4rs日志格式化

log4rs庫(kù)允許您自定義日志消息的格式。您可以通過(guò)在配置文件中設(shè)置輸出目標(biāo)的 encoder.pattern 屬性來(lái)自定義日志消息的格式。例如,以下配置將使用自定義的格式字符串來(lái)格式化日志消息:

appenders:
  stdout:
    kind: console
    encoder:
      pattern: "xzp1bqn [{l}] - {m}n"
  file:
    kind: file
    path: "logs/myapp.log"
    encoder:
      pattern: "btynuod [{l}] - {m}n"

在這個(gè)示例中,我們?cè)谳敵瞿繕?biāo)的 encoder.pattern 屬性中使用了自定義的格式字符串。

擴(kuò)展閱讀 - tracing

一般來(lái)說(shuō),env_logger和log4rs已經(jīng)能夠滿足絕大部門開(kāi)發(fā)者的日志需求。但是在分布式應(yīng)用,異步編程領(lǐng)域,log4rs輸出的日志由于沒(méi)有上下文環(huán)境信息,異步錯(cuò)落的日志輸出,讓我們排查問(wèn)題變得很痛苦,這種情況下,log4rs就顯得不太夠?qū)I(yè)了,而tracing恰恰就有了用武之地。

不過(guò)鑒于tracing日志庫(kù)是一個(gè)非常龐雜的日志庫(kù),要講透整個(gè)知識(shí)點(diǎn)需要先掌握分布式日志,鏈路追蹤等等一些列的基礎(chǔ)知識(shí),所以博主先在這里提一句,挖個(gè)坑,后續(xù)針對(duì)tracing專門開(kāi)一篇教程講解。

總結(jié)

Rust的Log庫(kù)和log4rs庫(kù)都是非常有用的日志記錄庫(kù),它們提供了許多功能,可以幫助開(kāi)發(fā)人員了解應(yīng)用程序的運(yùn)行情況并解決問(wèn)題。Rust的Log庫(kù)是一個(gè)輕量級(jí)的日志記錄框架,它提供了一個(gè)簡(jiǎn)單的API,可以方便地記錄日志。Log庫(kù)允許您將日志消息發(fā)送到控制臺(tái)、文件或任何其他自定義目標(biāo)。Log庫(kù)還提供了一些有用的功能,如日志級(jí)別、日志過(guò)濾器和日志格式化。log4rs庫(kù)是一個(gè)強(qiáng)大的日志記錄庫(kù),它提供了許多高級(jí)功能,如多個(gè)日志記錄器、多個(gè)輸出目標(biāo)和靈活的日志過(guò)濾器。log4rs庫(kù)是基于Rust的Log庫(kù)構(gòu)建的,因此您可以使用Rust的Log庫(kù)的所有功能以及l(fā)og4rs庫(kù)的高級(jí)功能。

使用Rust的Log庫(kù)和log4rs庫(kù)可以幫助您更好地了解應(yīng)用程序的運(yùn)行情況,更快地解決問(wèn)題,并提高應(yīng)用程序的可靠性和可維護(hù)性。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1942

    瀏覽量

    34706
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3265

    瀏覽量

    57677
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    10639
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6598
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用Rust的標(biāo)準(zhǔn)庫(kù)和structopt庫(kù)來(lái)處理控制臺(tái)參數(shù)

    Rust是一種安全、高效的系統(tǒng)編程語(yǔ)言,其標(biāo)準(zhǔn)庫(kù)以及外部庫(kù)提供了很多處理控制臺(tái)參數(shù)的方式。在本篇文章中,我們將分別介紹如何使用Rust的標(biāo)準(zhǔn)
    的頭像 發(fā)表于 09-20 11:13 ?1324次閱讀

    logcat如何查看Andriod log系統(tǒng)日志?

    logcat會(huì)輸出系統(tǒng)哪些信息呢?如何學(xué)習(xí)logcat命令?logcat如何查看Andriod log系統(tǒng)日志?如何查看Andriod log系統(tǒng)日志
    發(fā)表于 03-03 06:15

    Rust代碼中加載靜態(tài)庫(kù)時(shí),出現(xiàn)錯(cuò)誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?

    “ [i]malloc ”、“ [i]exit ”。我驗(yàn)證了使用 ` [i]nm ` 命令。 問(wèn)題是我打算使用 ffi 在 rust 中使用這個(gè)靜態(tài)庫(kù)。當(dāng)我嘗試在我的 Rust 代碼中加載靜態(tài)
    發(fā)表于 06-09 08:44

    推薦3個(gè)非常不錯(cuò)的開(kāi)源日志庫(kù)

    除了常用的log4c,log4cpp,下面給大家推薦3個(gè)非常不錯(cuò)的開(kāi)源日志庫(kù),比較適合用在單片機(jī)的項(xiàng)目中。從開(kāi)始的輕量,到后面的功能豐富,最后一個(gè)很強(qiáng)大,所以請(qǐng)耐心看到最后。
    的頭像 發(fā)表于 05-12 14:51 ?5123次閱讀

    詳解MySQL三大日志的作用

    MySQL日志 主要包括錯(cuò)誤日志、查詢日志、慢查詢日志、事務(wù)日志、二進(jìn)制日志幾大類。其中,比較重
    的頭像 發(fā)表于 07-22 14:44 ?1331次閱讀

    log4j日志框架分析

    og4j是Apache下的一款開(kāi)源的日志框架,能夠滿足我們?cè)陧?xiàng)目中對(duì)于日志記錄的需求。log4j提供了簡(jiǎn)單的API調(diào)用,強(qiáng)大的日志格式定義以及靈活的擴(kuò)展性。使用者可以自己定義Appen
    的頭像 發(fā)表于 02-28 14:32 ?1113次閱讀
    <b class='flag-5'>log</b>4j<b class='flag-5'>日志</b>框架分析

    針對(duì)大量log日志快速定位錯(cuò)誤地方

    用 grep 拿到的日志很少,我們需要查看附近的日志。我是這樣做的,首先: cat -n test.log | grep “關(guān)鍵詞” 得到關(guān)鍵日志的行號(hào)
    的頭像 發(fā)表于 04-21 09:22 ?702次閱讀

    C#上位機(jī)開(kāi)發(fā)(十三)之使用Log4net添加日志記錄功能

    一、Log4net 官方網(wǎng)站: 。 下載二進(jìn)制dll庫(kù):包中提供了針對(duì)各個(gè)版本的dll庫(kù): 二、使用日志庫(kù) 1. 添加
    發(fā)表于 05-29 16:25 ?1次下載
    C#上位機(jī)開(kāi)發(fā)(十三)之使用<b class='flag-5'>Log</b>4net添加<b class='flag-5'>日志</b>記錄功能

    服務(wù)器log日志大,掌握這些可正確快速定位錯(cuò)誤!

    針對(duì)大量log日志快速定位錯(cuò)誤地方
    的頭像 發(fā)表于 06-05 18:14 ?630次閱讀

    MySQL三種日志講解

    MySQL 日志包含了錯(cuò)誤日志、查詢日志、慢查詢日志、事務(wù)日志、二進(jìn)制日志等,如果存儲(chǔ)引擎使用的
    的頭像 發(fā)表于 07-25 11:15 ?734次閱讀
    MySQL三種<b class='flag-5'>日志</b>講解

    Log4cpp優(yōu)勢(shì)及優(yōu)點(diǎn)

    1、log4cpp概述 Log4cpp是一個(gè)開(kāi)源的C++類庫(kù),它提供了C++程序中使用日志和跟蹤調(diào)試的功能,它的優(yōu)點(diǎn)如下: 提供應(yīng)用程序運(yùn)行上下文,方便跟蹤調(diào)試; 可擴(kuò)展的、多種方式記
    的頭像 發(fā)表于 11-09 14:27 ?692次閱讀
    <b class='flag-5'>Log</b>4cpp優(yōu)勢(shì)及優(yōu)點(diǎn)

    Android開(kāi)發(fā)中的日志接口介紹

    1、日志接口 日志接口內(nèi)容,共分為java層、native層、kernel層等。下面就對(duì)每個(gè)層級(jí)的內(nèi)容分別進(jìn)行介紹。 1.1 java層調(diào)用接口 日志級(jí)別分別為VERBOSE、DEBU
    的頭像 發(fā)表于 11-23 16:27 ?1099次閱讀
    Android開(kāi)發(fā)中的<b class='flag-5'>日志</b>接口<b class='flag-5'>介紹</b>

    聊聊日志即數(shù)據(jù)庫(kù)

    《數(shù)據(jù)庫(kù)故障恢復(fù)機(jī)制的前世今生》[1]一文中介紹過(guò),由于磁盤的的順序訪問(wèn)性能遠(yuǎn)好于隨機(jī)訪問(wèn),數(shù)據(jù)庫(kù)設(shè)計(jì)中通常都會(huì)采用WAL的方式,將隨機(jī)訪問(wèn)的數(shù)據(jù)庫(kù)請(qǐng)求轉(zhuǎn)換為順序的
    的頭像 發(fā)表于 12-06 09:30 ?703次閱讀
    聊聊<b class='flag-5'>日志</b>即數(shù)據(jù)<b class='flag-5'>庫(kù)</b>

    oracle數(shù)據(jù)庫(kù)alert日志作用

    Oracle數(shù)據(jù)庫(kù)的alert日志是數(shù)據(jù)庫(kù)引擎和實(shí)例的核心組件之一,它記錄著數(shù)據(jù)庫(kù)的運(yùn)行狀況和事件。該日志對(duì)于數(shù)據(jù)
    的頭像 發(fā)表于 12-06 10:08 ?1232次閱讀

    nginx日志配置方法

    access_log用來(lái)定義日志級(jí)別,日志位置。
    的頭像 發(fā)表于 10-24 17:43 ?222次閱讀
    RM新时代网站-首页