Golang Slog日志库
在使用Golang的slog日志库时,如何自定义日志的输出格式?比如我想让日志包含时间戳、日志级别和调用者信息,但默认的JSON格式不太符合需求。另外,slog的性能开销如何,相比zap或logrus这类第三方库有什么优势?
        
          2 回复
        
      
      
        Golang slog 是 Go 1.21 新增的结构化日志库,支持级别(Debug、Info、Warn、Error)和键值对输出。相比 log 包,slog 更易集成 JSON 格式和日志收集系统,适合现代应用开发。
更多关于Golang Slog日志库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go 1.21 引入了新的结构化日志库 slog,作为 log/slog 包提供。它支持结构化、分级日志记录,比传统的 log 包更强大。
主要特性
- 结构化日志:支持键值对形式记录日志
 - 日志级别:Debug、Info、Warn、Error
 - 多种输出:支持文本和 JSON 格式
 - 高性能:设计时考虑了性能优化
 
基本使用
package main
import (
    "log/slog"
    "os"
)
func main() {
    // 文本格式输出
    textLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
    slog.SetDefault(textLogger)
    
    slog.Info("用户登录", "user_id", 123, "ip", "192.168.1.1")
    
    // JSON 格式输出
    jsonLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    slog.SetDefault(jsonLogger)
    
    slog.Warn("磁盘空间不足", "usage", 95, "threshold", 90)
    
    // 带级别的日志方法
    slog.Debug("调试信息")
    slog.Error("错误发生", "err", "文件不存在")
}
自定义配置
func main() {
    // 自定义 Handler
    handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
        Level: slog.LevelDebug, // 设置日志级别
        AddSource: true,        // 添加源代码位置
    })
    
    logger := slog.New(handler)
    
    // 使用 With 添加公共字段
    logger = logger.With("app", "myapp", "version", "1.0.0")
    
    logger.Info("应用启动")
    logger.Error("处理失败", "request_id", "req-123")
}
日志级别控制
func main() {
    handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
        Level: slog.LevelWarn, // 只记录 Warn 及以上级别
    })
    
    logger := slog.New(handler)
    
    logger.Debug("这条不会输出")  // 被过滤
    logger.Info("这条也不会输出") // 被过滤
    logger.Warn("这条会输出")    // 会输出
    logger.Error("这条也会输出")  // 会输出
}
性能优化技巧
- 避免在日志调用中执行复杂计算
 - 使用 
slog.Group分组字段 - 在 Debug 级别使用 
slog.DebugContext 
slog 是 Go 官方推荐的现代日志解决方案,适合新项目和重构现有日志系统。
        
      
                    
                    
                    
