Golang高性能日志库 - Onelog:极简设计、零内存分配的JSON日志工具
Golang高性能日志库 - Onelog:极简设计、零内存分配的JSON日志工具
francoispqt/onelog
onelog - 为Golang设计的极简、快速、零分配和模块化日志记录器
大家好,
刚刚发布了Onelog,一个高效易用的JSON日志记录器。它在内部使用了GoJay的编码器,并进行了封装使其更易于使用。
API与大多数常见的Go日志记录器不同,但非常高效。请告诉我您对它的看法,以及是否认为有必要添加类似以下的API:
logger.
Entry().
Info("message").
String("test", "test").
Write()
感谢您的反馈
更多关于Golang高性能日志库 - Onelog:极简设计、零内存分配的JSON日志工具的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你应该在某个地方链接到基准测试代码。我刚刚浏览了一下README,为额外字段传递闭包给我的感觉不应该是零分配。(也许在基准测试中是这样,因为传递的函数只使用常量,没有关闭任何东西?)
更多关于Golang高性能日志库 - Onelog:极简设计、零内存分配的JSON日志工具的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这很酷。我原本确定创建一个闭包会涉及内存分配,但至少在我现在尝试的简单情况下显然不是这样。👍
(这个帖子似乎被某人标记为垃圾信息;不确定原因。)
Onelog 确实是一个设计出色的高性能日志库,其零内存分配和 JSON 输出特性在需要低延迟和高吞吐量的场景中非常实用。以下是一个基本使用示例,展示如何初始化和记录日志:
package main
import (
"github.com/francoispqt/onelog"
)
func main() {
// 创建一个新的 Onelog 实例,输出到标准输出
logger := onelog.New(os.Stdout, onelog.ALL)
// 记录一条信息级别的日志,包含自定义字段
logger.InfoWithFields("用户登录成功", func(e onelog.Entry) {
e.String("username", "alice")
e.Int("user_id", 12345)
})
// 记录错误日志
logger.ErrorWithFields("数据库连接失败", func(e onelog.Entry) {
e.String("error", "connection timeout")
e.Int("attempt", 3)
})
}
输出结果将是结构化的 JSON,例如:
{"level":"info","message":"用户登录成功","username":"alice","user_id":12345,"time":"2023-10-05T12:34:56Z"}
{"level":"error","message":"数据库连接失败","error":"connection timeout","attempt":3,"time":"2023-10-05T12:35:01Z"}
对于你提到的链式 API 设计,虽然 Onelog 当前主要使用回调函数风格来避免内存分配,但实现类似 Entry().Info().String().Write() 的链式调用是可行的。这可以通过返回一个构建器对象来实现,在 Write() 方法中最终输出日志。例如:
type LogEntry struct {
logger *onelog.Logger
fields map[string]interface{}
}
func (l *LogEntry) String(key, value string) *LogEntry {
l.fields[key] = value
return l
}
func (l *LogEntry) Info(message string) {
l.logger.InfoWithFields(message, func(e onelog.Entry) {
for k, v := range l.fields {
switch val := v.(type) {
case string:
e.String(k, val)
case int:
e.Int(k, val)
}
}
})
}
这种扩展会增加一些复杂性,但能提供更灵活的 API 选择。Onelog 的核心优势在于其极简和零分配设计,适合高性能应用。如果你的项目需要链式语法,可以考虑提交功能请求或自行封装。

