go-logger v0.26.0:Go 灵活高效日志管理
go-logger 是一个轻量级的日志库,提供了灵活的日志记录功能,方便在应用程序中实现不同级别的日志输出.
特点:
- 简单易用:
go-logger
提供了一个简单直观的 API,使得开发者能够快速上手并集成到现有项目中。 - 灵活配置:支持代码直接配置日志的输出级别、输出目标(如标准输出、文件等)以及日志格式。
- 性能考虑:设计时考虑了性能因素,尽量减少日志记录操作的开销,通过优化内存等方式,优化日志性能。
- 日志分级:支持常见的日志级别划分,便于根据不同的环境(开发、测试、生产)调整日志的详细程度。
功能:
- 日志级别设置:允许动态调整日志级别,以便在不同环境下控制日志的详细程度。
- 格式化输出:支持自定义日志的输出格式,包括时间戳、日志级别、日志位置 等元素。
- 文件数回滚:支持按照日志文件数自动文件回滚,并防止文件数过多。
- 文件压缩:支持压缩归档日志文件。
- 支持标准库log/slog日志文件管理:支持标准库文件切割,压缩等功能。
- 外部处理函数:支持自定义外部处理函数。
- 日志追踪:日志记录点可以回溯到程序入口点的所有函数调用序列,包括每一步函数调用的文件名,函数名,行号
- 日志级别独立日志格式输出:支持不同日志级别 指定不同的日志输出格式。
v0.26.0 更新内容
- 外部处理函数:支持自定义外部处理函数。
- 日志堆栈信息:日志记录点可以回溯到程序入口点的所有函数调用序列,包括每一步函数调用的文件名,调用函数,行号
- 日志级别独立日志格式输出:支持不同日志级别 指定不同的日志输出格式。
以下为新增功能详细说明
1. 外部处理函数:支持自定义外部处理函数.
-
- 功能由 bronya0 添加。这个功能很实用,在项目中可以简化程序的设计。比如捕获error日志后,发送email通知,推送错误日志信息,系统运行错误日志写入数据库等;可以由该函数完成。
CustomHandler func(lc *LogContext) bool
通过Option对象添加 CustomHandler 函数,go-logger的执行日志打印前,将执行CustomHandler 函数,如果CustomHandler 返回true,则继续执行go-logger的打印程序,如果CustomHandler 返回false,则不再执行打印程序。
示例:
func TestCustomHandler(t *testing.T) { SetOption(&Option{Console: true, CustomHandler: func(lc *LogContext) bool { fmt.Println("level:", levelname(lc.Level)) fmt.Println("message:", fmt.Sprint(lc.Args...)) if lc.Level == LEVEL_ERROR { return false //if error message , do not print } return true }, }) Debug("this is a debug message") Info("this is a info message") Warn("this is a warn message") Error("this is a error message") }
执行结果:根据CustomHandler的逻辑,Error日志返回false,则Error日志将不被打印出来
level: debug message: this is a debug message [DEBUG]2024/08/07 18:57:06 logging_test.go:126 this is a debug message level: info message: this is a info message [INFO]2024/08/07 18:57:06 logging_test.go:127 this is a info message level: warn message: this is a warn message [WARN]2024/08/07 18:57:06 logging_test.go:128 this is a warn message level: error message: this is a error message
2. 堆栈日志追踪 日志记录点可以回溯到程序入口点的所有函数调用序列,包括每一步函数调用的文件名,调用函数,行号
日志堆栈信息具备一定的日志追踪功能,可以追踪到调用打印日志函数的每个函数的层层嵌套关系,包括函数名,位置信息等
- 通过设置Option属性字段
Stacktrace
- 可以设置大于等于该级别的日志,日志记录点可以回溯到程序入口点的所有函数调用序列,包括每一步函数调用的文件名,函数名,行号
示例
func TestStacktrace(t *testing.T) { SetOption(&Option{Console: true, Stacktrace: LEVEL_WARN, Format: FORMAT_LEVELFLAG | FORMAT_DATE | FORMAT_TIME | FORMAT_SHORTFILENAME | FORMAT_FUNC}) Debug("this is a debug message") Stacktrace1() } func Stacktrace1() { Info("this is a info message") Stacktrace2() } func Stacktrace2() { Warn("this is a warn message") Stacktrace3() } func Stacktrace3() { Error("this is a error message") Fatal("this is a fatal message") }
执行结果
[DEBUG]2024/08/07 20:22:40 logging_test.go:TestStacktrace:151 this is a debug message [INFO]2024/08/07 20:22:40 logging_test.go:Stacktrace1:156 this is a info message [WARN]2024/08/07 20:22:40 logging_test.go:Stacktrace2:161#logging_test.go:Stacktrace1:157#logging_test.go:TestStacktrace:152#testing.go:tRunner:1689#asm_amd64.s:goexit:1695 this is a warn message [ERROR]2024/08/07 20:22:40 logging_test.go:Stacktrace3:166#logging_test.go:Stacktrace2:162#logging_test.go:Stacktrace1:157#logging_test.go:TestStacktrace:152#testing.go:tRunner:1689#asm_amd64.s:goexit:1695 this is a error message [FATAL]2024/08/07 20:22:40 logging_test.go:Stacktrace3:167#logging_test.go:Stacktrace2:162#logging_test.go:Stacktrace1:157#logging_test.go:TestStacktrace:152#testing.go:tRunner:1689#asm_amd64.s:goexit:1695 this is a fatal message
可以看到,Warn,Error,Fatal级别的日志,记录了调用日志打印函数的堆栈信息
由日志内容:
[FATAL]2024/08/07 20:22:40 logging_test.go:Stacktrace3:167#logging_test.go:Stacktrace2:162#logging_test.go:Stacktrace1:157#logging_test.go:TestStacktrace:152
可以看到FATAL日志调用函数 Stacktrace3 >Stacktrace2 >Stacktrace1 >TestStacktrace 等函数之间的调用关系
3. 日志级别独立日志格式输出:支持不同日志级别 指定不同的日志输出格式
通过 SetLevelOption
函数,可以设置不同日志级别的独立日志输出格式
示例
func TestLevelOptions(t *testing.T) { SetLevelOption(LEVEL_DEBUG, &LevelOption{Format: FORMAT_LEVELFLAG | FORMAT_TIME | FORMAT_SHORTFILENAME}) SetLevelOption(LEVEL_INFO, &LevelOption{Format: FORMAT_LEVELFLAG}) SetLevelOption(LEVEL_WARN, &LevelOption{Format: FORMAT_LEVELFLAG | FORMAT_TIME | FORMAT_SHORTFILENAME | FORMAT_DATE | FORMAT_FUNC}) Debug("this is a debug message") Info("this is a info message") Warn("this is a warn message") }
执行结果
[DEBUG]18:58:18 logging_test.go:175 this is a debug message [INFO]this is a info message [WARN]2024/08/07 18:58:18 logging_test.go:TestLevelOptions:177 this is a warn message
可以看到,Debug,Info,Warn 级别的日志,分别是不同的日志输出格式
性能测试
所有的功能增加与优化,都建立在不影响go-logger性能的基础上,当前版本性能压测数据如下:
cpu: Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz BenchmarkSerialZap BenchmarkSerialZap-4 714796 5469 ns/op 336 B/op 6 allocs/op BenchmarkSerialZap-8 675508 5316 ns/op 337 B/op 6 allocs/op BenchmarkSerialLogger BenchmarkSerialLogger-4 749774 4458 ns/op 152 B/op 4 allocs/op BenchmarkSerialLogger-8 793208 4321 ns/op 152 B/op 4 allocs/op BenchmarkSerialLoggerNoFORMAT BenchmarkSerialLoggerNoFORMAT-4 977128 3767 ns/op 128 B/op 2 allocs/op BenchmarkSerialLoggerNoFORMAT-8 1000000 3669 ns/op 128 B/op 2 allocs/op BenchmarkSerialLoggerWrite BenchmarkSerialLoggerWrite-4 856617 3659 ns/op 112 B/op 1 allocs/op BenchmarkSerialLoggerWrite-8 1000000 3576 ns/op 112 B/op 1 allocs/op BenchmarkSerialNativeGoLog BenchmarkSerialNativeGoLog-4 892172 4488 ns/op 232 B/op 2 allocs/op BenchmarkSerialNativeGoLog-8 798291 4327 ns/op 232 B/op 2 allocs/op BenchmarkSerialSlog BenchmarkSerialSlog-4 634228 5602 ns/op 328 B/op 6 allocs/op BenchmarkSerialSlog-8 646191 5481 ns/op 328 B/op 6 allocs/op BenchmarkSerialSlogAndLogger BenchmarkSerialSlogAndLogger-4 626898 5671 ns/op 328 B/op 6 allocs/op BenchmarkSerialSlogAndLogger-8 657820 5622 ns/op 328 B/op 6 allocs/op BenchmarkParallelZap BenchmarkParallelZap-4 430472 7818 ns/op 336 B/op 6 allocs/op BenchmarkParallelZap-8 449402 7771 ns/op 337 B/op 6 allocs/op BenchmarkParallelLogger BenchmarkParallelLogger-4 639826 5398 ns/op 152 B/op 4 allocs/op BenchmarkParallelLogger-8 604308 5532 ns/op 152 B/op 4 allocs/op BenchmarkParallelLoggerNoFORMAT BenchmarkParallelLoggerNoFORMAT-4 806749 4311 ns/op 128 B/op 2 allocs/op BenchmarkParallelLoggerNoFORMAT-8 790284 4592 ns/op 128 B/op 2 allocs/op BenchmarkParallelLoggerWrite BenchmarkParallelLoggerWrite-4 764610 4141 ns/op 112 B/op 1 allocs/op BenchmarkParallelLoggerWrite-8 880222 4079 ns/op 112 B/op 1 allocs/op BenchmarkParallelNativeGoLog BenchmarkParallelNativeGoLog-4 609134 5652 ns/op 232 B/op 2 allocs/op BenchmarkParallelNativeGoLog-8 588201 5806 ns/op 232 B/op 2 allocs/op BenchmarkParallelSLog BenchmarkParallelSLog-4 620878 5624 ns/op 328 B/op 6 allocs/op BenchmarkParallelSLog-8 636448 5532 ns/op 328 B/op 6 allocs/op BenchmarkParallelSLogAndgoLogger BenchmarkParallelSLogAndgoLogger-4 612314 5612 ns/op 328 B/op 6 allocs/op BenchmarkParallelSLogAndgoLogger-8 633426 5596 ns/op 328 B/op 6 allocs/op
压测结果分析
日志记录库和方法:
- Zap:这是一个uber开发的高性能日志库。
- Logger:go-logger日志库。
- Native Go Log: Go 内置的
log
包。 - Slog:这是 Go 1.19 引入的新标准日志库。
- Slog 和 Logger 结合:指同时使用go-logger作为slog的日志文件管理库。
1. 基准测试指标解释:
- -4 和 -8: 这些数字表示运行基准测试时使用的 CPU 核心数。
-4
表示使用 4 个核心,而-8
表示使用 8 个核心。 - ns/op: 每次日志记录操作所需的平均时间(以纳秒为单位)。
- B/op: 每次日志记录操作分配的平均内存大小(以字节为单位)。
- allocs/op: 每次日志记录操作产生的分配次数。
2. 串行日志记录结果:
- Zap: 在 4 核心上有 5469 ns/op 的性能,在 8 核心上有 5316 ns/op 的性能。
- go-logger: 在 4 核心上有 4458 ns/op 的性能,在 8 核心上有 4321 ns/op 的性能。
- go-logger(无格式): 在 4 核心上有 3767 ns/op 的性能,在 8 核心上有 3669 ns/op 的性能。
- go-logger(写操作): 在 4 核心上有 3659 ns/op 的性能,在 8 核心上有 3576 ns/op 的性能。
- Native Go Log: 在 4 核心上有 4488 ns/op 的性能,在 8 核心上有 4327 ns/op 的性能。
- Slog: 在 4 核心上有 5602 ns/op 的性能,在 8 核心上有 5481 ns/op 的性能。
- Slog 和 go-logger 结合: 在 4 核心上有 5671 ns/op 的性能,在 8 核心上有 5622 ns/op 的性能。
3. 并行日志记录结果:
- Zap: 在 4 核心上有 7818 ns/op 的性能,在 8 核心上有 7771 ns/op 的性能。
- go-logger: 在 4 核心上有 5398 ns/op 的性能,在 8 核心上有 5532 ns/op 的性能。
- go-logger (无格式): 在 4 核心上有 4311 ns/op 的性能,在 8 核心上有 4592 ns/op 的性能。
- go-logger (写操作): 在 4 核心上有 4141 ns/op 的性能,在 8 核心上有 4079 ns/op 的性能。
- Native Go Log: 在 4 核心上有 5652 ns/op 的性能,在 8 核心上有 5806 ns/op 的性能。
- Slog: 在 4 核心上有 5624 ns/op 的性能,在 8 核心上有 5532 ns/op 的性能。
- Slog 和go-logger 结合: 在 4 核心上有 5612 ns/op 的性能,在 8 核心上有 5596 ns/op 的性能。
4. 结果分析:
- Zap 在串行模式下提供了较好的性能,但在并行模式下的性能有所下降。
- go-logger(写操作) 在串行和并行模式下均表现出了最佳性能。
- go-logger(无格式) 通过移除格式化步骤显著提高了性能。
- Native Go Log 在串行和并行模式下性能接近于 go-logger。
- Slog 的性能与 Zap 和 go-logger 相比略逊一筹。
- Slog 和 go-logger 结合 的性能与 Slog 相近
5. 结论
- 从压测结果可以看到,在相同格式下,无论是串行还是高并发场景中,go-logger均表现出最佳性能和最小的内存分配。
- 内置库Log的性能 接近go-logger, 但它可能没有提供同样的灵活性.
- go-logger作为slog日志文件管理库,无论内存分配还是性能,都与单独使用slog的效果相同,不会引入额外的性能开销。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OceanBase 日志盘过小也会导致创建租户失败?
强烈建议OB日志盘大小是内存规格的3倍或以上。 > 作者:郑增权,爱可生 DBA 团队成员,OceanBase 和 MySQL 数据库技术爱好者。 > >爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 > >本文约 1300 字,预计阅读需要 5 分钟。 背景 某客户基于节约资源的想法,将日志盘设置的比较小,日志盘大小约为集群内存规格的1.5倍,当创建租户时,CPU和内存都充足的情况下,却存在报错"LOG_DISK resource not enough",我们尝试复现问题并定位原因。 环境信息 架构:单节点集群 版本:OceanBase:4.2.1.4 MySQL [oceanbase]> select svr_ip,status,build_version from __all_server; +--------------+--------+------------------------------------------------------------------------------------...
- 下一篇
🎉 DDD as a Service | Wow 3.11.6 发布
领域驱动|事件驱动|测试驱动|声明式设计|响应式编程|命令查询职责分离|事件溯源 官方文档:https://wow.ahoo.me/ 更新内容 特性(api):Condition添加valueAs以支持便捷的类型转换。 特性(core): 添加深拷贝deepCody扩展函数。 依赖(build): 更新kotlin到v2.0.10。 依赖(build): 更新ksp到v2.0.10-1.0.24。 依赖(build): 更新org.jetbrains.kotlin.kapt到v2.0.10。 依赖(test): 更新org.hamcrest:hamcrest到v3。 依赖(doc): 更新vitepress到v1.3.2。 简介 Wow是一个基于领域驱动设计和事件溯源的现代响应式CQRS微服务开发框架,历经多年生产环境验证。 旨在帮助开发者构建现代化的、高性能且易于维护的微服务应用程序,充分发挥领域驱动设计和事件溯源等模式优势的同时降低应用的复杂性以及实践成本。 值得一提的是,领域驱动设计和事件溯源并非微服务架构的专属,Wow框架不仅适用于微服务开发,同样也可用于构建基于领域驱动设计的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启