常用Rust日志处理工具教程

news2024/11/25 0:34:30

在本文中,我想讨论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: console
    encoder:
      pattern: "{d} - {l} - {m}{n}"
  file:
    kind: file
    path: "application.log"
    encoder:
      pattern: "{d} - {l} - {m}{n}"
loggers:
  my_app:
    level: info
    appenders:
      - console
      - file
root:
  level: error
  appenders:
    - 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.coloradmin.cn/o/2246973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

废品买卖回收管理系统|Java|SSM|Vue| 前后端分离

【重要①】前后端源码万字文档部署文档 【重要②】正版源码有问题包售后 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可以提供远程部署安装,包扩环境 【…

案例研究|阿特斯的JumpServer分布式部署和多组织管理实践

苏州阿特斯阳光电力科技有限公司(以下简称为阿特斯)是一家集太阳能光伏组件制造和为全球客户提供太阳能应用产品研发、设计、制造、销售的专业公司。 阿特斯集团总部位于加拿大,中国区总部位于江苏省苏州市。通过全球战略和多元化的市场布局…

tongweb安全整改

一 禁止以root账号运行tongweb服务 1 如果是首次安装须创建普通用户安装tongweb 2 如果已经使用root账号安装了tongweb 2.1 创建普通用户 2.2 使用root账号授予tongweb安装目录宿主权限为普通用户 2.3赋权成功后,后续启动tongweb服务必须为普通用户 二 tongRDS隐…

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型:检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…

tcpdump抓包 wireShark

TCPdump抓包工具介绍 TCPdump,全称dump the traffic on anetwork,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能: 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 2、支持网络层…

HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…

YOLOV5 /onnx模型转换成rknn

上两篇文章讲述了pytorch模型下best.pt转换成onnx模型,以及将onnx进行简化成为best-sim.onnx, 接下来这篇文章讲述如何将onnx模型转换成rknn模型,转换成该模型是为了在rk3568上运行 1.创建share文件夹 文件夹包含以下文件best-sim.onnx,rknn-tookit2-…

【51单片机】LCD1602液晶显示屏

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602(Liquid Crystal Display)液晶显示屏是…

如何使用AWS Lambda构建一个云端工具(超详细)

首发地址(欢迎大家访问):如何使用AWS Lambda构建一个云端工具(超详细) 1 前言 1.1 无服务器架构 无服务器架构(Serverless Computing)是一种云计算服务模型,它允许开发者构建和运行…

【Isaac Sim】相关问题汇总

目录 一、安装点击Install时报错二、启动时报 Failed to create any GPU devices三、加载Isaac Sim自带模型或示例时报 Isaac Sim is not responding 一、安装点击Install时报错 报错: request to https://asset.launcher.omniverse.nvidia.com/… failed, reason:…

Spring-02-springmvc

2. 什么是SpringMVC 2.1. 概述 Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。 为什么要学习SpringMVC呢? Spring MVC的特点: 轻量级,简单易学高效 , 基于请求响应的MVC框架与Spring兼容性好,无缝…

深度学习之目标检测的技巧汇总

1 Data Augmentation 介绍一篇发表在Big Data上的数据增强相关的文献综述。 Introduction 数据增强与过拟合 验证是否过拟合的方法:画出loss曲线,如果训练集loss持续减小但是验证集loss增大,就说明是过拟合了。 数据增强目的 通过数据增强…

qt添加模块

以QtNetwork模块为例 方式一 扩展-qt vs tools-qt project settings 方式二 右键选中项目-属性-qt project settings 方法三 在此界面选择select modules,即可进行相应模块添加

【信息系统项目管理师】第2章:信息技术发展 考点梳理

文章目录 2.1 信息技术及其发展2.1.1 计算机软硬件2.1.2 计算机网络2.1.3 存储和数据库2.1.4 信息安全2.1.5 信息技术的发展 2.2 新一代信息技术及应用2.2.1 物联网2.2.2 云计算2.2.3 大数据2.2.4 区块链2.2.5 人工智能2.2.6 虚拟现实 2.1 信息技术及其发展 2.1.1 计算机软硬件…

【线程】Java多线程编程

【线程】Java多线程编程 一、前言一个最简单的多线程编程示例可以使用的工具 二、创建线程的方式三、Thread类中重要的属性和方法3.1 构造方法3.2 常见属性 一、前言 当有多个线程的时候,这些线程的执行顺序是不确定的。这一点,是我们之前提到的操作系统…

unsloth vlm模型Qwen2-VL、Llama 3.2 Vision微调案例

T4卡15G显卡训练 参考: https://github.com/unslothai/unsloth 按自己显卡cuda版本安装 免费colab微调代码: Qwen2-VL: https://colab.research.google.com/drive/1whHb54GNZMrNxIsi2wm2EY_-Pvo2QyKh?usp=sharing from unsloth import FastVisionModel # NEW instead …

window11编译pycdc.exe

一、代码库和参考链接 在对python打包的exe文件进行反编译时,会使用到uncompyle6工具,但是这个工具只支持python3.8及以下,针对更高的版本的python则不能反编译。 关于反编译参考几个文章: Python3.9及以上Pyinstaller 反编译教…

oracle如何配置第二个监听优化数据传输

oracle如何配置第二个监听优化数据传输 服务器两个网卡,配置两个不同IP和端口的监听。 归档日志量每天很大,为了不影响业务,需要配置一个单独的万兆网络来专门的传输归档日志到DG库,这里就涉及到在19c中增加一个监听用来使用专门…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出,可以让开发者轻松地对实时数据进行处理,比如计数、聚合、…

用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)

反向传播(Backpropagation) 引言1. 分类交叉熵损失导数(Categorical Cross-Entropy loss derivative)2. 分类交叉熵损失导数 - 代码实现3. Softmax激活函数导数(Softmax activation derivative)4. Softmax激…