• Golang 结构化日志包 log/slog 详解(二):Handler


    上一篇文章介绍了推出 log/slog 包的背景、log/slog 包的简单介绍和使用,简单使用了 Info 函数,例如:

    1. package main
    2. import (
    3. "log/slog"
    4. )
    5. func main() {
    6. slog.Info("hello", "标题", "路多辛的博客")
    7. }

    这段代码输出的内容如下:

    2023/09/08 22:33:16 INFO hello 标题=路多辛的博客

    默认情况下,输出的日志格式是普通的 text 格式,这种格式并不是最适合日志系统的格式。日志系统一般采用 SON 格式或者 key=value 类型的文本格式,log/slog 包也提供了对应功能。

    Handler

    log/slog 包实现不同的输出格式是使用 Handler 来实现的,除了默认的 Handler, 还提供了以 JSON 格式输出的 JSONHandler 和以 key=value 格式输出的 TextHandler。如果要使用这两种 Handler,需要显式创建出来,示例代码如下:

    1. package main
    2. import (
    3. "log/slog"
    4. "os"
    5. )
    6. func main() {
    7. loggerText := slog.New(slog.NewTextHandler(os.Stderr, nil))
    8. loggerText.Info("hello", "标题", "路多辛的博客")
    9. loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, nil))
    10. loggerJSON.Info("hello", "标题", "路多辛的博客")
    11. }

    上述代码分别创建了一个使用 TextHandler 的 Logger 实例和一个使用 JSONHandler 的 Logger 实例,运行结果如下:

    1. time=2023-09-09T20:17:11.845+08:00 level=INFO msg=hello 标题=路多辛的博客
    2. {"time":"2023-09-09T20:17:11.846302+08:00","level":"INFO","msg":"hello","标题":"路多辛的博客"}

    也可以实现自己的 Handler,关于这块知识接下来的文章会专门介绍。

    HandlerOption

    创建 TextHandler 和 JSONHandler 对象时都可以接受 *HandlerOptions 类型的参数,用于设置日志级别、是否显示日志调用的源文件和行信息以及在记录属性之前修改属性。看个示例:

    1. package main
    2. import (
    3. "log/slog"
    4. "os"
    5. )
    6. func main() {
    7. opts := slog.HandlerOptions{
    8. AddSource: true,
    9. }
    10. loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
    11. loggerJSON.Info("hello", "标题", "路多辛的博客")
    12. }

    创建 JSONHandler 时,设置显示调用的源文件和行信息,运行看下结果:

    {"time":"2023-09-09T20:38:10.868172+08:00","level":"INFO","source":{"function":"main.main","file":"/Users/ning/projects/go/workspace/hello/bin.go","line":13},"msg":"hello","标题":"路多辛的博客"}

    可以看到通过 Info 方法输出的日志信息里面包含了打印日志的代码文件以及在源代码文件中的位置。

    设置默认 Logger

    可以通过 SetDefault 函数设置默认的 Logger 类型,设置默认 Logger 后打印日志的顶级函数,例如 Info、Warn、Error 等都会按照新的格式打印日志,看个示例:

    1. package main
    2. import (
    3. "log/slog"
    4. "os"
    5. )
    6. func main() {
    7. loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
    8. slog.SetDefault(loggerJSON)
    9. slog.Info("hello", "标题", "路多辛的博客")
    10. }

    运行看下输出结果:

    {"time":"2023-09-09T21:14:15.213592+08:00","level":"INFO","msg":"hello","标题":"路多辛的博客"}

    可以看到,使用 SetDefault 函数将默认 Logger 设置为了 loggerJSON,再调用 Info 函数后,就按照 JSON 格式打印日志了。

  • 相关阅读:
    ECG-Emotion Recognition(情绪识别)-- 数据集介绍WESAD&DREAMER
    layui子界面操作数据后主界面刷新怎么操作
    开发者视角下的直播实时美颜SDK:集成和自定义的方法
    4.1 数据库安全性概述
    docker镜像、容器 常用命令,容器端口映射
    前端-文件上传核心思想
    RocketMQ 的消费者类型详解与最佳实践
    阿里最新秋招面经,腾讯/美团/字节 Java中高级面试题
    【已解决】设置SSH主机:VS Code-正在本地下载 VS Code 服务器
    【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
  • 原文地址:https://blog.csdn.net/luduoyuan/article/details/132782522