当前位置: 首页 > news >正文

常用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以获得更好的故障排除功能。

相关文章:

常用Rust日志处理工具教程

在本文中,我想讨论Rust中的日志。通过一些背景信息,我将带您了解两个日志库:env_logger和log4rs。最后,我将分享我的建议和github的片段。 Rust log介绍 log包是Rust中日志API的事实标准,共有五个日志级别&#xff1…...

深入理解索引(二)

1.引言 在数据库和数据结构中,索引(Index)是一种用于提高数据检索速度的重要机制。本文将详细深入介绍索引。 2. 为什么要使用索引 大家在使用索引之前一定要搞清楚使用索引的目的,因为索引的不当使用可能不但起不到正向作用&a…...

Python 开发工具 -- PyCharm 简介

一、PyCharm 简介 PyCharm 是由 JetBrains 打造的一款 Python IDE。 PyCharm 具备一般 Python IDE 的功能,比如:调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。 另外,PyCharm 还提供了一些很好的功能用…...

C# 属性 学习理解记录

字段和属性 左边字段,右边属性 拓展,属性安全: 1、设置public private 和protected 等,只读,只写, 2、在get set 方法时,验证,异常时抛出错误...

使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题

本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…...

【大数据学习 | Spark-Core】Spark的分区器(HashPartitioner和RangePartitioner)

之前学过的kv类型上面的算子 groupby groupByKey reduceBykey sortBy sortByKey join[cogroup left inner right] shuffle的 mapValues keys values flatMapValues 普通算子,管道形式的算子 shuffle的过程是因为数据产生了打乱重分,分组、排序、join等…...

第六届国际科技创新学术交流大会(IAECST 2024)暨第四届物流系统与交通运输国际学术会议(LSTT 2024)

重要信息 会议官网:www.lstt.org 大会时间:2024年12月6-8日 大会地点:中国-广州 大会简介 第六届国际科技创新学术交流大会暨第四届物流系统与交通运输国际学术会议(LSTT 2024)将于2024年12月6-8日在广州举办&…...

看Threejs好玩示例,学习创新与技术(ogl)

本文标题可能看的你莫名奇妙,什么是ogl?ogl是一个新的三维引擎库,可以简单任务是非常简化的ThreeJS。下面图是它的一个示例,可见虽然它是一个麻雀,但五脏还是比较全的。 1、先说OGL OGL的代码非常简单,主要…...

读书笔记_《创华为.任正非传》_精华书摘

人生经历 43岁,开始创建华为 爷爷:金华火腿乡间厨师 父亲: 1910年生,北平民大经济系读书->职业学校任教->国民党兵工厂会计,组织读书会(读书会后来有很多人在新中国成立后成为高级干部。) 母亲: 高中毕业,乡村教师&#xf…...

4.4 MySQL 触发器(Trigger)

触发器是一种特殊的数据库对象,在特定事件(如INSERT、UPDATE或DELETE)触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。 1. 简介 1.1 什么是触发器 触发器(Trigger)是由用户定义的…...

遗传算法(Genetic Algorithm, GA)

简介 遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传机制的优化算法,由 John Holland 于20世纪70年代提出。它是一种模拟生物进化过程的启发式搜索算法,被广泛应用于函数优化、机器学习、调度问题等领域。 代码说明 …...

CentOS8.5.2111(7)完整的Apache综合实验

一、实验目标 1.掌握Linux系统中Apache服务器的安装与配置; 2.掌握个人主页、虚拟目录、基于用户和主机的访问控制及虚拟主机的实现方法。 二、实验要求 练习使用linux系统下WEB服务器的配置方法。 三、实验背景 重庆工程学院为筹备“重庆工程大学”特申请了c…...

flink学习(3)——方法的使用—对流的处理(map,flatMap,filter)

map 数据 86.149.9.216 10001 17/05/2015:10:05:30 GET /presentations/logstash-monitorama-2013/images/github-contributions.png 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/20…...

Feed流系统重构:架构篇

重构对我而言,最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构,那时系统常因超时引发用户投诉。接手任务时,我既激动又紧张,连续两天几乎废寝忘食地编码。结果令人振奋,算奖时间从一小时大幅缩短至十分钟。…...

YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions》 一、 模块介绍 论文链接:https://arxiv.org…...

java: itext 5.5 create pdf

/*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看: https://github.com/itext/itext-publications-examples-java/blob/develop/src/main/java/com/itextpdf/samples/sandbox/fonts/FreeSansBold.java* 描述:https://mvnreposit…...

EF Core学习笔记二

一、新建.net core的控制台项目 二、安装Entity Framework Core 我们使用的数据库是Sqlite,所以我们需要的程序包是Microsoft.EntityFrameworkCore.Sqlite。 如果想了解更多EF Core NuGet包,请参考:EF Core NuGet 包 | Microsoft Learn Install-Package Microsoft.Entit…...

快速排序【hoare版】

目录 介绍 算法思路 函数实现 函数声明 确定基准值 创建新函数 创建循环找数据(right,left) 交换左右数据 交换条件设置 外部循坏条件设置 初步总结代码 循环条件完善 内层循环的完善 外层循环的完善 相遇值大于keyi 相遇值等于k…...

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台(中断方式) 改进(前后台(中断))定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…...

vue中v-if和v-show的区别

文章为本菜鸡学习过程中遇到的问题记录,不是专业的,如有问题和不足还请大佬指正 >参考文章 文章目录 前言1、v-if2、v-show3、v-if和v-show的区别 前言 问题描述: 在完成表单验证任务的学习过程中,发现在使用v-show隐藏元素后…...

MacOS通过VMware Fusion安装windows 11问题汇总

环境 虚拟机,VMware Fusion 13.6.1本地机器,ARM芯片的Mac,系统版本14.5Windows系统镜像,Window11 ARM 64 bit 安装卡在WiFi连接界面 适合我本地环境的解决步骤为: 1、系统设置网络共享 我开启的是en5,这…...

Stable Diffusion的解读(二)

Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...

十五届蓝桥杯赛题-c/c++ 大学b组

握手问题 很简单&#xff0c;相互牵手即可&#xff0c;但是要注意&#xff0c;第一个人只能与其他49个人牵手&#xff0c;所以开头是加上49 #include <iostream> using namespace std; int main() {int cnt0;for(int i49;i>7;i--){cnti;//cout<<i<<&quo…...

NFS搭建

NFS搭建 单节点安装配置服务器安装配置启动并使NFS服务开机自启客户端挂载查看是否能发现服务器的共享文件夹创建挂载目录临时挂载自动挂载 双节点安装配置服务器安装配置服务端配置NFS服务端配置Keepalived编辑nfs_check.sh监控脚本安装部署RsyncInofity 客户端 单节点安装配置…...

【贪心算法第二弹——2208.将数组和减半的最小操作数】

1.题目解析 题目来源 2208.将数组和减半的最小操作数——力扣 测试用例 2.算法原理(贪心策略) 3.实战代码 class Solution { public:int halveArray(vector<int>& nums) {priority_queue<double> hash;double sum 0.0;for(auto e : nums){hash.push(e);sum …...

ByteBuffer 与 ByteBuf 的对比与优缺点分析

在 Java 网络编程和高性能 I/O 场景中&#xff0c;ByteBuffer 和 ByteBuf 是两种重要的缓冲区处理工具。ByteBuffer 是 Java NIO 标准库的一部分&#xff0c;而 ByteBuf 是由 Netty 框架提供的增强缓冲区工具。在实际开发中&#xff0c;选择哪一种取决于场景需求和性能目标。 …...

SpringBoot 集成 html2Pdf

一、概述&#xff1a; 1. springboot如何生成pdf&#xff0c;接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节&#xff1a;页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…...

【IDEA】插件篇

环境&#xff1a;Mac M &#xff0c;IDEA 2024.2.4 一、汉化 & 汉化后转回英文 1、汉化 IntelliJ IDEA -> Preferences -> Plugins -> MarketPlace&#xff0c;输入 chinese&#xff0c;点击 安装&#xff0c;安装完成后 重启IDE 2、汉化后转回英文 IntelliJ …...

librdns一个开源DNS解析库

原文地址&#xff1a;librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器&#xff0c;用于DNS解析。 源代码地址&#xff1a;GitHub - vstakhov/librdns: Asynchrono…...

数据结构 【带环单链表】

在单链表中可能会存在一种情况&#xff0c;某一结点在经过几次转移之后回到了自己本身&#xff0c;这种情况就称之为带环链表。对于带环链表&#xff0c;我们不能轻易对其进行遍历&#xff0c;遍历可能会导致产生死循环。 带环链表的逻辑图如下所示&#xff1a;&#xff08;这…...

CodiMD导出pdf失败或无中文

CodiMD导出pdf失败&#xff0c;弹出文件保存窗口&#xff0c;有个pdf文件能下载&#xff0c;但是保存的时候提示“网站出问题了”&#xff0c;实际到服务器上看会发现docker崩溃了。 解决办法&#xff1a; 使用最新的CodiMD镜像&#xff0c;如nabo.codimd.dev/hackmdio/hackmd:…...

基于Java Springboot高校教务管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 主要特性 易于部署&#xff0c;提供四种部署方式&#xff0c;包括Standalone、Cluster、Docker和…...

Python 快速入门(上篇)❖ Python基础知识

Python 基础知识 Python安装**运行第一个程序:基本数据类型算术运算符变量赋值操作符转义符获取用户输入综合案例:简单计算器实现Python安装** Linux安装: yum install python36 -y或者编译安装指定版本:https://www.python.org/downloads/source/ wget https://www.pyt…...

JAVA实现将PDF转换成word文档

POM.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...

Python学习29天

二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…...

FreeSWITCH 简单图形化界面35 - 使用python脚本

FreeSWITCH 简单图形化界面35 - 使用python脚本 测试环境1、mod_python编译2、Python编写拨号规则(dialplan)测试一下不带参数带参数 3、使用Python执行freeSWITCH的API测试一下 4、Python执行session API测试一下 5、Python编写聊天规则(chatplan)测试一下 6、Python执行messa…...

基于AIRTEST和Jmeter、Postman的自动化测试框架

基于目前项目和团队技术升级&#xff0c;采用了UI自动化和接口自动化联动数据&#xff0c;进行相关测试活动&#xff0c;获得更好的测试质量和测试结果。...

web-03

CSS回顾 选择器 标签选择器 标签{}ID选择器 标签中定义ID属性。 #ID值{}类选择器 标签中使用class属性 .类名{}关于DIV/span div任意的大小的长方形&#xff0c;大小css&#xff1a; width, height控制。—换行 span-- 一行内 CSS常用属性 width/height 宽度/高度 定义&…...

MySQL 死锁

一、引言 在 MySQL 数据库的使用过程中&#xff0c;死锁问题就像一颗隐藏在暗处的 “定时炸弹”&#xff0c;平时可能感觉不到它的存在&#xff0c;但一旦触发&#xff0c;就可能导致数据库事务无法正常推进&#xff0c;严重影响系统的性能和可用性。对于开发人员和数据库管理员…...

M|大脑越狱

rating: 7.0 豆瓣: 7.6 上映时间: “2015” 类型: M悬疑 导演: 约瑟夫怀特 Joseph White 主演: 亚历山大欧文 Alexander Owen爱德华富兰克林 Edward Franklin 国家/地区: 英国 片长/分钟: 20分钟 M&#xff5c;大脑越狱 想法不错&#xff0c;但是逻辑比较一般。属于…...

CSS3_媒体查询(十一)

CSS3_响应式布局 1、媒体样式 在不同媒体上显示不同的样式。 常用阈值&#xff1a; 小于768px&#xff1a;小屏幕&#xff1b;768px-992px&#xff1a;中等屏幕&#xff1b;992px-1200px&#xff1a;大屏幕&#xff1b;大于1200px&#xff1a;超大屏幕。 <!DOCTYPE html>…...

Spring |(四)IoC/DI配置管理第三方bean

文章目录 &#x1f4da;数据源对象管理&#x1f407;环境准备&#x1f407;实现Druid管理&#x1f407;实现C3P0管理 &#x1f4da;加载properties文件&#x1f407;第三方bean属性优化&#x1f407;读取单个属性 学习来源&#xff1a;黑马程序员SSM框架教程_SpringSpringMVCMa…...

Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)

目录 1.1鼠标进入和离开enterEvent\leaveEvent 1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent 1.3定时器事件timerEvent 1.4定时器类QTimer 1.5事件分发器event 1.6事件过滤器eventFilter 1.1鼠标进入和离开enterEvent\leaveEvent 事件&#x…...

MySQL-存储过程

目录 一、存储过程定义 二、存储过程创建 1、变量的定义 2、存储过程的分支语句 2.1 双分支IF语句 2.2 多分支IF语句 3、存储过程的循环语句 三、存储过程调用 四、存储过程显示和删除 一、存储过程定义 存储过程&#xff08;Stored Procedure&#xff09;是一种在数…...

数据指标与标签在数据分析中的关系与应用

导读&#xff1a;分享数据指标体系的文章很多&#xff0c;但讲数据标签的文章很少。实际上&#xff0c;标签和指标一样&#xff0c;是数据分析的左膀右臂&#xff0c;两者同样重要。实际上&#xff0c;很多人分析不深入&#xff0c;就是因为缺少对标签的应用。今天系统的讲解下…...

LWE详细介绍

LWE问题&#xff0c;即学习误差问题&#xff08;Learning With Errors problem&#xff09;&#xff0c;是密码学中一个重要的硬问题&#xff0c;尤其在后量子密码学中占有核心地位。LWE问题由Regev在2005年提出&#xff0c;其设计基于格理论&#xff0c;被认为是一个在平均情况…...

Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程

目录 ⛳️推荐 前言 1. 安装docker与docker-compose 2. 启动容器运行镜像 3. 本地访问测试 4.安装内网穿透 5. 创建公网地址 6. 创建固定公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…...

【Spring MVC】初步了解Spring MVC的基本概念与如何与浏览器建立连接

前言 &#x1f31f;&#x1f31f;本期讲解关于SpringMVC的基础概念&#xff0c;以及如何实现与浏览器的连接&#xff0c;参数的传递~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 …...

游戏AI实现-决策树

代码实现&#xff1a; 定义一个决策树节点 class DecisionTreeNode{public DecisionTreeNode(){} } 定义一个行为类&#xff1a; class Action : DecisionTreeNode{ } 定义一个决策类&#xff1a; class Decision : DecisionTreeNode{ } 应用&#xff1a; 参考书…...