• 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 格式打印日志了。

  • 相关阅读:
    【Qt炫酷动画】demo02-仿苹果对话框淡入淡出的动画
    38.cuBLAS开发指南中文版--cuBLAS中的Level-2函数her2()
    飞桨模型转ONNX模型教程
    开源美颜滤镜SDK代码解析
    Win11怎么以管理员身份运行?Win11以管理员身份运行的设置方法
    线上问题定位分析宝典-Arthas篇
    聚N-乙烯基乙酰胺接枝丙烯腈/苯乙烯聚合物微球PNVA-g-PAN/PSt的制备与表征过程
    Android系统10 RK3399 init进程启动(四十三) ROM定制开机自启动服务(C++程序)
    华为云业务部署实践
    【leetcode热题Hot100】——LRU缓存
  • 原文地址:https://blog.csdn.net/luduoyuan/article/details/132782522