Rust 高性能日志库 tklog 0.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)

版本性能基准测试


相關推薦

2024-08-27

tklog是rust高性能结构化日志库 易用,高效,结构化,控制台日志,文件日志,文件切割,文件压缩,同步打印,异步打印 功能 功能支持:控制台日志,文件日志,同步日志,异步日志 日志级别设置:提供与标准库同级

2024-05-29

如果是格式化日志输出,则为4µs/op以上。(可以参考《 高性能日志库go-logger v2.0.3》中对各日志库的压测数据)。 在异步场景中,tklog提供了对应的方法,支持异步调用。异步方法最大的好处并非在性能上,而是它不会阻塞所在

2024-06-04

tklog是rust高性能结构化日志库,支持同步日志,异步日志,支持自定义日志的输出格式,支持按时间,按文件大小分割日志文件,支持日志文件压缩备份,支持官方日志库标准API tklog 0.0.3版本主要更新 tklog实现了官方Log接

2024-03-30

官方建议尽快升级。RediSearch 是 RedisLabs 团队开发的一个高性能全文搜索引擎,可作为一个 Redis Module 运行在 Redis 上。 Details Bug 修复: #4481GEOSHAPE上的查询语法仅接受前缀而非完整谓词 (MOD-6663) #4513 数字查询中的FT.CURSOR

2024-01-04

官方建议尽快升级。RediSearch 是 RedisLabs 团队开发的一个高性能全文搜索引擎,可作为一个 Redis Module 运行在 Redis 上。 Details Bug 修复: #4287 从副本同步时重新索引过程会由于内部索引变量初始化而导致崩溃(MOD-6337、MOD-6

2023-06-22

Rust 项目宣布成立新的顶级治理机构:领导委员会(Rust Leadership Council)。该领导委员会的成立,标志着此前老是闹幺蛾子的 Rust 核心团队和临时领导者职位都将被取消,此后将由 Rust 理事承担顶级治理问题的责任。 背景提要

2024-08-12

,其它应用配置更新后,无中断式的优雅重启程序 访问日志的模板化配置,已支30多个相关属性的配置,可按需指定输出各种参数与指标 WEB形式的管理后台界面,无需学习,简单易用 开箱即用的let's encrypttls证书,仅需配置

2024-08-15

以使用迭代器函数作为range表达式,如func(func(K) bool)。这支持用户自定义任意序列的迭代器。标准库的slices和maps包也添加了支持迭代器的新功能。 泛型类型别名预览: Go 1.23包含了对泛型类型别名的预览支持。 二. 工具链改进

2023-04-09

许在 Playground 中分享代码的弹出窗口 现在有一个特殊的设置,允许你控制粘贴内容的位置。 一个新的设置允许你配置 IDE,使其仅在你选择代码时以小圆点形式显示空白处。 更新了 Typo 检查,使它不再检查哈希值和特殊值

2023-04-18

码库,而不是拒绝由于之前存在的代码库。 增加了跟踪日志中的调试输出。 不完全下载:在下载完成之前使用临时目录,从而避免部分下载问题。 诊断 归档不再提供生命周期事件作为数据源,仅提供“检查”和“日志

2022-08-20

据的建模和查询,同时保留了经典关系数据库的可靠性和高性能。 在 EdgeDB 出现之前,使用传统关系数据库搭建应用程序往往需要用到各种关系对象映射(ORM)和额外的中间件,它们曾经是数据建模、迁移和查询所必不可少的

2024-06-22

可配置等能力。 IPC支持异步消息发送方信息、并提供高性能读写共享内存的JS北向接口能力。 IPC_Core和IPC_Single公共部分解耦,持续优化内存使用。 分布式数据管理 Preferences支持可序列化为JSON的Object类型,及基于key

2023-04-03

:ADD_UNSIGNED_TO_INTEGER_WITH_INVALID_MAX_VALUE #14891 更好地支持内联 allOf/anyOf/oneOf 模式#14887 [openapi-normalizer] 添加新规则为所有操作设置标签#14794 添加规则以简化 oneOf/anyOf #14777 添加规则以简化 boolean enum #14764 [openap

2024-08-09

构。 生成的代码基于go语言,使用gin作为web框架。目前支持MariaDB,MySQL,PostgreSQL和Oracle四种数据库。支持生成Vue和ElementUI的基于Node.js的独立前端。支持Excel,PDF两种数据导出格式。 项目图片 最新大版本号 正在研发的最新大版