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. Vue3 基础概念与环境搭建

    前言 首先需要提醒大家的是,Vue2 已经在2023年停止维护,为了能更好地适应前端开发的发展趋势以及获得更好的性能和功能,我们将从这篇文章开始进入Vue3的阶段.如果对Vue2有想了解的小伙伴可以自 ...

  2. Javascript 显示当前滚动条滚动的百分比

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Flink - [06] 状态管理

    题记部分 一.Flink中的状态 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态. 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问. Flink会进行状态管理,包括状态一 ...

  4. Java进阶 - [1-5] 集合容器

    ArrayList add 1.先确认是否需要扩容,如果需要,则进行扩容操作ensureExplicitCapacity. 2.进行赋值 elementData[size++] = e; 扩容 1.如 ...

  5. 大数据之路Week08_day02 (Flume 三个组件Source, channel, sink)

    在使用之前,先介绍组件Flume的特点和一些组件 Flume的优势: 1. Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase 2. 当收集数据的速度超过将写入数据的时候, ...

  6. SG定理

    先放一个 SG 函数的定义和 SG 定理 SG 函数: \(SG(p) = \text{mex}\ {SG(t)}\) SG 定理: \(\forall n\) 个独立的子图若 \(SG(1)\ \o ...

  7. 使用unity构建射击小游戏

    博客地址:https://www.cnblogs.com/zylyehuo/ 成果图 参考例程 www.manning.com/hocking 问题汇总 1.renderer.material 方法过 ...

  8. 小程序登录与OAuth规范

    登录认证是一个完整应用必备的模块,除非你的应用程序不需要任何与用户相关的功能 比如hao123 这种静态导航网站一般不会涉及用户体系. 很多人在最初接触小程序登录功能时,会误认为以微信为入口的小程序使 ...

  9. 可视化|MapBoxGL

    注册Proton Mail 用户名 密码 人机验证 昵称 设置恢复方法-选择稍后再说-确定 注册MapBoxGL 填写后 Finish creating your account 一开始之前记得选择U ...

  10. vue实现不同用户权限的方法

    Vue 实现不同用户权限的方法 在项目中,实现不同用户的权限控制是常见的需求也是常见的功能模块,例如管理系统中不同角色(管理员.普通用户等)应有不同的访问权限,小程序.App等在不同角色登入的时候显示 ...