Go1.21:exp/slog日志库初试

138 阅读1分钟

前言

Golang官方在1.21版本提供了实验性的日志库exp/slog,旨在提供更高级、更灵活的日志记录功能。本文将简介其特性、常见基础用法。

在1.21前,因为标准库太过于简单,比如缺少:

  1. 日志分级: 比如Error、Warn、Info、Debug
  2. 结构化: 比如Json、Xml
  3. 拓展性等 经过n年,官方终于给出了新的统一标准库,让我们看看slog做了对这些特性的支持。

Quick Start

升级Golang版本1.21,引入log/slog

"log/slog"

或者安装

go get golang.org/x/exp/slog 

以一个简单的记录http请求的例子,来看看slog是如何使用的

package main

import (
    "net/http"
    "os"
    "time"

    "golang.org/x/exp/slog"
    //"log/slog"
)

func main() {
    r, _ := http.NewRequest("GET", "localhost", nil)

    logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: RemoveTime}))
    slog.SetDefault(logger)

    slog.Info("finished",
       slog.Group("req",
          slog.String("method", r.Method),
          slog.String("url", r.URL.String())),
       slog.Int("status", http.StatusOK),
       slog.Duration("duration", time.Second))
}

func RemoveTime(groups []string, a slog.Attr) slog.Attr {
    if a.Key == slog.TimeKey && len(groups) == 0 {
       return slog.Attr{}
    }
    return a
}
// Output:
// level=INFO msg=finished req.method=GET req.url=localhost status=200 duration=1s

上例中,首先,需要New一个Logger对象,其次,调用Info来记录一组Group不同数据类型Int、Duration。

不同的日志等级

接着我们来实验slog对不同日志等级的支持:

logger.Debug("This is a debug message")
logger.Info("This is an info message")
logger.Warn("This is a warning message")
logger.Error("This is an error message")
//OUTPUT
//level=INFO msg="This is an info message"
//level=WARN msg="This is a warning message"
//level=ERROR msg="This is an error message"

结构化日志

exp/slog还支持使用结构化日志,比如我们可以把日志输出格式改为Json

logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: RemoveTime}))

//OUTPUT
{"level":"INFO","msg":"finished","req":{"method":"GET","url":"localhost"},"status":200,"duration":1000000000}

总结

exp/slog是Golang官方提供的实验性日志库,具有区分不同错误等级、结构化等更高级、灵活的特性,更多特性在后续持续更新。

参考