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

news2024/11/26 4:43:47
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.coloradmin.cn/o/1845705.html

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

相关文章

控制台瞬间干净!Vue 删除生产环境烦人的console.log打印,看完这个你就会了!

1.安装插件 需要安装babel-plugin-transform-remove-console插件 yarn add babel-plugin-transform-remove-console //或者 npm install babel-plugin-transform-remove-console2.配置babel.config.js // 所有生产环境,或者也可以配置测试环境 const prodPlugin …

文心一言 VS 讯飞星火 VS chatgpt (285)-- 算法导论21.2 4题

四、请给出图 21-3 所示操作序列的一个运行时间的渐近紧确界,假定使用链表表示和加权合并启发式策略。如果要写代码,请用go语言。 文心一言: 图 21-3 没有直接给出,但通常这种操作序列可能与某种数据结构(如并查集或…

计算机网络:网络层 - 虚拟专用网 VPN 网络地址转换 NAT

计算机网络:网络层 - 虚拟专用网 VPN & 网络地址转换 NAT 专用地址与全球地址虚拟专用网 VPN隧道技术 网络地址转换 NAT网络地址与端口号转换 NAPT 专用地址与全球地址 考虑到 IP 地址的紧缺,以及某些主机只需要和本机构内部的其他主机进行通信&…

【经验分享】Ubuntu 24.04 安装搜狗输入法(亲测有效)

【经验分享】Ubuntu 24.04 安装搜狗输入法(亲测有效) 先用如下Ubuntu22.04的安装方法进行安装 Ubuntu 22.04安装搜狗输入法 发现存在闪屏问题,那解决闪屏问题不就好了,解决方法如下: Ubuntu 23.10 搜狗拼音输入法闪屏…

OceanMind海睿思参与编写的《数据智能白皮书(2024年)》正式发布!

近日,由中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)牵头和组织,中新赛克海睿思作为TC601-WG16人工智能数据工作组合作伙伴参与编写的《数据智能白皮书(2024年)》正式发布。 中新赛克的卢云川、…

WebStorm 配置 PlantUML

1. 安装 PlantUML 插件 在 WebStorm 插件市场搜索 PlantUML Integration 并安装,重启 WebStorm 使插件生效。 2. 安装 Graphviz PlantUML 需要 Graphviz 来生成图形。使用 Homebrew 安装 Graphviz: 打开终端(Terminal)。确保你…

MySQL——索引(概述和结构介绍)

一、索引概述 1、索引(index)是帮助 MySQL 高效获取数据的数据结构(是一种有序的数据结构)。 2、在数据之外,数据库系统还维护着满足特定查找算法的数据结构。这些数据结构以某种方式引用(指向)数据,这样就可以在这些…

什么是联盟营销?独立站如何通过联盟营销提高转化率?

什么是联盟营销?独立站如何通过联盟营销提高转化率? 流量紧缺是跨境电商独立站永恒不变的难题,对于独立站卖家来说,广告投放、KOL引流等推广方式都能带来流量,但在广告流量越来越贵的今天,对于跨境电商独立…

构建一个强大的小型虚拟负载

您以前可能听说过“虚拟负载”一词,并想知道它的含义。 如果是这样,你并不孤单。虽然这个名字可能会让你了解它的作用,但它最初听起来可能令人困惑。 在这里,我们将深入探讨什么是虚拟负载,它们的作用以及如何选择适合…

王者荣耀图鉴皮肤怎么来的

王者荣耀图鉴皮肤怎么来的 最近一个王者荣耀图鉴开源很火 这个项目里面有很多的图片和音效资源,最简单的方法就是利用爬虫技术爬取这些图片资源。 第一步环境准备 Pyhton3.12macos系统 第二步查看王者荣耀官网 这些图片资源最简单的来源就是王者荣耀官网网站…

BFS:FloodFill算法

文章目录 FloodFill算法简介1.图像渲染2.岛屿数量3.岛屿的最大面积4.被围绕的区域总结 FloodFill算法简介 Flood Fill算法是一种用于确定与某个给定节点相连的区域的算法,常用于计算机图形学和图像处理。该算法可以用于诸如填充多边形、检测连通区域等任务。Flood …

淘宝订单物流信息获取:详细操作指南

一、前言 淘宝作为中国最大的电商平台之一,其订单管理系统为商家提供了丰富的接口,用于查询、管理和跟踪订单信息。本指南将详细介绍如何通过淘宝订单接口获取物流信息,帮助商家更好地管理订单和提供优质的物流服务。 二、获取物流信息的步…

低代码开发平台助力审计工作智能化

在数字化转型的浪潮中,低代码平台以其高效、灵活的特性,成为推动审计作业现代化的关键工具。审计作业低代码平台,通过简化开发流程,使得非技术背景的审计人员也能快速构建和部署审计应用,极大地提升了审计效率和质量。…

2024年十大数据集成工具和软件应用场景解析

详细阐述了十大数据集成工具及其优缺点: 数据集成的挑战 在当今的商业环境中,企业常常面临着数据分散、系统孤立的难题。传统的数据集成方式,就像一张复杂的蜘蛛网,难以理顺,令人头痛不已。 数据孤岛: 各个业务系统独立…

idea插件开发之一起来开发个打印方法入参和返回值的插件吧!

写在前面 源码 。 在开发过程中为了调试代码我们就可能就需要知道某个方法入参的值是什么,或者是返回值是什么。此时,我们的解决办法一般都是debug,但是debug的效率说实话其实是不高的,特别是不断的调试,不断的debug。…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十五)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 23 - 24 节) P23《22.Stage模型-基本概念》 一个应用可以有很多的能力,每个能力可以成为一个 Ability Mod…

百元价位真无线蓝牙耳机怎么选?四款宝藏平价机型盘点

在繁忙的现代生活中,真无线蓝牙耳机凭借其便携性、无线连接以及出色的音质,已经成为了许多人的必备配件,面对市场上琳琅满目的产品,如何在百元价位内挑选出一款性价比高、性能出色的真无线蓝牙耳机,确实是一个值得深思…

CATIA入门操作案例——理工男的浪漫:如何画一支玫瑰花送给女朋友?如何画一束玫瑰花?

目录 引出画玫瑰花画中间的花蕾画花瓣在零件设计模式下,厚轮廓画曲面实体 进行圆周阵列,完整径向对花瓣进行倒角再画一层花瓣画叶子在新的几何体里面绘制叶子 叶子阵列画花杆使用肋条画杆子 将两个零件体进行合并 一支玫瑰花画一束玫瑰花先平移一下复制粘…

异步任务使用场景与实践

异步任务使用场景 根据同步/异步方式划分场景,各场景下常用的技术方案如下: 方式实现特点缺点同步HTTP RPC Cache etc.指标:RT、QPS、TPS、缓存命中率 等; 关注(准)实时数据,用户可交互1. 处…

微服务架构-线上治理、线下治理与架构演进

目录 一、线上治理 1.1 概述 1.2 线上预案体系 1.2.1 概述 1.2.2 变更引起的故障 1.2.3 流量和容量变化引起的故障 1.2.4 依赖故障 1.2.5 机房、网络等硬件和环境故障 1.2.6 其他 1.2.7 故障的场景化 1.3 基于Metric的预案自动触发 1.4 治理参数动态调整 1.4.1 举例…