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
更多关于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)
性能优化建议
- 避免频繁创建Logger:重用Logger实例
- 使用WithFields:减少临时对象创建
- 级别检查:在记录前检查日志级别
- 异步处理:对于高吞吐场景使用异步处理器
完整示例
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应用程序提供了强大的日志记录能力,同时保持了高性能特性。