使用Rust实现日志记录功能

 更新时间:2024年04月02日 08:49:20   作者:二次元攻城狮  
这篇文章主要为大家详细介绍了使用Rust实现日志记录功能的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的可以参考一下

log 日志库标准

log 是 Rust 的日志门面库,由官方积极维护可以放心使用。它是Rust的日志门面,相应的日志 API 已成为事实上的标准被其它日志框架所使用,有了日志门面开发者可以很方便切换自己的日志框架。

简单示例

创建一个名为 log_test 二进制项目:

cargo new log_test

执行以下命令,引入 log 依赖:

cargo add log

修改 main.rs 的代码如下:

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

fn main() {
    // 记录日志
    info!("This is an info message");
    warn!("This is a warning message");
    error!("This is an error message");
    trace!("This is an trace message");
}

运行上面的示例,实际上看不到任何输出。因为 log 仅仅是日志门面库,它并不具备完整的日志库功能

使用方法

因为 log 仅仅是日志门面库,对于库和应用的开发者来说使用方法是有区别的,这也是 log 包这么设计的优势所在。

库的开发者

作为库的开发者,你只要在库中使用门面库即可,将具体的日志库交给用户去选择和绑定:

use log::{info, trace, warn};
pub fn deal_with_something() {
    // 开始处理

    // 记录一些日志
    trace!("a trace log");
    info!("a info long: {}", "abc");
    warn!("a warning log: {}, retrying", err);

    // 结束处理
}

应用开发者

如果是应用开发者,就需要去选择一个具体的日志库了。

目前已经有了不少日志库实现,官方在 github 上也推荐了一些 ,主要分为以下几类:

  • 简单的最小记录器,如 env_logger 等
  • 复杂的可配置框架,如 log4rs 等
  • 其他设施的适配器,如 syslog、db_logger 等
  • 对于 WebAssembly 二进制文件:console_log
  • 对于动态库:需要在日志上构造一个 FFI 安全包装器,以便在库中进行初始化。
  • 实用程序,如 alterable_logger 等

log 还提供了 set_logger 函数用于设置日志库,set_max_level 用于设置最大日志级别。但是选用的具体日志库往往会提供更高级的 API,无需手动调用这两个函数。

日志库开发者

对于日志库开发者而言,自然要实现自己的 Log 特征:

use log::{Record, Level, Metadata};
struct SimpleLogger;
impl log::Log for SimpleLogger {
    fn enabled(&self, metadata: &Metadata) -> bool {
        metadata.level() <= Level::Info
    }
    fn log(&self, record: &Record) {
        if self.enabled(record.metadata()) {
            println!("{} - {}", record.level(), record.args());
        }
    }
    fn flush(&self) {}
}

除此之外,还需要包装下 set_logger 和 set_max_level:

use log::{SetLoggerError, LevelFilter};
static LOGGER: SimpleLogger = SimpleLogger;
pub fn init() -> Result<(), SetLoggerError> {
    log::set_logger(&LOGGER)
        .map(|()| log::set_max_level(LevelFilter::Info))
}

然后再main函数里面设置全局记录器:

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

fn main() {
    //设置日志
    init();
    // 记录日志
    info!("This is an info message");
    warn!("This is a warning message");
    error!("This is an error message");
    trace!("This is an trace message");
}

运行后终端输出如下,因为设置日志等级为Info,所以没有输出Trace等级日志:

INFO - This is an info message
WARN - This is a warning message
ERROR - This is an error message

使用 log4rs

log4rs 是一个高度可配置的日志框架,以 Java 的 Logback 和 log4j 库为模型。

添加依赖

为项目添加 log4rs 依赖:

cargo add log4rs

配置文件

在项目根目录下,创建一个 log4rs.yaml 配置文件,并添加以下内容:

refresh_rate: 30 seconds

appenders:
  stdout:
    kind: console
    encoder:
      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{l}] {t} - {m}{n}"
  
  rolling_file:
    kind: rolling_file
    path: logs/test.log
    append: true 
    encoder:
      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{l}] {t} - {m}{n}"
    policy:
      kind: compound
      trigger:
        kind: size
        limit: 10 mb
      roller:        
        kind: fixed_window
        pattern: logs/test.{}.log
        base: 1
        count: 5
        
root:
  level: info 
  appenders:
    - stdout
    - rolling_file

上面配置文件设定日志输出到控制台、文件,文件按10 mb大小滚动,只保留最近五个文件。各个配置字段的具体含义可以参考配置

  • refresh_rate:用于确定 log4rs 扫描配置文件以查找更改的频率,如果发现更改,记录器将自动重新配置
  • appender: 负责将日志收集到文件、控制台或系统日志, 可配置多个
  • stdout、rolling_file:追加器的唯一标识字符串,自己随便定义,它的 kind 字段只支持consolefilerolling_file 三种实现
  • encoder: 负责将 log 信息转换为合适的格式, 如固定格式的平文本或json
  • pattern:编码模板,格式可配置,具体格式详见pattern
  • policy:策略字段,策略必须具有 kind 字段,默认(且仅受支持)策略为 kind: compound
  • trigger:触发器字段用于指示何时滚动日志文件,支持 size 和 time 两种类型,这里使用的是按大小

运行项目

修改main.rs内容如下:

use log::*;
use log4rs;

fn main() {
    log4rs::init_file("log4rs.yaml", Default::default()).unwrap();

    for i in 1..=1000 {
        info!("This is loop iteration {}", i);
    }
}

运行结果:

2024-04-01 15:43:28.596832500 [INFO] hello_world - This is loop iteration 1

到此这篇关于使用Rust实现日志记录功能的文章就介绍到这了,更多相关Rust日志记录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rust文件 launch.json作用大全

    Rust文件 launch.json作用大全

    launch.json 是 Visual Studio Code(VSCode)中的一个配置文件,主要用于配置调试器,本文给大家介绍Rust文件 launch.json 有什么用,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • 浅谈Rust += 运算符与 MIR 应用

    浅谈Rust += 运算符与 MIR 应用

    这篇文章主要介绍了Rust += 运算符与 MIR 应用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • Rust中的Struct使用示例详解

    Rust中的Struct使用示例详解

    这篇文章主要介绍了Rust中的Struct使用示例,代码分为结构体和实例化与访问,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • rust 一个日志缓存记录的通用实现方法

    rust 一个日志缓存记录的通用实现方法

    本文给出了一个通用的设计模式,通过建造者模式实例化记录对象,可自定义格式化器将实例化后的记录对象写入到指定的缓存对象中,这篇文章主要介绍了rust 一个日志缓存记录的通用实现方法,需要的朋友可以参考下
    2024-04-04
  • Rust使用Sqlx连接Mysql的实现

    Rust使用Sqlx连接Mysql的实现

    数据库在编程中是一个很重要的环节,本文主要介绍了Rust使用Sqlx连接Mysql的实现,记录rust如何操作数据库并以mysql为主的做简单的使用说明,感兴趣的可以了解一下
    2024-03-03
  • Rust语言之结构体和枚举的用途与高级功能详解

    Rust语言之结构体和枚举的用途与高级功能详解

    Rust 是一门注重安全性和性能的现代编程语言,其中结构体和枚举是其强大的数据类型之一,了解结构体和枚举的概念及其高级功能,将使你能够更加灵活和高效地处理数据,本文将深入探讨 Rust 中的结构体和枚举,并介绍它们的用途和高级功能
    2023-10-10
  • Rust处理命令行参数

    Rust处理命令行参数

    在Rust中,命令行参数是程序从命令行接收的输入,它们为程序提供了运行时配置和数据的灵活性,本文就来介绍一下Rust处理命令行参数,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust在写库时实现缓存的操作方法

    Rust在写库时实现缓存的操作方法

    Moka是一个用于Rust的高性能缓存库,它提供了多种类型的缓存数据结构,包括哈希表、LRU(最近最少使用)缓存和 支持TTL(生存时间)缓存,这篇文章给大家介绍Rust在写库时实现缓存的相关知识,感兴趣的朋友一起看看吧
    2024-01-01
  • Rust个人学习小结之Rust的循环

    Rust个人学习小结之Rust的循环

    这篇文章主要介绍了Rust个人学习小结之Rust的循环,今天主要了解了Rust语言的3种循环方法: loop、while、for,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Rust的泛型、Traits与生命周期用法及说明

    Rust的泛型、Traits与生命周期用法及说明

    本文通过一个寻找列表中最大值的示例,展示了如何从重复代码中提取函数,再利用泛型实现代码复用,主要步骤包括:识别重复逻辑;抽象提取;泛型应用;进一步扩展,通过不断抽象和泛化,我们不仅能减少代码重复,还能写出更通用、健壮和可维护的代码
    2025-02-02

最新评论