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

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

package main

import (
	"log/slog"
)

func main() {
	slog.Info("hello", "标题", "路多辛的博客")
}

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

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,需要显式创建出来,示例代码如下:

package main

import (
	"log/slog"
	"os"
)

func main() {
	loggerText := slog.New(slog.NewTextHandler(os.Stderr, nil))
	loggerText.Info("hello", "标题", "路多辛的博客")

	loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, nil))
	loggerJSON.Info("hello", "标题", "路多辛的博客")
}

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

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

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

HandlerOption

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

package main

import (
    "log/slog"
    "os"
)

func main() {
    opts := slog.HandlerOptions{
       AddSource: true,
    }
    loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
    loggerJSON.Info("hello", "标题", "路多辛的博客")
}

创建 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 等都会按照新的格式打印日志,看个示例:

package main

import (
	"log/slog"
	"os"
)

func main() {
	loggerJSON := slog.New(slog.NewJSONHandler(os.Stderr, &opts))
	slog.SetDefault(loggerJSON)
	slog.Info("hello", "标题", "路多辛的博客")
}

运行看下输出结果:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路多辛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值