Golang结构化日志包log/slog的使用详解

 更新时间:2023年09月08日 08:22:01   作者:路多辛  
官方提供的用于打印日志的包是标准库中的 log 包,该包虽然被广泛使用,但是缺点也很多,所以Go 1.21新增的 log/slog 完美解决了以上问题,下面我们就来看看log/slog包的使用吧

前言

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

log 包只提供了基本的日志记录功能,功能相对太过简单,缺乏很多常用功能,例如日志级别控制、自定义日志格式等,这就导致在很多应用程序中无法满足日志处理的需求。

不能自定义输出目标,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 中的相关方法来实现的。

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

package main
import (
    "log/slog"
)
func main() {
    slog.Info("hello", "count", 3)
}

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

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

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

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

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

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

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

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

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

package main
import (
    "context"
    "log/slog"
)
func main() {
    slog.Log(context.Background(), slog.LevelInfo, "hello", "count", 3)
}

运行看下效果:

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

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

Logger 类型

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

type Logger struct {
    handler Handler // for structured logging
}

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

到此这篇关于Golang结构化日志包log/slog的使用详解的文章就介绍到这了,更多相关go log/slog包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang结构化日志slog的用法简介

    golang结构化日志slog的用法简介

    日志是任何软件的重要组成部分,Go 提供了一个内置日志包(slog),在本文中,小编将简单介绍一下slog包的功能以及如何在 Go 应用程序中使用它,感兴趣的可以了解下
    2023-09-09
  • go get 和 go install 对比介绍

    go get 和 go install 对比介绍

    go install和go get都是Go语言的工具命令,但它们之间有一些区别。go get:用于从远程代码存储库(如 GitHub)中下载或更新Go代码包。go install:用于编译并安装 Go 代码包,本文go get和go install对比介绍的非常详细,需要的朋友可以参考一下
    2023-04-04
  • Golang使用DuckDB查询Parquet文件数据的操作代码

    Golang使用DuckDB查询Parquet文件数据的操作代码

    本文介绍DuckDB查询Parquet文件的典型应用场景,掌握DuckDB会让你的产品分析能力更强,相反系统运营成本相对较低,为了示例完整,我也提供了如何使用Python导出MongoDB数据,需要的朋友可以参考下
    2025-01-01
  • go语言中[]*int和*[]int的具体使用

    go语言中[]*int和*[]int的具体使用

    本文主要介绍了go语言中[]*int和*[]int的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go语言结合Gin框架快速实现分页查询接口

    Go语言结合Gin框架快速实现分页查询接口

    在开发 Web 应用时,分页查询 是非常常见的需求,在 Go 语言中,我们可以结合 GORM + Gin 框架,快速实现分页查询接口,下面我们来看看具体实现方法吧
    2025-08-08
  • VScode如何运行Go程序

    VScode如何运行Go程序

    文章详细介绍了如何配置Go开发环境,包括安装Go、配置GOPROXY、安装VSCode插件(如Go、CodeRunner)、创建项目、安装代码提示工具以及常用快捷键等
    2026-03-03
  • 初识Golang Mutex互斥锁的使用

    初识Golang Mutex互斥锁的使用

    在学习操作系统的时候,我们应该都学习过临界区、互斥锁这些概念,用于在并发环境下保证状态的正确性。在 Go语言 里面互斥锁是 sync.Mutex ,我们本篇文章就来学习下为什么要使用互斥锁、如何使用互斥锁,以及使用时的常见问题
    2022-10-10
  • Golang使用gin框架实现一个完整的聊天室功能

    Golang使用gin框架实现一个完整的聊天室功能

    由于我们项目的需要,我就研究了一下关于websocket的相关内容,去实现一个聊天室的功能,经过几天的探索,现在使用Gin框架实现了一个完整的聊天室+消息实时通知系统,感兴趣的小伙伴欢迎阅读本文
    2023-08-08
  • Golang中关于defer的盲区梳理

    Golang中关于defer的盲区梳理

    关于Go中的defer,是做什么的?执行顺序是怎么样的?相信学过Go语言的同学,已经不在陌生,今天就来讲讲其中需要掌握的几个知识点,希望对大家有所帮助
    2023-03-03
  • Windows下CMD执行Go出现中文乱码的解决方法

    Windows下CMD执行Go出现中文乱码的解决方法

    本文主要介绍了Windows下CMD执行Go出现中文乱码的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论