高性能日志库 go-logger 2.0.4 发布,支持 slog 日志文件切割

来源: 投稿
作者: donnie4w
2024-05-14 11:11:00

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/op B/op allocs/op 说明
BenchmarkSerialZap zap 1340780 5249 337 6 uber开源go日志库
BenchmarkSerialLogger go-logger 1681812 4226 64 1 go-logger
BenchmarkSerialNativeGoLog log 1649140 4384 232 2 go内置log库
BenchmarkSerialSlog log/slog 1348922 5492 328 6 go内置slog库
BenchmarkSerialSlogAndLogger slog & go-logger 1278594 5499 328 6 go-logger作为slog的日志文件管理器

 

  • 并行压测
日志库测试方法 日志库 运行次数 ns/op B/op allocs/op 说明
BenchmarkParallelZap zap 795351 7172 337 6 uber开源go日志库
BenchmarkParallelLogger go-logger 1000000 5697 64 1 go-logger
BenchmarkParallelNativeGoLog log 1000000 5578 232 2 go内置log库
BenchmarkParallelSLog log/slog 1000000 5455 328 6 go内置log/slog库
BenchmarkParallelSLogAndgoLogger slog & go-logger 1000000 5507 328 6 go-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的性能比其他日志库稍高。
展开阅读全文
点击加入讨论🔥(1) 发布并加入讨论🔥
1 评论
4 收藏
分享
返回顶部
顶部