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 支持日志文件切分功能
-
按小时,天,月份切分日志文件
-
按文件大小 (KB,MB,GB) 切分日志文件
-
按文件大小,文件数量切分日志文件
-
按文件大小切分日志文件,并压缩归档日志
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 的日志文件管理功能
-
SetRollingDaily() 按日期分割
-
log.SetRollingDaily("/d/foldTest", "log.txt")
-
每天按 log_20221015.txt 格式 分割;若 log_20221015.txt 已经存在,则生成 log_20221015.1.txt ,log_20221015.2.txt 等文件
-
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
-
SetRollingFile() 指定文件大小分割日志
-
log.SetRollingFile("/d/foldTest", "log.txt", 300, logger.MB)
-
当文件超过 300MB 时,按 log.1.txt,log.2.txt 格式备份
-
目录参数可以为空字符串,则默认当前目录。
-
SetRollingFileLoop() 指定文件大小分割日志,并指定保留最大日志文件数
-
log.SetRollingFileLoop("/d/foldTest", "log.txt", 300, logger.MB, 50)
-
设置日志文件大小最大为 300M
-
日志文件只保留最新的 50 个
-
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 的性能比其他日志库稍高。
(责任编辑:IT) |