go-logger v0.26.0:Go 灵活高效日志管理


go-logger  是一个轻量级的日志库,提供了灵活的日志记录功能,方便在应用程序中实现不同级别的日志输出.

特点:

  1. 简单易用go-logger 提供了一个简单直观的 API,使得开发者能够快速上手并集成到现有项目中。
  2. 灵活配置:支持代码直接配置日志的输出级别、输出目标(如标准输出、文件等)以及日志格式。
  3. 性能考虑:设计时考虑了性能因素,尽量减少日志记录操作的开销,通过优化内存等方式,优化日志性能。
  4. 日志分级:支持常见的日志级别划分,便于根据不同的环境(开发、测试、生产)调整日志的详细程度。

功能:

  • 日志级别设置:允许动态调整日志级别,以便在不同环境下控制日志的详细程度。
  • 格式化输出:支持自定义日志的输出格式,包括时间戳、日志级别、日志位置 等元素。
  • 文件数回滚:支持按照日志文件数自动文件回滚,并防止文件数过多。
  • 文件压缩:支持压缩归档日志文件。
  • 支持标准库log/slog日志文件管理:支持标准库文件切割,压缩等功能。
  • 外部处理函数:支持自定义外部处理函数。
  • 日志追踪:日志记录点可以回溯到程序入口点的所有函数调用序列,包括每一步函数调用的文件名,函数名,行号
  • 日志级别独立日志格式输出:支持不同日志级别 指定不同的日志输出格式。

Github

使用文档


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-47147965469 ns/op 336 B/op6 allocs/op
BenchmarkSerialZap-86755085316 ns/op 337 B/op6 allocs/op
BenchmarkSerialLogger
BenchmarkSerialLogger-4 7497744458 ns/op 152 B/op4 allocs/op
BenchmarkSerialLogger-8 7932084321 ns/op 152 B/op4 allocs/op
BenchmarkSerialLoggerNoFORMAT
BenchmarkSerialLoggerNoFORMAT-4 9771283767 ns/op 128 B/op2 allocs/op
BenchmarkSerialLoggerNoFORMAT-810000003669 ns/op 128 B/op2 allocs/op
BenchmarkSerialLoggerWrite
BenchmarkSerialLoggerWrite-48566173659 ns/op 112 B/op1 allocs/op
BenchmarkSerialLoggerWrite-8 10000003576 ns/op 112 B/op1 allocs/op
BenchmarkSerialNativeGoLog
BenchmarkSerialNativeGoLog-48921724488 ns/op 232 B/op2 allocs/op
BenchmarkSerialNativeGoLog-87982914327 ns/op 232 B/op2 allocs/op
BenchmarkSerialSlog
BenchmarkSerialSlog-4 6342285602 ns/op 328 B/op6 allocs/op
BenchmarkSerialSlog-8 6461915481 ns/op 328 B/op6 allocs/op
BenchmarkSerialSlogAndLogger
BenchmarkSerialSlogAndLogger-46268985671 ns/op 328 B/op6 allocs/op
BenchmarkSerialSlogAndLogger-86578205622 ns/op 328 B/op6 allocs/op
BenchmarkParallelZap
BenchmarkParallelZap-44304727818 ns/op 336 B/op6 allocs/op
BenchmarkParallelZap-84494027771 ns/op 337 B/op6 allocs/op
BenchmarkParallelLogger
BenchmarkParallelLogger-4 6398265398 ns/op 152 B/op4 allocs/op
BenchmarkParallelLogger-8 6043085532 ns/op 152 B/op4 allocs/op
BenchmarkParallelLoggerNoFORMAT
BenchmarkParallelLoggerNoFORMAT-4 8067494311 ns/op 128 B/op2 allocs/op
BenchmarkParallelLoggerNoFORMAT-8 7902844592 ns/op 128 B/op2 allocs/op
BenchmarkParallelLoggerWrite
BenchmarkParallelLoggerWrite-47646104141 ns/op 112 B/op1 allocs/op
BenchmarkParallelLoggerWrite-88802224079 ns/op 112 B/op1 allocs/op
BenchmarkParallelNativeGoLog
BenchmarkParallelNativeGoLog-46091345652 ns/op 232 B/op2 allocs/op
BenchmarkParallelNativeGoLog-85882015806 ns/op 232 B/op2 allocs/op
BenchmarkParallelSLog
BenchmarkParallelSLog-4 6208785624 ns/op 328 B/op6 allocs/op
BenchmarkParallelSLog-8 6364485532 ns/op 328 B/op6 allocs/op
BenchmarkParallelSLogAndgoLogger
BenchmarkParallelSLogAndgoLogger-46123145612 ns/op 328 B/op6 allocs/op
BenchmarkParallelSLogAndgoLogger-86334265596 ns/op 328 B/op6 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的效果相同,不会引入额外的性能开销

相關推薦

2023-10-09

go-logger v2.0.3发布,该版本主要针对性能进行优化.  github地址:https://github.com/donnie4w/go-logger  go的结构化日志库非常多,go-logger是比较早期开发的一个库, 以简洁为主要特征。simplelog是后期给数据库binlog日志开发的一个

2023-05-15

go-logger 是golang 的极简日志库 日志打印:调用 Debug(),Info(),Warn(), Error() ,Fatal() 日志级别由低到高 级别概念 功能用法类似java日志工具log4j 或 python的logging 设置日志打印格式: 如: SetFormat(FORMAT_SHORTFILENAME|FORMAT_DATE|FORMA

2024-05-29

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

2023-06-29

一款基于 Go 语言开发的强大部署工具,它提供了简单而灵活的方式来自动化部署应用程序和静态文件。让我们来看看 Goploy v1.15.0 带来了哪些激动人心的更新吧: 部署速度提升:Goploy v1.15.0 经过全面的优化,显著提高了部署速

2024-08-07

整合操作,支持数据读写分离,制定持久层编程规范。 灵活运用gdao,可以在持久层设计上,减少30%甚至50%以上的编程量,同时形成持久层的统一编程规范,减少持久层错误,同时易于维护和扩展。 gdao对于go语言,相当于 hib

2024-07-12

管理。 模型创建:支持根据不同资产类型自定义模型,灵活适应多种企业资产管理需求。 2. 凭据管理 凭据管理功能旨在帮助运维人员安全地管理各类凭证和认证信息。其主要特性包括: 凭据存储:支持各类凭据的加

2024-06-14

设备 新特性:设备驱动库,实现设备驱动的集中管理与高效复用。 新特性:增加 Github Action,自动部署文档站点 优化:点位配置增加属性:scale(点值系数换算)、decimails(小数保留位数) 优化:设备唯一标识由 sn 统一

2023-01-27

于用户或者 IP 的限速,连接数限制,动态获取上级。 灵活的上级分配,HTTP (S),SOCKS5,SPS 代理可以通过配置文件实现基于用户或者 IP 的限速,连接数限制,指定上级。 反向代理,支持直接把域名解析到 proxy 监听的 ip,然后

2024-08-20

件,MoonBit 可以在云计算开发中更好地利用模块化开发、灵活的部署和更新、资源优化、防止单点故障提高安全性、易于扩展和集成等特性,实现云计算应用场景中的突出优势,提高系统的灵活性和安全性,简化扩展和集成过程

2023-09-19

面(可删除、主电脑打开、图片浏览器等)  更简洁高效的操作界面  使用自研的 B0Boot-Go 框架重构代码,更简洁、更模块化  支持Windows、Linux、MacOS操作系统  支持端口(port)自定义配置  支持安

2023-04-08

CGI,那些寻求在服务器端开发中实现更高效率、安全性和灵活性的开发者可以真正从这种方法中受益。 WCGI 代表了一种改进的服务器端开发方法,它集成了 WebAssembly 的灵活性、安全性和性能。这项创新技术有可能重塑 Serverless&n

2023-10-14

Mware Greenplum 7 彰显了对创建和演进一个内在安全、成熟和灵活的基于SQL的在线分析处理(OLAP)平台的承诺。这一创新平台引入了一系列增强和新加功能,重点是针对各种数据类型(无论是结构化、半结构化还是非结构化数据)

2024-07-09

r 更新 优化提取索引的Batch大小到参数中:索引提取更灵活,效能提升显著。 这次更新不仅带来了全新功能,还对多个服务进行了优化和修复,旨在为您提供更加流畅和高效的使用体验。我们期待您的反馈,帮助我们不断

2024-06-22

。 支持多种数据库,包括 MySQL、PostgreSQL、达梦等,可灵活切换。 支持多种登录方式,包括账号密码、短信验证码、企业微信、钉钉、飞书、微信等,可灵活选择。 支持多租户模式,可实现不同业务系统之间的隔离,能