• Golang 结构化日志包 log/slog 详解(一):简单使用


    在 Go 1.21以前,官方提供的用于打印日志的包是标准库中的 log 包,该包虽然被广泛使用,但是缺点也很多,Go 社区要求改进的声音不断,主要有以下缺点:

    1. log 包只提供了基本的日志记录功能,功能相对太过简单,缺乏很多常用功能,例如日志级别控制、自定义日志格式等,这就导致在很多应用程序中无法满足日志处理的需求。
    2. 不能自定义输出目标,log 包默认将日志输出到标准错误(stderr)。如果需要将日志输出到其他地方,例如文件、队列或日志存储系统等,就需要自己实现或者使用第三方日志包来满足这些需求。

    Go 1.21新增的 log/slog 完美解决了以上问题,并且带来了很多其他很实用的特性。

    log/slog 包初体验

    log/slog 包提供结构化的日志记录功能,其中的日志记录包括时间、日志级别、消息和以键值对表示的各种其他属性。

    log/slog 包定义了一个 Logger 结构体,这个结构体提供了几个方法(如 Logger.Info、Logger.Warn、Logger.Error等)用于打印不同级别的日志。每个 Logger 都与一个 Handler 相关联,Logger 的打印日志方法根据参数创建一条日志并传递给 Handler,由 Handler 来决定如何处理这条日志。log/slog 包提供的打印日志的函数例如 Info、Warn、Error 等,是通过调用默认 Logger 中的相关方法来实现的。

    日志记录由时间、级别、消息和一组键值对组成,其中键是字符串,值可以是任何类型。看个简单的示例:

    1. package main
    2. import (
    3. "log/slog"
    4. )
    5. func main() {
    6. slog.Info("hello", "count", 3)
    7. }

    使用 slog.Info 函数创建了一条记录,包括打印时间、日志级别 Info、消息为“hello”和一个键为“count”值为 3 的键值对。运行结果如下:

    2023/09/07 22:00:33 INFO hello count=3

    Info 函数是通过调用默认 Logger 的 相关方法实现的,看一下 Info 函数的定义:

    1. // Info calls Logger.Info on the default logger.
    2. func Info(msg string, args ...any) {
    3. Default().log(context.Background(), LevelInfo, msg, args...)
    4. }

    可以看出调用了使用 Default 函数返回的 Logger 对象中的 log 方法实现的,Default 函数的定义如下:

    func Default() *Logger { return defaultLogger.Load().(*Logger) }

    defaultLogger 是 atomic.Value 类型,存储了默认的 Logger 类型,这个默认的 Logger 类型是通过 init 函数存储进去的,init 函数的定义如下:

    1. func ç() {
    2. defaultLogger.Store(New(newDefaultHandler(loginternal.DefaultOutput)))
    3. }

    默认的 Logger 打印日志的函数还有 Debug、Warn 和 Error。除了这几个很方便使用的函数外,还有一个 Log 函数,可以接受一个日志级别参数。看个简单的示例:

    1. package main
    2. import (
    3. "context"
    4. "log/slog"
    5. )
    6. func main() {
    7. slog.Log(context.Background(), slog.LevelInfo, "hello", "count", 3)
    8. }

    运行看下效果:

    2023/09/07 22:09:58 INFO hello count=3

    可以看出和 直接调用 Info 函数效果是一样的。

    Logger 类型

    看下 Logger 类型的定义,如下:

    1. type Logger struct {
    2. handler Handler // for structured logging
    3. }

    提供了 Log、Debug、Info、Warn 和 Error 这几个打印日志的方法。

  • 相关阅读:
    RNN简介(深入浅出)
    软信天成:AI驱动,化解企业数据的隐私之痛
    数据结构——单项链表
    数据中心走向绿色低碳,液冷存储舍我其谁
    Centos配置链路聚合bond的步骤
    全球与中国液体壁纸行业需求趋势及投资策略分析报告2022-2028年
    为何开发需要更多地考虑运维便利性
    真菌基因组——发现生物标记物领域
    2023年9月20日
    ssm南工二手书交易平台毕业设计源码172334
  • 原文地址:https://blog.csdn.net/luduoyuan/article/details/132747502