1. 引子

最近想要迁移一部分java应用至rust,在实际体验了tklog,log4rs,和tracing三款流行的日志框架后,最后选用了tracing,log4rs的文件备份文件名没有时间,不便于管理,tklog的功能稍显简陋,在使用uselog()后会将某些底层包日志输出至终端,即使过滤掉某第三方个包(假设叫A)之后,这个包依赖的第三方包(A依赖的第三方包B)的日志依旧会被显示,但是tklog本身又无法显示包名,只能显示文件名,根本不知道这个日志是从哪个包漏出来的XD,最后在经历多次尝试后最终选定了使用最广泛的tracing!

2. 加入tracing包

#使用log门面
log = "0.4"
#本体
tracing = "0.1"
#滚动日志,package里的是文件滚动的增强,原版的只使用utc+0配置,非utc+0时区的日志时间文件名不正确。说一个好好笑的事情,这个问题存在3年了,有人提了issue给维护者了,维护者考虑再三说想用chrono的时间替代原来的,但是因为chrono好久没更新了,有个cve漏洞没修,所以就一直放着,一直不改,怎么说呢,没勺子不能用筷子吃饭吗?加一个手动设置时间偏移量的函数不行吗?ememem...
tracing-appender = { package = "tracing-appender-plus", version = "0.2", features = ["local-time",] }
#日志订阅,tracing默认不打印日志,需要订阅才会打印
tracing-subscriber = { version = "0.3", features = ["time", "env-filter"] }
#时间包,用来格式化日志和终端的时间显示
time = { version = "0.3", features = ["macros"] }

3. 上代码

use time::macros::{format_description, offset};
use tracing_appender::{non_blocking::WorkerGuard, rolling::{RollingFileAppender, Rotation}};
use tracing_subscriber::{fmt::{time::OffsetTime, writer::MakeWriterExt}, EnvFilter};
pub fn tracing_init() -> (WorkerGuard, WorkerGuard) {
//格式化时间
let time_fmt =
format_description!("[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]");//精确到毫秒
let timer = OffsetTime::new(offset!(+8), time_fmt);
//创建滚动日志
let file_appender = RollingFileAppender::builder()
.rotation(Rotation::DAILY)//按天滚动
.filename_prefix("service")//日志前缀
.filename_suffix("log")//日志文件后缀名
.max_log_files(30)//保留的日志最大数量
.build("logs")//日志文件所在的文件夹,默认./的相对路径
.expect("failed to initialize rolling file appender");
//使用非阻塞输出
let (stdout, guard1) = tracing_appender::non_blocking(std::io::stdout());//异步输出到stdout
let (file, guard2) = tracing_appender::non_blocking(file_appender);//异步输出到文件 tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from(
"warn,actix_web1=debug,nacos_rust_client=info",
))//这里可以自定义某些第三方库的日志是否打印,第一个是全局日志等级,后面的是自定义包
.with_line_number(true)//显示行数
.with_thread_ids(true)//显示线程id
.with_ansi(false)//是否添加颜色信息,对于不支持颜色文本查看器日志文件会有乱码
.with_timer(timer)//设置时间格式化样式
.with_writer(file.and(stdout))//设置输出
.init();//初始化
(guard1, guard2)//一定要在主函数持有这两个异步缓冲区,否则无法输出
//2024-12-24 更新,主函数接收时不要使用"_",会被丢弃导致无法输出,使用"_a" 这样带有名字的接收才可以!!!
}

4. 参考文献

  1. https://probiecoder.cn/rust/tracing.html
  2. https://blog.csdn.net/qq_54714089/article/details/136717431

spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ① tracing 日志的更多相关文章

  1. spring boot 笔记--第三章

    spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...

  2. 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路

    说明: 1.Spring Boot项目默认使用logback进行日志管理 2.logback在启动时默认会自动检查是否有logback.xml文件,如果有时会有限加载这个文件. 3.那么如果是用配置中 ...

  3. 《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”

    在学习<spring boot>一书的过程中,由于原书作者难免有一些遗漏的的地方,或者系统.软件版本不一致.框架更新等各种因素,完全安装书中源码页不能实现项目的正常启动 在8.2章节,演示 ...

  4. 第5章 Spring Boot 功能

    Spring Boot 功能 本节将会介绍Spring Boot的一些细节. 在这里,您可以了解您将要使用和自定义的主要功能. 如果还没有准备好,您可能需要阅读第二部分“入门指南”和第三部分“使用 S ...

  5. Spring Boot 2.0 迁移指南

    ![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRs ...

  6. 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

    刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...

  7. 《Spring Boot实战》笔记(目录)

    目录 目 录第一部分 点睛Spring 4.x第1 章 Spring 基础 .............................................................. ...

  8. 【原】spring boot在整合项目依赖的问题

    最近要开发新的项目,就花了几天时间看了下spring boot的相关资料,然后做了一个demo,不得不说开发效率确实很快,几行注解就完成了事务,aop,数据库等相关配置:但由于先前习惯了spring ...

  9. 为什么是Spring Boot

    原文:https://dzone.com/articles/why-springboot 作者:Siva Prasad Reddy Katamreddy 译者:Oopsguy 本文介绍将各种Sprin ...

  10. Spring Boot快速入门(最新)

    本章通过完成Spring Boot基础项目的构建并实现一个简单的Http请求处理,让大家对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性.预计阅读及演练过程将花费约5分钟. ...

随机推荐

  1. 『玩转Streamlit』--会话状态管理

    在Web应用开发中,会话管理是一个至关重要的概念,它能够帮助开发者追踪用户在应用中的行为和状态,从而为用户提供更加个性化.连贯且高效的交互体验. Streamlit作为一个简单而强大的用于快速构建和部 ...

  2. 用python做时间序列预测五:时间序列缺失值处理

    有的时候,一些时刻或连续时间段内的值无法采集到,或者本身就没有值,本文将介绍如何处理这种情况. 一般而言,有以下几种方法: 对所有的缺失值用零填充. 前向填充:比如用周一的值填充缺失的周二的值 后向填 ...

  3. FANUC机器人M-16iB伺服马达维修参考措施

    随着工业自动化技术的不断发展,机器人已经广泛应用于各个领域.其中,发那科机器人以其卓越的性能和稳定性,成为了许多企业的首选.然而,伺服电机作为机器人核心部件之一,FANUC机械手维修保养至关重要. 一 ...

  4. Deepseek学习随笔(13)--- 清华大学发布第5弹:DeepSeek与AI幻觉(附网盘链接)

    人工智能技术的飞速发展为我们带来了前所未有的便利,但同时也伴随着一个不容忽视的问题--AI幻觉.清华大学发布的<DeepSeek与AI幻觉>详细探讨了AI幻觉的成因.评测方法以及应对策略, ...

  5. C语言 链表操作

    #include<stdio.h>#include<stdlib.h>struct node{    int data;    struct node *next;};int ...

  6. 国产数据库高光时刻!天翼云TeleDB荣登TPC-DS全球测评总榜第二

    近日,天翼云TeleDB数据库以40206063QphDS的吞吐量在国际权威机构TPC(国际事务处理性能委员会)发布的数据库基准测试TPC-DS中荣登全球榜单第二位.中国数据库技术跻身国际顶尖行列,这 ...

  7. vue强制刷新页面

    方法一 this.$router.go(0) // 会出现一段空白页,用户体验不好 方法二 在 app.vue 中定义 reload() 方法 <template> <div id= ...

  8. 办公自动化-批量更新tar包内文件

    最近工作有点忙,学习的时间也少了,为了提高工作效率,有时候我们需要自己写一些提高办公处理效率给的工具或者脚本或者程序. 比如,我目前遇到的一个事项,需要更新很多个tar包文件,把tar包内的某个文件替 ...

  9. gazebo+rviz 仿真

    博客地址:https://www.cnblogs.com/zylyehuo/ gazebo小车模型创建及键盘操控详见之前的博客 gazebo小车模型(附带仿真环境) - zylyehuo - 博客园 ...

  10. 【技术分析】简单了解 AccessControl

    当我们开发一个智能合约,但是里面有一些函数不能随便让别人调用,只能"拥有权限"的管理员能够调用,那么这时候我们会用到权限管理机制. 实现起来也很简单,设置一个 owner 变量,通 ...