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

  • 相关阅读:
    vivado查看报告和消息5
    2022年4月4日:使用 C# 迈出第一步--编写第一个C#代码
    LeetCode-剑指43-1-n整数中出现1的次数
    模糊测试面面观 | 车联网场景模糊测试解决方案
    从零到壹搭建一个商城架构--MySQL集群
    Python后端Flask学习项目实践---搭建一个问答网站
    Tomcat 自动清理日志
    Java实现简单的通讯录
    php的安装和卸载
    全媒体时代,企业新闻通稿应该怎么写更具传播性
  • 原文地址:https://blog.csdn.net/luduoyuan/article/details/132782522