golang高性能结构化日志记录与动态字段管理插件库xylog的使用

Golang高性能结构化日志记录与动态字段管理插件库xylog的使用

xylog是一个专为Golang设计的高性能结构化日志库,它结合了Python logging的设计理念和Zap的编码方法,提供了层级日志记录、结构化日志、动态字段管理等功能。

快速开始

你可以使用SimpleConfig轻松配置一个日志记录器:

var config = &xylog.SimpleConfig{
    Name:   "simple-logger",
    Level:  xylog.DEBUG,
    Writer: os.Stdout,
}

var logger, err = config.AddMacro("level", "levelname").Apply()
if err != nil {
    fmt.Println("An error occurred:", err)
    os.Exit(1)
}
defer xylog.Flush()

logger.Debug("logging message")
logger.Event("create-user").Field("username", "foo").
    Field("email", "bar@buzz.com").Field("Age", 25).Info()

// Output:
// level=DEBUG messsage="logging message"
// level=INFO event=create-user username=foo email=bar@buzz.com Age=25

完整配置

Logger

Logger是应用程序代码直接使用的日志记录器。Logger名称是点分隔的层次结构名称,如"a"、“a.b”、"a.b.c"等。

var logger = xylog.GetLogger("example")
defer xylog.Flush()

Handler

Handler负责生成日志消息。每个GetHandler调用返回相同的Handler实例。

var handler = xylog.GetHandler("handler")

Emitter

Emitter将日志消息写入指定的输出。目前仅支持StreamEmitter

var emitter = xylog.NewStreamEmitter(os.Stdout)

组合使用

handler.AddEmitter(emitter)
logger.AddHandler(handler)

日志级别

Logger和Handler都有自己的日志级别。如果日志级别低于设置的级别,消息将不会被记录。

logger.SetLevel(xylog.DEBUG)

logger.Debug("foo")
logger.Warning("bar")

// Output:
// message=foo
// message=bar

结构化日志

使用EventLogger可以记录包含多个字段的结构化日志:

logger.Event("add-user").Field("name", "david").Field("email", "david@dad.com").Info()

// Output:
// event=add-user name=david email=david@dad.com

可以添加永久字段到Logger或Handler:

logger.AddField("host", "localhost")
handler.AddField("port", 3333)

logger.Info("start server")

// Output:
// host=localhost port=3333 message="start server"

支持JSON格式:

import "github.com/xybor-x/xylog/encoding"

handler.SetEncoding(encoding.NewJSONEncoding())

logger.Warning("this is a message")
logger.Event("failed").Field("id", 1).Error()

// Output:
// {"message":"this is a message"}
// {"event":"failed","id": 1}

宏(Macros)

宏是每次记录日志时值都会变化的特殊字段:

handler.AddMacro("level", "levelname")

logger.Warning("this is a warning message")

// Output:
// level=WARNING message="this is a warning message"

过滤器(Filter)

Filter可用于Handler和Logger,提供比级别更复杂的过滤功能:

type NameFilter struct {
    name string
}

func (f *NameFilter) Filter(record xylog.LogRecord) bool {
    return f.name == record.Name
}

handler.AddFilter(&NameFilter{"example.user"})

var userLogger = xylog.GetLogger("example.user")
var serviceLogger = xylog.GetLogger("example.service")

userLogger.Warning("this is the user logger")
serviceLogger.Warning("this is the service logger")

// Output:
// message="this is the user logger"

层级日志记录器

Logger名称是层次结构的,可以在不同的应用区域设置公共Logger:

// common/setup.go
func init() {
    var emitter = xylog.NewStreamEmitter(os.Stderr)
    var handler = xylog.GetHandler("")
    handler.AddEmitter(emitter)
    handler.SetEncoding(encoding.NewJSONEncoding())
    handler.AddMacro("time", "asctime")
    handler.AddMacro("level", "levelname")

    var logger = xylog.GetLogger("parent")
    logger.AddHandler(handler)
    logger.SetLevel(xylog.WARNING)
}
// user/foo.go
import _ "common"

var logger = xylog.GetLogger("parent.user")
defer xylog.Flush()
logger.SetLevel(xylog.INFO)
logger.AddField("module", "user")

logger.Info("this is user module")
logger.Debug("this is a not logged message")

// Output:
// time=[time] level=INFO module=user message="this is user module"

性能基准

xylog在性能方面表现优异,以下是与其他流行日志库的对比:

记录一条消息和10个字段

Package Time Time % to zap Objects Allocated
⚡ zap 1707 ns/op +0% 5 allocs/op
🚀 xylog 3518 ns/op +106% 77 allocs/op

记录一条带有10个预定义上下文字段的消息

Package Time Time % to zap Objects Allocated
⚡ zap 140 ns/op +0% 0 allocs/op
🚀 xylog 416 ns/op +197% 6 allocs/op

记录静态字符串

Package Time Time % to zap Objects Allocated
⚡ zap 154 ns/op +0% 0 allocs/op
🚀 xylog 447 ns/op +190% 6 allocs/op

xylog提供了丰富的功能和良好的性能表现,是Golang项目中结构化日志记录的一个优秀选择。


更多关于golang高性能结构化日志记录与动态字段管理插件库xylog的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能结构化日志记录与动态字段管理插件库xylog的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang高性能结构化日志记录与动态字段管理 - xylog使用指南

xylog是一个专为Golang设计的高性能结构化日志库,支持动态字段管理和灵活的日志输出配置。下面我将详细介绍如何使用xylog进行高效的日志记录。

安装xylog

首先使用go get安装xylog:

go get github.com/xybor/xylog

基础使用

1. 简单日志记录

package main

import "github.com/xybor/xylog"

func main() {
    // 获取默认logger
    logger := xylog.GetLogger("main")
    
    // 不同级别日志
    logger.Debug("This is a debug message")
    logger.Info("This is an info message")
    logger.Warning("This is a warning message")
    logger.Error("This is an error message")
    logger.Critical("This is a critical message")
    
    // 格式化日志
    logger.Infof("User %s logged in at %v", "alice", time.Now())
}

2. 结构化日志记录

xylog支持结构化日志,可以附加任意字段:

logger.Info("User login", xylog.Field{
    Key:   "username",
    Value: "alice",
}, xylog.Field{
    Key:   "ip",
    Value: "192.168.1.1",
})

3. 性能优化写法

对于性能敏感场景,可以使用WithFields避免频繁创建Field对象:

fields := []xylog.Field{
    {Key: "username", Value: "alice"},
    {Key: "ip", Value: "192.168.1.1"},
}

logger.WithFields(fields).Info("User login")

高级功能

1. 动态字段管理

xylog支持动态字段,这些字段会在每次日志记录时重新计算:

logger := xylog.GetLogger("main").WithDynamicFields(
    func() []xylog.Field {
        return []xylog.Field{
            {Key: "timestamp", Value: time.Now().Unix()},
            {Key: "goroutine", Value: runtime.NumGoroutine()},
        }
    },
)

// 每次记录日志都会包含最新的goroutine数量和timestamp
logger.Info("System status")

2. 日志级别控制

// 设置日志级别
xylog.GetLogger("main").SetLevel(xylog.WARNING)

// 检查日志级别
if logger.IsEnabledFor(xylog.DEBUG) {
    logger.Debug("This will not be logged")
}

3. 日志处理器配置

xylog支持多种日志处理器:

// 创建文件处理器
fileHandler, _ := xylog.NewFileHandler("/var/log/app.log")

// 创建JSON格式化处理器
jsonHandler := xylog.NewJSONHandler()
jsonHandler.SetFormatter(xylog.JSONFormatter{})

// 添加处理器到logger
logger := xylog.GetLogger("main")
logger.AddHandler(fileHandler)
logger.AddHandler(jsonHandler)

4. 自定义日志格式

// 自定义格式
type MyFormatter struct{}

func (f *MyFormatter) Format(record xylog.LogRecord) string {
    return fmt.Sprintf("[%s] %s - %s", 
        record.Time.Format("2006-01-02 15:04:05"),
        record.Level.String(),
        record.Message)
}

// 应用自定义格式
handler := xylog.NewStreamHandler(os.Stdout)
handler.SetFormatter(&MyFormatter{})
logger.AddHandler(handler)

性能优化建议

  1. 避免频繁创建Logger:重用Logger实例
  2. 使用WithFields:减少临时对象创建
  3. 级别检查:在记录前检查日志级别
  4. 异步处理:对于高吞吐场景使用异步处理器

完整示例

package main

import (
    "os"
    "runtime"
    "time"
    "github.com/xybor/xylog"
)

func main() {
    // 配置根logger
    logger := xylog.GetLogger("app")
    logger.SetLevel(xylog.INFO)
    
    // 添加控制台输出
    consoleHandler := xylog.NewStreamHandler(os.Stdout)
    logger.AddHandler(consoleHandler)
    
    // 添加动态字段
    logger = logger.WithDynamicFields(func() []xylog.Field {
        return []xylog.Field{
            {Key: "goroutines", Value: runtime.NumGoroutine()},
            {Key: "time", Value: time.Now().Format(time.RFC3339)},
        }
    })
    
    // 业务逻辑
    for i := 0; i < 5; i++ {
        logger.WithFields([]xylog.Field{
            {Key: "iteration", Value: i},
            {Key: "square", Value: i * i},
        }).Info("Processing iteration")
        
        if i == 3 {
            logger.Error("Simulated error occurred")
        }
        
        time.Sleep(500 * time.Millisecond)
    }
}

xylog通过其结构化日志、动态字段和灵活的处理器系统,为Golang应用程序提供了强大的日志记录能力,同时保持了高性能特性。

回到顶部