golang结构化日志记录与处理插件库log的使用
golang结构化日志记录与处理插件库log的使用
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")
}
}
构建状态和文档
[]
[
]
[
]
[
]
更多关于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)
}
最佳实践
- 在应用启动时配置日志:
func setupLogger() *slog.Logger {
return slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
AddSource: true,
Level: slog.LevelDebug,
}))
}
- 传递上下文:
func handleRequest(ctx context.Context, logger *slog.Logger) {
logger.InfoContext(ctx, "handling request")
}
- 在生产环境中使用 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 语言中日志处理的首选方案。通过合理配置,可以满足从简单应用到复杂系统的各种日志需求。