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

3 回复

你应该在某个地方链接到基准测试代码。我刚刚浏览了一下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 的核心优势在于其极简和零分配设计,适合高性能应用。如果你的项目需要链式语法,可以考虑提交功能请求或自行封装。

回到顶部