golang结构化日志记录与处理插件库log的使用

golang结构化日志记录与处理插件库log的使用

Structured logging for golang

Package log 实现了一个简单的结构化日志API,设计灵感来自Logrus,专注于集中化日志处理。

处理器(Handlers)

log库支持多种日志处理器:

  • apexlogs - Apex Logs处理器
  • cli - 友好的命令行输出
  • discard - 丢弃所有日志
  • es - Elasticsearch处理器
  • graylog - Graylog处理器
  • json - JSON输出处理器
  • kinesis - AWS Kinesis处理器
  • level - 日志级别过滤器
  • logfmt - logfmt纯文本格式化器
  • memory - 测试用的内存处理器
  • multi - 多路分发处理器
  • papertrail - Papertrail处理器
  • text - 友好的彩色输出
  • delta - 输出日志调用之间的时间差和spinner

示例代码

以下是使用Apex Logs处理器的完整示例:

package main

import (
	"errors"
	"time"

	"github.com/apex/log"
)

func main() {
	// 创建带有字段的日志上下文
	ctx := log.WithFields(log.Fields{
		"file": "something.png",  // 文件字段
		"type": "image/png",      // 类型字段
		"user": "tobi",           // 用户字段
	})

	// 每隔200毫秒记录一次日志
	for range time.Tick(time.Millisecond * 200) {
		ctx.Info("upload")  // 信息级别日志
		ctx.Info("upload complete")  // 信息级别日志
		ctx.Warn("upload retry")  // 警告级别日志
		// 带错误的错误级别日志
		ctx.WithError(errors.New("unauthorized")).Error("upload failed")
		// 格式化错误日志
		ctx.Errorf("failed to upload %s", "img.png")
	}
}

构建状态和文档

[Build Status] [GoDoc] [License] [Status]


更多关于golang结构化日志记录与处理插件库log的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang结构化日志记录与处理插件库log的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 结构化日志记录与处理:log/slog 包详解

在 Go 1.21 中,标准库新增了 log/slog 包,提供了结构化日志记录功能。下面我将详细介绍如何使用这个强大的日志库。

基本使用

1. 简单示例

package main

import (
    "log/slog"
    "os"
)

func main() {
    slog.Info("hello world")
    slog.Error("oops", "status", 500, "err", "something went wrong")
    
    logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
    logger.Info("hello", "count", 3)
}

2. 日志级别

slog 定义了以下日志级别:

  • Debug (-4)
  • Info (0)
  • Warn (4)
  • Error (8)
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
    Level: slog.LevelWarn, // 只记录 Warn 及以上级别的日志
}))

logger.Debug("debug message") // 不会输出
logger.Warn("warning message") // 会输出

高级功能

1. 自定义日志属性

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger = logger.With("app", "myapp", "version", "1.0.0") // 添加全局属性

logger.Info("starting server", "port", 8080)
// 输出: {"time":"...","level":"INFO","msg":"starting server","app":"myapp","version":"1.0.0","port":8080}

2. 日志组

logger.Info("request processed",
    slog.Group("request",
        "method", "GET",
        "path", "/api/users",
    ),
    slog.Group("response",
        "status", 200,
        "size", 1024,
    ))

3. 自定义日志格式

type myHandler struct {
    slog.Handler
}

func (h *myHandler) Handle(ctx context.Context, r slog.Record) error {
    // 自定义日志格式
    fmt.Printf("[%s] %s: %s\n", 
        r.Time.Format("2006-01-02 15:04:05"),
        r.Level,
        r.Message)
    return nil
}

func main() {
    logger := slog.New(&myHandler{})
    logger.Info("custom format message")
}

性能优化

1. 避免不必要的日志计算

if logger.Enabled(context.Background(), slog.LevelDebug) {
    logger.Debug("debug info", "expensive", expensiveCalculation())
}

2. 使用 LogValue 接口优化日志属性

type User struct {
    Name string
    Age  int
}

func (u User) LogValue() slog.Value {
    return slog.GroupValue(
        slog.String("name", u.Name),
        slog.Int("age", u.Age),
    )
}

func main() {
    user := User{Name: "Alice", Age: 30}
    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    logger.Info("user info", "user", user)
}

最佳实践

  1. 在应用启动时配置日志
func setupLogger() *slog.Logger {
    return slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
        AddSource: true,
        Level:     slog.LevelDebug,
    }))
}
  1. 传递上下文
func handleRequest(ctx context.Context, logger *slog.Logger) {
    logger.InfoContext(ctx, "handling request")
}
  1. 在生产环境中使用 JSON 格式,在开发环境使用更易读的文本格式:
func newLogger(env string) *slog.Logger {
    var handler slog.Handler
    if env == "production" {
        handler = slog.NewJSONHandler(os.Stdout, nil)
    } else {
        handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
            AddSource: true,
        })
    }
    return slog.New(handler)
}

slog 包提供了强大而灵活的结构化日志记录功能,是 Go 语言中日志处理的首选方案。通过合理配置,可以满足从简单应用到复杂系统的各种日志需求。

回到顶部