首页 > 其他分享 >Rust 日志记录库 tracing

Rust 日志记录库 tracing

时间:2023-09-26 21:12:38浏览次数:41  
标签:layer span tracing event 日志 appender Rust

Rust 日志记录库 tracing

​#2023-09-26#​ #日志#​ #tracing#

一个好用的日志跟踪系统,可以帮助我们很快的定位程序中的 bug。tracing 不仅仅可以作为一个日志库去使用,还可以作为一个程序追踪库,帮助我们分析程序中存在的问题。

tracing - Rust

tracing 各个模块

  • tracing​​: 作用域内的结构化日志记录和诊断系统。

  • tracing_appender​: 记录事件和跨度的编写者。也就是将日志写入文件或者控制台。

  • tracing_error​: 增强错误处理跟踪诊断信息的实用工具。

  • tracing_flame​: 用于生成折叠堆栈跟踪以生成Inferno火焰图和火焰图表的跟踪订阅者。

  • tracing_log​: 用于连接标准库日志系统和tracing系统的连接器。

  • tracing_subscriber​: 用于实现和组成tracing订阅者的工具集合。

常规使用思路

使用tracing_appender​创建控制台输出层文件输出层。然后使用tracing_subscriber​进行事件的订阅。

在使用的时候可以使用tracing​进行日志和程序跟踪,也可使用标准log​库结合tracing_log​一同使用。

项目配置方法

在Cargo.toml文件中,添加依赖库

[dependencies]
# 日志系统
tracing = "0.1"
tracing-error = "0.2"
tracing-subscriber = { version = "0.3", features = ["std", "local-time"] }
tracing-appender = "0.2"
# color-eyre = "0.6"

日志系统初始化代码如下:

use tracing_appender::{non_blocking, rolling};
use tracing_error::ErrorLayer;
use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, Layer, Registry};

pub fn logger_init() {
	// 格式化输出层,并且输出到终端。
    let formatting_layer = fmt::layer().pretty().with_writer(std::io::stdout);
    // 文件输出层
	let file_appender = rolling::daily("logs/", "log");
    let (non_blocking_appender, _guard) = non_blocking(file_appender); // 输出非阻塞
    let file_layer = fmt::layer()
         .with_ansi(false)
         .with_writer(non_blocking_appender)
         .with_filter(tracing_subscriber::filter::LevelFilter::INFO) // 文件输出日志等级
         .boxed();

    Registry::default()
        .with(ErrorLayer::default())
        .with(formatting_layer)
        .with(file_layer)
        .init();
    // color_eyre::install().unwrap();
}

在代码中使用日志

tracing的过程分为两个部分,span​和event​。

span​负责记录事件发生的地点和上下文信息,如果作用域内没有event​发生,span​不会输出任何信息。如果作用域内有event​发生,在输出event​信息的同时,也会将进入的span​信息从近到远依次输出,携带相关的上下文信息。

event​用于记录事件发生的情况,可以携带事件发生时产生的数据。

span:作用域记录

标记事件发生的上下文信息。有很多宏定义可以直接使用:

  • span!​:
  • tracing_span!​:

或者时函数标记instructment

#[instructment]
fn func(){
	...
}

例如

use tracing::{span, Level};
let span = span!(Level::TRACE, "my_span");
// `enter` returns a RAII guard which, when dropped, exits the span. this
// indicates that we are in the span for the current lexical scope.
// 	`enter`是一个 RAII(Resource Acquisition Is Initialization)守卫,
// 当这个变量被获取的时候,资源同时会被获取;变量被释放的时候,资源被释放。
let _enter = span.enter();
// perform some work in the context of `my_span`...

event:事件记录

use tracing::{event, Level}

event!(Level::INFO, passwd = "passwd");

标签:layer,span,tracing,event,日志,appender,Rust
From: https://www.cnblogs.com/qi-xmu/p/rust-log-record-library-traction-2liiil.html

相关文章

  • PG 故障分析之 select count(*) 产生大量WAL 日志(wal_log_hint)
    Hello,大家好,今天给大家分享的这个本周发生在生产环境的一个真实的案例。故障的现象是:主库短时间内生成了大量的WAL日志,触发了归档archive_command的操作,导致灾备中心的2台standby机器同步中断。StandbyLog:FATAL:couldnotreceivedatafromWALstream:ERROR:reques......
  • PostgreSQL数据库WAL日志空间大小以及不清理的原因深入分析
    1.背景很多初学者会对WAL日志占用多少空间比较疑惑,听网上的一些文章说是由max_wal_size来控制的,但发现很多时候WAL日志空间会超过这个设置的值,不知道为什么?同时有时会发现WAL日志不清理了,占用空间在不停的增长,然后不知道为什么?看一些网上的文章,发现情况不是网上说的那种情况。......
  • alert日志中出现大量“WARNING too many parse errors”告警
    1、一套19.19的ORACLE数据库,alert日志中出现大量的parseerrors告警信息,具体如下所示。WARNING:toomanyparseerrors,count=9239SQLhash=0x5da2e911PARSEERROR:ospid=51405,error=923forstatement:Additionalinformation:hd=0x4b789d8b0phd=0x4ae3cd7e0flg=......
  • 【开发/调试工具】【串口工具】不同串口软件如何生成带时间戳的日志
    https://blog.csdn.net/qxhgd/article/details/126152913 Xshell在新建会话属性页面,可配置日志的日期格式:  IPOP可根据需要调整标签间隔时间: ......
  • nginx日志分析: 每小时请求量最高的IP
    按小时来统计,当前指定日志的每小时最高流量的前10个IP,并显示出请求的状态码.nginx.conf中配置的日志格式为:  log_format main '$remote_addr-$remote_user[$time_local]"$request"'           '$status$body_bytes_sent"$http_refere......
  • apache日志类型及作用
    apache标准中规定了4类日志: 错误日志 访问日志 传输日志 Cookie日志 其中:传输日志和Cookie日志被Apache2.0认为已经过时,同时错误日志和访问日志被Apache2.0+默认设置 访问日志 访问服务器的远程机器的地址:可以得知浏览者来自何方 浏览者访问的资源:可以得知......
  • 日志模块
    1.日志模块的基本使用"""日志的级别:后续我们写日志的时候,可以按照日志的级别选择性的记录"""logging.debug('debugmessage') #10logging.info('infomessage') #20logging.warning('warningmessage') #30logging.error('erro......
  • pytest + yaml 框架 -56. 输出日志优化+allure报告优化
    前言v1.4.8版本优化接口请求和响应输出日志,生成的allure报告也按步骤优化request和response详情日志优化日志用例test_log1:-name:log1request:url:http://127.0.0.1:8000/api/test/demomethod:GETvalidate:-eq:[status_code,200]-eq:......
  • rust 代码组织结构
    使用包、Crate和模块管理不断增长的项目-Rust程序设计语言中文版rust组织结构中,包括以下几个概念Package(包),Crate(箱),Moudle(模块)Package这是Cargo的概念,对应一个Cargo.toml文件,也就是一个rust工程。用于构建、测试、共享Crate。1package=0/1libcrate+0/N......
  • Rust函数与闭包
    1.常规函数函数都拥有显示的类型签名,其本身也是一种类型。1.1函数类型自由函数//自由函数fnsum(a:i32,b:i32)->i32{a+b}fnmain(){assert_eq!(3,sum(1,2))}关联函数与方法structA(i32,i32);implA{//关联函数fnsum(a:i32,b:......