Rust高性能日志库tklog0.0.8—支持mod设置参数

tklog是rust高性能结构化日志库,支持同步日志,异步日志,支持自定义日志的输出格式,支持按时间,按文件大小分割日志文件,支持日志文件压缩备份,支持官方日志库标准API,支持mod独立参数设置

tklog相关信息

  1. 官网
  2. 项目源码
  3. 仓库
  4. 《tklog与log4rs 的基准测试》

tklog 0.0.8版本主要更新

1,优化代码并修复已知bug

2.支持模块设置独立日志参数

    1. tklog提供了set_optionset_mod_option 设置Logger对象的全局日志参数和指定mod的日志参数
    2. 在项目中,可以使用全局LOG对象,同时对多个mod设置独立的日志参数
    3. 不同mod可以设置不同的日志级别,日志格式,日志文件等
    4. 异步全局对象ASYNC_LOG的mod日志参数设置与同步LOG相同

说明:对指定的mod设置LogOption参数对象时,LogOption对象只作用于该mod。

在mod内部设置该mod的日志参数时,可以直接调用 module_path!() 来标识mod名,如:

tklog::LOG.set_mod_option(module_path!(),LogOption{level:Some(LEVEL::Info),console: Some(false),format:None,formatter:None,fileoption:None);


tklog 项目引入

[dependencies]
tklog = "0.0.8"   #   "0.0.x" 当前版本

set_option 示例:
tklog::LOG.set_option(LogOption{level:Some(LEVEL::Debug),console: Some(false),format:None,formatter:None,
fileoption: Some(Box::new(FileTimeMode::new("day.log",tklog::MODE::DAY,0,true)))});
LogOption对象说明
  • level 日志级别
  • format 日志格式
  • formatter 日志输出自定义格式
  • console 控制台日志设置
  • fileoption 文件日志设置

set_mod_option 示例:
tklog::LOG.set_mod_option("testlog::module1",LogOption{level:Some(LEVEL::Debug),console: Some(false),format:None,formatter:None,
fileoption: Some(Box::new(FileTimeMode::new("day.log", tklog::MODE::DAY, 0,true)))});
  • testlog::module1 为设置的模块名,可以通过rust内置宏 module_path!() 打印出当前模块名
  • 当tklog在模块 testlog::module1 中使用时,将tklog将使用该LogOption对象


完整的设置mod参数 示例
mod module1 {use std::{thread, time::Duration};use tklog::{handle::FileTimeMode, LogOption, LEVEL};pub fn testmod() {tklog::LOG.set_mod_option(module_path!(), LogOption { level: Some(LEVEL::Debug), format: None, formatter: None, console: None, fileoption: Some(Box::new(FileTimeMode::new("module1.log", tklog::MODE::DAY, 0, true))) }).uselog();tklog::debug!("module1,tklog api,LOG debug log>>", 123);tklog::info!("module1,tklog api,LOG info log>>", 456);log::debug!("module1,log api,debug log>>{}", 111);log::info!("module1,log api,info log>>{}", 222);thread::sleep(Duration::from_secs(1))}
}mod module2 {use std::{thread, time::Duration};use tklog::{handle::FileTimeMode, LogOption, LEVEL};pub fn testmod() {tklog::LOG.set_mod_option(module_path!(), LogOption { level: Some(LEVEL::Info), format: None, formatter: None, console: None, fileoption: Some(Box::new(FileTimeMode::new("module2.log", tklog::MODE::DAY, 0, true))) }).uselog();tklog::debug!("module2,tklog api,LOG debug log>>", 123);tklog::info!("module2,tklog api,LOG info log>>", 456);log::debug!("module2,log api,debug log>>{}", 111);log::info!("module2,log api,info log>>{}", 222);thread::sleep(Duration::from_secs(1))}
}#[test]
fn testmod2() {module1::testmod();module2::testmod();
}

执行结果:

[DEBUG] 2024-06-19 10:54:07 testlog.rs 54:module1,tklog api,LOG debug log>>,123
[INFO] 2024-06-19 10:54:07 testlog.rs 55:module1,tklog api,LOG info log>>,456
[DEBUG] 2024-06-19 10:54:07 testlog.rs 56:module1,log api,debug log>>111
[INFO] 2024-06-19 10:54:07 testlog.rs 57:module1,log api,info log>>222
[INFO] 2024-06-19 10:54:08 testlog.rs 68:module2,tklog api,LOG info log>>,456
[INFO] 2024-06-19 10:54:08 testlog.rs 70:module2,log api,info log>>222

示例2: 异步日志
mod module3 {use tklog::{handle::FileTimeMode, Format, LogOption, LEVEL};pub async fn testmod() {tklog::ASYNC_LOG.set_mod_option("testlog::module3", LogOption { level: Some(LEVEL::Debug), format: Some(Format::Date), formatter: None, console: None, fileoption: Some(Box::new(FileTimeMode::new("module3.log", tklog::MODE::DAY, 0, true))) }).await.uselog();tklog::async_debug!("async module3,tklog api,LOG debug log>>", 123);tklog::async_info!("async module3,tklog api,LOG info log>>", 456);log::debug!("async module3,log api,debug log>>{}", 333);log::info!("async module3,log api,info log>>{}", 444);tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;}
}mod module4 {use tklog::{handle::FileTimeMode, Format, LogOption, LEVEL};pub async fn testmod() {tklog::ASYNC_LOG.set_mod_option("testlog::module4", LogOption { level: Some(LEVEL::Info), format: Some(Format::Date), formatter: None, console: None, fileoption: Some(Box::new(FileTimeMode::new("module4.log", tklog::MODE::DAY, 0, true))) }).await.uselog();tklog::async_debug!("async module4,tklog api,LOG debug log>>", 123);tklog::async_info!("async module4,tklog api,LOG info log>>", 456);log::debug!("async module4,log api,debug log>>{}", 333);log::info!("async module4,log api,info log>>{}", 444);tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;}
}#[tokio::test]
async fn testmod4() {module3::testmod().await;module4::testmod().await;
}

执行结果:

[DEBUG] 2024-06-19 10:59:26 testlog.rs 85:async module3,tklog api,LOG debug log>>,123
[INFO] 2024-06-19 10:59:26 testlog.rs 86:async module3,tklog api,LOG info log>>,456
[DEBUG] 2024-06-19 10:59:26 testlog.rs 87:async module3,log api,debug log>>333
[INFO] 2024-06-19 10:59:26 testlog.rs 88:async module3,log api,info log>>444
[INFO] 2024-06-19 10:59:27 testlog.rs 98:async module4,tklog api,LOG info log>>,456
[INFO] 2024-06-19 10:59:27 testlog.rs 100:async module4,log api,info log>>444

说明,上述示例上
  1. module1 ,module2 的mod名调用 module_path!()  设置,module3 ,module4则显示写明testlog::module3,testlog::module4 ,可以看到效果是一样的。
  2. 模块设置的参数如果未None时,则会使用全局的参数。如
tklog::LOG
.set_option(LogOption{level:Some(LEVEL::Debug),console: Some(false),format:None,formatter:None,fileoption: Some(Box::new(FileTimeMode::new("day.log",tklog::MODE::DAY,0,true)))})
.set_mod_option("testlog::module", LogOption { level: Some(LEVEL::Inof), format: None, formatter: None, console: None, fileoption: None });
    • 对模块 testlog::module   只设置了 level,其他的参数则会直接使用全局参数,如 fileoption,默认为 FileTimeMode::new("day.log",tklog::MODE::DAY,0,true)

版本性能基准测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34220.shtml

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

相关文章

怎么将文件免费扫描?这篇文章教你几个文件扫描方法

随着时间的流逝,我们所珍藏的纸质文件可能会面临破损和丢失的风险。 为了确保这些宝贵的资料得到妥善保管,将它们转换为电子格式并存储于电脑中无疑是一个明智之举。 那么,我们应当如何将这些纸质资料转换为易于管理和访问的电子文档呢&…

CMake基础教程

用法 cmake -B build // 配置,在源码目录用 -B 直接创建 build 目录并生成 build/Makefile cmake --build build -j4 // 构建,Linux会调用make,Windows会调用devenv.exe cmake --version 定义 -DCMAKE_INSTALL_PREFIX/opt/openvdb-8.0 /…

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. 泛型编程 首先让我们来思考一个问题,如何实现一个交换函数&#x…

企业有必要使用OVSSL证书吗?

在数字化时代,SSL证书不仅仅是一种技术保障,它更是企业线上服务的重要组成部分。企业级OVSSL证书以其独特的优势,为企业带来了多重好处。 包含以下几点: 1、增强信任度:OV SSL证书在颁发前会对组织的身份进行验证&…

找出一个整型数组中的元素的最大值

这个问题在之前的文章中曾用其他方法解决,现在用类来处理,读者可以比较不同方法的特点。 编写程序: 运行结果: 程序分析: 程序看起来比较长,其实并不复杂,它包括以下3部分:…

生产实习Day13 ---- 神经网络模型介绍

文章目录 传统的神经网络模型注意力机制的引入注意力机制的本质Encoder-Decoder 框架注意力机制在 Encoder-Decoder 中的应用Self-Attention 机制Transformer 模型注意力机制的优势总结 传统的神经网络模型 在深度学习中,传统的神经网络模型,如循环神经…

【离散数学】图的随机生成和欧拉(回)路的确定(c语言实现)

实验要求 变量定义 因为如果我们使用局部变量,每一个函数都会使用这些变量,会让函数的参数越变越多。所以我们定义全局变量,这样就不用在参数中调用了。 #define MAX 100 int arrMap[MAX][MAX] { 0 };//图的矩阵 int degree[MAX] { 0 };…

[职场] 提升学历考研再就业有必要吗 #其他#知识分享

提升学历考研再就业有必要吗 有很多人觉得自己学历不够高,求职第一关可能就通过不了。因此想要继续攻读,最近有人问小编提升学历考研有必要吗?“硕士学历和三年的工作经验哪个更重要?” 这个还是要针对具体岗位而言。综合类型的岗位往往不需…

免费分享:2000-2020年中国长时间序列夜间灯光数据集(附下载方法)

夜间灯光数据集直观反映了地表夜间灯光亮度,进而揭示了人类活动强度,为分析城市扩张、人口迁移、经济发展等提供了连续、全面的视角,有助于深入理解中国城市化的历史进程和未来趋势。 数据简介 基于DMSP/OLS第四版非辐射定标夜间年平均灯光强…

【HW必备】用友NC-Cloud存在17处漏洞合集

漏洞简介 NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构,技术先进、性能稳定、自主安全可控,支撑大中型以及超大型集团企业N层多site混合云部署方案,支持整个系统高可…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编…

MySQL数据库(四):视图和索引

在数据库管理中,视图和索引是两种关键工具,它们各自发挥独特的作用以优化数据查询和管理。视图通过简化复杂查询、提高数据安全性和提供数据抽象,帮助用户轻松访问数据。而索引则通过加速查询、确保数据唯一性以及优化排序和分组操作&#xf…

哪个牌子充电宝好?好用充电宝排行榜!精选充电宝排行榜

在如今这个科技飞速发展的时代,充电宝已然成为我们日常生活中不可或缺的伴侣。无论是出差旅行,还是日常通勤,我们都离不开它为我们的电子设备保驾护航。然而,面对市场上琳琅满目的充电宝品牌,您是否感到眼花缭乱&#…

ONLYOFFICE 桌面编辑器 8.1 强势来袭:解锁全新PDF编辑、幻灯片优化与本地化体验,立即下载!

目录 一、轻松编辑PDF文件 1.1 编辑文本 1.2 添加、旋转和删除页面 1.3 插入和修改对象 1.4 添加注释和标注 1.5 切换编辑或查看模式 1.6 创建和填写表单 二、用幻灯片版式快速修改幻灯片 2.1 选择或创建幻灯片版式 2.2 应用幻灯片版式 2.3 修改幻灯片版式 2.4 使用…

[经验] candy是什么意思英语翻译 #笔记#其他#职场发展

candy是什么意思英语翻译 1、candy的意思 Candy是英语中的一个词汇,意思是糖果、糖果制品。Candy意为果脯的意思也不是很常见。 糖果是一种富含糖分的食品,主要由砂糖、粘合剂和食用色素等组成。糖果的种类可以很多,有硬糖、软糖、巧克力、…

基于YOLOv8m的水族馆动物识别(附数据集和Coovally操作步骤)

本文主要内容:详细介绍了水族馆动物识别的整个过程,从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式,请先看检测效果 现状 随着水族馆行业的快速发展,对动物识别的需求日益增加。水族馆需要准确识别动物种…

【ARM】PK51如何将BL51链接器切换成LX51链接器

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决客户在使用PK51进行项目研发的时候,想要使用LX51链接器进行使用。 2、 问题场景 客户在使用51芯片进行开发的时候,发现工程中使用的是BL51链接器,而不是LX51链接器&#xff…

selenium前期准备

1. 驱动地址: a. chromedriver:https://googlechromelabs.github.io/chrome-for-testing/ b. https://registry.npmmirror.com/binary.html?pathchromedriver/ 下载好的驱动一般放在Python初始文件夹下,例如:D:\Python3.8 2. selenium原理…

基于SSM+Jsp的校园餐厅管理

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

OpenAI CTO米拉·穆拉提谈未来:AI一年半后达到博士水平

人工智能(AI)领域近年来的发展迅猛,特别是在大语言模型(LLM)的进步上。最近,OpenAI的首席技术官(CTO)米拉穆拉提(Mira Murati)在达特茅斯学院的一次采访中&am…