高性能日志库go-logger2.0.4—支持slog日志文件切割

go-logger v2.0.4 发布

该版本主要支持go原生日志库 log/slog 的日志文件切割,压缩等功能。

log/slog 库是 Go 语言用于结构化日志记录的一个强大工具,它旨在提升日志的管理和分析能力,同时保证代码的简洁性和执行效率。随着 Go 语言生态的发展,slog 正逐渐成为处理日志的新标准。

log/slog 专注于提供结构化日志的生成与处理逻辑,包括日志级别控制、键值对数据的记录等,但它并不直接内置文件处理功能,如日志文件的分割、压缩等。

go-logger 已经实现了较为完善的日志文件管理功能,可以直接与 slog 配合使用,作为log/slog库的日志文件管理支持库。

go-logger的使用文档
go-logger源码

go-logger 支持日志文件切分功能
  1. 小时月份切分日志文件
  2. 按文件大小(KB,MB,GB) 切分日志文件
  3. 按文件大小,文件数量切分日志文件
  4. 按文件大小切分日志文件,并压缩归档日志

go-logger 与 log/slog 配合使用

go-logger与log/slog配合使用非常简单:一行代码便可以实现:创建logger对象,并将其传入 log/slog 的Handler 创建函数。如下示例:

  • logFile, _ := logger.NewLogger().SetRollingFile("/d/cfoldTest", "slogLogger.txt", 100, logger.MB)  
    • 创建logger对象logFile,设置以文件大小为日志分割规则,日志文件每100M分割一次。

传入NewTextHandler函数创建slog handler

  • handler := slog.NewTextHandler(logFile, nil)
  • slogger := slog.New(handler)
  • slogger.Info("this is go-logger&slog  test data")

go-logger的日志文件管理功能
  1. SetRollingDaily() 按日期分割
    • log.SetRollingDaily("/d/foldTest", "log.txt")
      • 每天按 log_20221015.txt格式 分割;若 log_20221015.txt已经存在,则生成 log_20221015.1.txt ,log_20221015.2.txt等文件
  2. SetRollingByTime() 可按 小时,天,月 分割日志
    • log.SetRollingByTime("/d/foldTest", "log.txt",logger.MODE_MONTH)    按月份分割日志,跨月时,保留上月份日志,如:
      • log_202210.txt
      • log_202211.txt
      • log_202212.txt
    • log.SetRollingByTime("/d/foldTest", "log.txt",logger.MODE_HOUR)   按小时分割日志, 如:
      • log_2022101506.txt
      • log_2022101507.txt
      • log_2022101508.txt
  3. SetRollingFile() 指定文件大小分割日志
    • log.SetRollingFile("/d/foldTest", "log.txt", 300, logger.MB)    
      • 当文件超过300MB时,按log.1.txt,log.2.txt 格式备份
      • 目录参数可以为空字符串,则默认当前目录。
  4. SetRollingFileLoop() 指定文件大小分割日志,并指定保留最大日志文件数
    • log.SetRollingFileLoop("/d/foldTest", "log.txt", 300, logger.MB, 50)    
      • 设置日志文件大小最大为300M
      • 日志文件只保留最新的50个
  5. SetGzipOn(true) 压缩按大小分割规则的日志文件
    • 开启gzip后,将对以大小规则分割的日志文件进行gzip压缩归档。

详细用法参考  使用文档


slog使用go-logger作为日志文件管理库是否有性能损耗或多余内存消耗

压力测试

  • 测试环境:amd64  cpu: Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
  • 目的slog使用go-logger文件管理,与slog直接写文件的性能对比:
  • 串行压测
    • BenchmarkSerialSlog                              log/slog 直接写文件
    • BenchmarkSerialSlogAndLogger            go-logger +log/slog 写文件
  • 并行压测
    • BenchmarkParallelSLog                           log/slog 直接写文件
    • BenchmarkParallelSLogAndgoLogger     go-logger +log/slog 写文件

测试结果说明,大量的测试结果基本一致

由压测结果可以看到

使用 go-logger作为 log/slog的日志文件管理器与 log/slog直接写文件日志的内存分配完全一致性能上的差别微乎其微。可以看作一致。

结论:使用go-logger作为log/slog与直接写文件,从内存分配与性能上,效果一致


go-logger 与多个日志库的性能压力测试数据

串行压测

并行压测

测试结果说明:

  • 测试环境配置:cpu: Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
  • 串行压测
日志库测试方法日志库运行次数ns/opB/opallocs/op说明
BenchmarkSerialZapzap134078052493376uber开源go日志库
BenchmarkSerialLoggergo-logger16818124226641go-logger
BenchmarkSerialNativeGoLoglog164914043842322go内置log库
BenchmarkSerialSloglog/slog134892254923286go内置slog库
BenchmarkSerialSlogAndLoggerslog & go-logger127859454993286go-logger作为slog的日志文件管理器

  • 并行压测
日志库测试方法日志库运行次数ns/opB/opallocs/op说明
BenchmarkParallelZapzap79535171723376uber开源go日志库
BenchmarkParallelLoggergo-logger10000005697641go-logger
BenchmarkParallelNativeGoLoglog100000055782322go内置log库
BenchmarkParallelSLoglog/slog100000054553286go内置log/slog库
BenchmarkParallelSLogAndgoLoggerslog & go-logger100000055073286go-logger作为slog的日志文件管理器

  • 日志文件数据,每一行为一个日志库的打印数据,可以看出它们的打印内容总长度是一致的。
2024-05-13T16:41:27.696+0800    DEBUG   logtest/benchmark_test.go:121   >>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[DEBUG]2024/05/13 16:41:32 benchmark.go:797: >>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[DEBUG]2023/06/10 01:25:55.028277 log_test.go:46:>>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[DEBUG]2023/06/10 01:25:55.028277 log_test.go:55:>>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[debug]2024/05/13 16:41:46.839928 benchmark_test.go:164: >>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
time=2024-05-13T16:41:51.637+08:00 level=INFO source=benchmark_test.go:182 msg=>>>aaaaaaaaaaaaaaaaaaaaaa
time=2024-05-13T16:41:56.255+08:00 level=INFO source=benchmark_test.go:200 msg=>>>aaaaaaaaaaaaaaaaaaaaaa

测试结果
  • 说明:go-logger的内存使用做了优化,因此,比其他日志库和直接写文件都分配更少的内存。
  • 在高并发的场景中,zap的性能相对较低,其他日志库差没有明显差别;
  • 在非高并发场景中,go-logger的性能比其他日志库稍高。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单聊聊分布式和集群

前言 分布式和集群,我们都听的比较多,分布式系统和集群的概念对于刚进入职场的小伙伴可能不是很清楚,这篇文章我们就一起看看两者到底是什么,有什么区别。 什么是分布式系统? 先看下书面解释: 分布式系统…

学习笔记-C++

目录 1、何为常量 2、关键字 3、实型 4、水平制表符 5、string字符串 6、C中的三目运算符 7、随机数种子 8、结构体 9、各的区 10、引用 11、函数默认参数 12、函数占位参数 13、函数重载 14、私有属性 15、让另一个类作为本类的成员 16、声明和实现的文件…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.7讲 GPIO中断实验-编写按键中断驱动

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

初识Django

day15 初识Django Python知识点:函数、面向对象。前端开发:HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。 Python的Web框架: Flask,自身短小精悍 第三方组件。Django,内部已集成了很多组件 第三方组件。…

GM812条码模块的产品说明

1 模块尺寸 引脚定义 (单位:mm) 接口定义:规格 1.25*6Pin 接口说明: a) UART 缺省波特率为 9600bps,数据格式:8 位数据位,1 位停止位,无校验位。 b) 如果上位机是 MCU(3.3V&#x…

Java面试八股之Java中有哪些原子类,原理是什么

Java中有哪些原子类,原理是什么 AtomicInteger 和 AtomicLong: 用于对整数(int)和长整数(long)进行原子操作。 原理:它们内部封装了一个整型或长整型变量,并通过使用Unsafe类提供…

括号生成[中等]

优质博文:IT-BLOG-CN 一、题目 数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())(…

项目管理-案例重点知识(干系人管理)

项目管理:每天进步一点点~ 活到老,学到老 ヾ(◍∇◍)ノ゙ 何时学习都不晚,加油 四、干系人管理 案例重点知识 干系人管理 案例 重点内容: (1)权力利益方格、权力影响方格&#xff…

GPT-4o“成精了”:推测技术原理,附送“美国湾区”小道消息

原创:谭婧 如果你能跟上技术发展,那大多数技术提升都是按部就班, 偶而会有突破性进展。 如果你仅仅吃瓜,那OpenAI的所有新闻, 你都可以写成: “改写历史”“干翻所有”“颠覆世界”。 真的颠覆世界了吗&…

ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处

1.需求分析: 就敌人ai而言,追踪到敌人有可能丢失目标,丢失目标后应该能返回原来位置,实现这一功能。 2.操作实现: 1.思路:利用clear value函数,禁用掉当前的追踪功能,执行之后的返…

Git项目管理——提交项目和版本回退(二)

个人名片: 🎓作者简介:嵌入式领域优质创作者🌐个人主页:妄北y 📞个人QQ:2061314755 💌个人邮箱:[mailto:2061314755qq.com] 📱个人微信:Vir2025WB…

SSL证书对于网络安全的重要作用

SSL证书是一种数字证书,它通过加密技术确保了客户端(如浏览器)与服务器之间的数据传输安全。当一个网站安装了SSL证书后,用户在浏览器地址栏中可以观察到HTTPS(超文本传输安全协议)前缀和挂锁图标&#xff…

聚鼎科技:装饰画行业到底怎么样

在当代社会,随着人们审美水平的提升和生活品质的追求,装饰画行业呈现出蓬勃的发展态势。这一行业不仅关系到文化艺术的传承与创新,也与市场经济紧密相连,其前景值得深入探讨。 装饰画行业的市场潜力巨大,它贯穿于家居装…

Git使用(4):分支管理

一、新建分支 首先选择Git -> Branches... 然后选择 New Branch,输入新分支名称,例如dev。 可以看到右下角显示已经切换到新建的dev分支了。 push到远程仓库,可以看到新添加的分支。 二、切换分支与合并分支 为了演示合并分支&#xff0c…

【opencv】答题卡判分实验

实验环境: anaconda、jupyter notebook 实验用的包:numpy、matplotlib、opencv 实验的目的还是以熟悉图像的透视变换、轮廓特征提取为主要目的 关于如何判断答题卡被选项:通过几个覆盖备选项的掩膜与原二值图像想与,最终整个图像…

Python100个库分享第23个—wordcloud(词云图)

目录 专栏导读库的介绍库的安装基础使用1:将TXT文本转为词云图基础使用2:使用自定义字体和形状基础使用3:中文词云图停用词(中英文版)-代码是中文版总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0…

JavaWeb--18 tlias-web-management 登录认证

登录认证 1 登录功能功能开发 2 登录校验2.1 问题分析2.2 会话技术CookieSession令牌技术 2.3 JWT令牌介绍生成和校验登录下发令牌 2.4 过滤器Filter拦截路径过滤器链 登录校验-Filter 2.5 拦截器InterceptorInterceptor详解执行流程 登录校验- Interceptor 3 异常处理3.1 当前…

文本分类TextRCNN模型(pytorch实现)

文本分类TextRCNN模型 RCNN简介TextRCNN模型介绍TextRCNN代码(文本10分类) RCNN简介 从之前的文章中介绍过RNN的优点是能够捕捉到序列的时序信息,这可能有利于捕获长文本的语义。但是RNN对于文本序列后面的单词获取到的语义会更多&#xff0…

Python 全栈体系【四阶】(四十五)

第五章 深度学习 十、生成对抗网络(GAN) 1. 图像生成技术概述 1.1 什么是图像生成技术 图像生成技术是指利用机器学习或深度学习等人工智能技术,通过训练模型来生成逼真的图像。这些技术可以根据给定的输入,生成与真实图像相似…

线性系统(二)

线性系统(二) 1.直观理解线性方程组结构2. 不同解的结论3. 更一般的高斯-约旦消元法4.齐次线性方程组 链接: 线性系统(一) 1.直观理解线性方程组结构 长这样,方程就有解,即相交坐标。 长这样,…