常用Rust日志处理工具教程

在本文中,我想讨论Rust中的日志。通过一些背景信息,我将带您了解两个日志库:env_logger和log4rs。最后,我将分享我的建议和github的片段。

Rust log介绍

log包是Rust中日志API的事实标准,共有五个日志级别:error(最高优先级)、warn、info、debug和trace(最低优先级)。要记录一条消息,可以使用相应的日志marcos: error!warn!等。这些宏的行为就像println!一样并支持format!语法。也就是说,{}调用display, {:?}调用debug,{:#?}输出格式化debug信息。(稍后我们将看到一些示例。)

一个重要的注意事项是,log包只提供API,而不提供实现。你必须选择一个具体实现日志库。那么,Rust中最常用的日志库是什么呢?
在这里插入图片描述

env_logger

到目前为止,Rust中最常用的日志库是env_logger 包。在crates.io,env_logger的总下载量惊人。通过一行配置代码env_logger::init(),这个简单的库将所有日志写入stderr(可配置为stdout)。顾名思义,env_logger使用一个环境变量RUST_LOG来配置其日志级别。
在这里插入图片描述

例如,RUST_LOG=debug cargo run 记录调试或更高级别发出的所有内容,即除了trace之外的所有内容。

下面是一个简单的完整示例:

首先增加依赖:

-- cargo add log env_logger[dependencies]
log = "0.4.22"
env_logger = "0.11.5"

示例代码:

use log::debug;
use log::error;
use log::info;
use log::warn;
fn main() {env_logger::init();debug!("Mary has a little lamb");error!("{}", "Its fleece was white as snow");info!("{:?}", "And every where that Mary went");warn!("{:#?}", "The lamb was sure to go");
}

运行命令:RUST_LOG=debug cargo run , 输出结果:

[2024-11-22T12:43:27Z DEBUG foo1] Mary has a little lamb
[2024-11-22T12:43:27Z ERROR foo1] Its fleece was white as snow
[2024-11-22T12:43:27Z INFO  foo1] "And every where that Mary went"
[2024-11-22T12:43:27Z WARN  foo1] "The lamb was sure to go"

此外,还有一些其他库构建在env_logger之上。例如,pretty_env_logger和json_env_logger包。你可能会发现它们很有用,如果你想日志或消息记录为json而不是文本。

log4rs

log4rs是 Rust 语言中一个功能强大且灵活的日志框架。它提供了高度可定制的日志记录功能,允许开发者根据不同的需求配置日志的输出级别、格式、目标(如输出到控制台、文件等)。与env_logger相比,log4rs具有更复杂和精细的配置选项,能够满足复杂项目中对日志管理的严格要求。

log4rs 包是按照Java的log4j库模仿的。要开始记录日志,必须创建一个appender,它确定日志的记录位置:控制台、文件或syslog。在生产系统中,你几乎总是希望使用滚动文件追加方式。滚动文件追加方式根据时间(比如每小时)生成一个新的日志文件。这自然地按时间组织日志文件,并支持跳过任何不感兴趣的时间段,例如,当你只想查看4月15日晚上7点发生的事情时。

然后,你需要配置希望在系统中保留多少日志文件,通常按存储大小(保留300GB)或保留时间(保留30天)进行配置。

核心概念

  • 配置(Configuration)log4rs的配置文件(通常是 YAML 或 JSON 格式)是其核心部分。通过配置文件,可以定义日志记录器(Logger)、日志级别、输出目标(Appender)和日志格式(Encoder)等关键元素。
  • 日志记录器(Logger):用于记录日志信息,它可以关联一个或多个输出目标。可以为不同的模块或功能创建不同的日志记录器,并且可以为每个记录器设置不同的日志级别。
  • 输出目标(Appender):决定日志信息的输出位置,常见的输出目标包括控制台(stdout)和文件。可以配置多个输出目标,并且每个输出目标可以有自己的日志格式。
  • 日志格式(Encoder):用于定义日志信息的格式,如时间戳、日志级别、日志消息等部分的排列和格式。

示例

首先增加依赖:

[dependencies]
log = "0.4.22"
log4rs = "1.0.0"

下面rust示例程序将上面知识整合在一起:

  • 配置文件

log4rs配置文件(以 YAML 格式为例)log4rs.yml

refresh_rate: 30 seconds
appenders:console:kind: consoleencoder:pattern: "{d} - {l} - {m}{n}"file:kind: filepath: "application.log"encoder:pattern: "{d} - {l} - {m}{n}"
loggers:my_app:level: infoappenders:- console- file
root:level: errorappenders:- console

解释说明:

  • refresh_rate:表示配置文件的刷新频率,这里是每 30 秒刷新一次配置。
  • appenders:定义了日志的输出目标。
    1. console:将日志输出到控制台。kind: console表示输出目标是控制台,encoder部分定义了日志格式,{d}表示日期时间,{l}表示日志级别,{m}表示日志消息,{n}表示换行符。
    2. file:将日志输出到文件。kind: file指定了输出目标为文件,path: "application.log"定义了日志文件的名称,其日志格式与控制台相同。
  • loggers:定义了名为my_app的日志记录器,日志级别为info,关联了consolefile两个输出目标。
  • root:定义了根日志记录器,日志级别为error,只关联了console输出目标。在log4rs配置中,root logger 是日志系统的根记录器。它的主要作用是为整个应用程序提供一个兜底的日志级别和输出目标设置。当一个日志事件没有被其他更具体的logger处理时,就会由root logger 来处理。例如,如果在应用程序中有一些代码模块没有明确关联到其他自定义的logger,那么这些模块产生的日志就会遵循root logger 的配置。

下面是示例代码:

use log4rs::init_config;
use log::{error, info};
fn main() {// 初始化log4rs配置init_config("log4rs.yml").unwrap();info!("This is an info log");error!("This is an error log");
}

首先通过init_config("log4rs.yml")来初始化log4rs,传入的参数是配置文件的名称。如果配置文件加载成功,就可以使用log crate 提供的日志宏(如info!error!)来记录日志。根据配置文件,info级别的日志会输出到控制台和文件,error级别的日志也会输出到控制台和文件(因为error级别高于info,根日志记录器也会处理)。

log4rs还支持许多其他高级功能,如动态配置更新、自定义日志级别等,可以根据具体项目的需求进行更深入的配置和使用。

总结

我的建议是从简单的env_logger开始。如果你需要更好监控你的项目,请切换到log4rs以获得更好的故障排除功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478685.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式的C/C++:深入理解 static、const 与 volatile 的用法与特点

目录 一、static 1、static 修饰局部变量 2、 static 修饰全局变量 3、static 修饰函数 4、static 修饰类成员 5、小结 二、const 1、const 修饰普通变量 2、const 修饰指针 3、const 修饰函数参数 4. const 修饰函数返回值 5. const 修饰类成员 6. const 与 #defi…

时间请求参数、响应

(7)时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…

SpringBoot(9)-Dubbo+Zookeeper

目录 一、了解分布式系统 二、RPC 三、Dubbo 四、SpringBootDubboZookeeper 4.1 框架搭建 4.2 实现RPC 一、了解分布式系统 分布式系统:由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统 二、RPC RPC:远程…

单片机学习笔记 8. 矩阵键盘按键检测

更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘 目录 0、实现的…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中,科技的力量正日益凸显。其中,移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能,成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式,更为农业生产带来了高效、精…

android 音效可视化--Visualizer

Visualizer 是使应用程序能够检索当前播放音频的一部分以进行可视化。它不是录音接口,仅返回部分低质量的音频内容。但是,为了保护某些音频数据的隐私,使用 Visualizer 需要 android.permission.RECORD_AUDIO权限。传递给构造函数的音频会话 …

计算机网络八股整理(一)

计算机网络八股文整理 一:网络模型 1:网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…

利用Python爬虫获得1688按关键字搜索商品:技术解析

在电商领域,1688作为中国领先的B2B电商平台,其商品搜索功能对于商家来说具有极高的价值。通过获取搜索结果,商家可以更好地了解市场趋势,优化产品标题,提高搜索排名。本文将介绍如何使用Python编写爬虫,以获…

Spring Boot集成MyBatis-Plus:自定义拦截器实现动态表名切换

Spring Boot集成MyBatis-Plus:自定义拦截器实现动态表名切换 一、引言 介绍动态表名的场景需求,比如多租户系统、分表分库,或者不同业务模块共用一套代码但操作不同表。说明 MyBatis-Plus 默认绑定固定表名的问题。 二、项目配置 1. 集成 M…

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio,发现整个界面都发生了很大改动: 新的界面的一些设置可参考一些博客: Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说,没有时间去适应,那么怎么办呢&am…

数据新时代:如何选择现代数据治理平台(上)

谈现代数据治理系统的十大架构特征 最近一位老友找到我,咨询他的数据治理平台到底该不该换,背景是这样的:若干年前采购了一个市场主流的数据治理平台,功能大概就是数据治理三件套——标准、元数据和质量等经典数据治理的功能。现…

抖音SEO矩阵系统:开发技术分享

市场环境剖析 短视频SEO矩阵系统是一种策略,旨在通过不同平台上的多个账号建立联系,整合同一品牌下的各平台粉丝流量。该系统通过遵循每个平台的规则和内容要求,输出企业和品牌形象,以矩阵形式增强粉丝基础并提升商业价值。抖音作…

从零开始打造个人博客:我的网页设计之旅

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏&#xff1a…

STM32F103C8T6实时时钟RTC

目录 前言 一、RTC基本硬件结构 二、Unix时间戳 2.1 unix时间戳定义 2.2 时间戳与日历日期时间的转换 2.3 指针函数使用注意事项 ​三、RTC和BKP硬件结构 四、驱动代码解析 前言 STM32F103C8T6外部低速时钟LSE(一般为32.768KHz)用的引脚是PC14和PC…

Jmeter中的定时器

4)定时器 1--固定定时器 功能特点 固定延迟:在每个请求之间添加固定的延迟时间。精确控制:可以精确控制请求的发送频率。简单易用:配置简单,易于理解和使用。 配置步骤 添加固定定时器 右键点击需要添加定时器的请求…

Fakelocation Server服务器/专业版 ubuntu

前言:需要Ubuntu系统 Fakelocation开源文件系统需求 Ubuntu | Fakelocation | 任务一 任务一 更新Ubuntu(安装下载不再赘述) sudo -i # 提权 sudo apt update # 更新软件包列表 sudo apt upgrade # 升级已安装的软…

5.5 W5500 TCP服务端与客户端

文章目录 1、TCP介绍2、W5500简介2.1 关键函数socketlistensendgetSn_RX_RSRrecv自动心跳包检测getSn_SR 1、TCP介绍 TCP 服务端: 创建套接字[socket]:服务器首先创建一个套接字,这是网络通信的端点。绑定套接字[bind]:服务器将…

超高流量多级缓存架构设计!

文章内容已经收录在《面试进阶之路》,从原理出发,直击面试难点,实现更高维度的降维打击! 文章目录 电商-多级缓存架构设计多级缓存架构介绍多级缓存请求流程负载均衡算法的选择轮询负载均衡一致性哈希负载均衡算法选择 应用层 Ngi…

信创改造 - TongRDS 替换 Redis

记得开放 6379 端口哦 1)首先在服务器上安装好 TongRDS 2)替换 redis 的 host,post,passwd 3)TongRDS 兼容 jedis # 例如:更改原先 redis 中对应的 host,post,passwd 改成 TongRDS…

vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数

vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数 微信公众平台添加配置 微信公众平台 > 开发管理 > 开发设置 > 扫普通链接二维码打开小程序 配置链接规则需要下载校验文档给后端存入服务器中,保存配置的时候会校验一次,确定当前的配…