type
status
date
slug
summary
tags
category
icon
password
go1.21中,slog这一被Go语言团队精心设计的结构化日志包正式落地,本文将带领读者上手slog,体会其与传统log的差异。
WHY
在日志处理上,我们从前使用的log包缺乏结构化的输出,导致信息呈现出来的样子并非最适合人类阅读,而slog是一种结构化的日志,它可以用键值对的形式将我们需要的信息呈现出来,使得处理与分析日志变得更为容易。
HOW
1. 快速入门
以上是三条最简单的slog语句,其结果是这样的:
这三行代码中的第一个参数代表了log的message,我们可以看到,此时打印出来的日志信息是文本信息,那如何使得日志以非纯文本(比如json)展现呢?
2. TextHandler和JSONHandler
当我们想要日志以key-value格式呈现时,我们可以用下面这种方式:
最终结果:
当我们想要日志以json格式呈现时,我们可以使用下面这种方式:
最终结果:
slog.NewJSONHandler函数和slog.NewTextHandler函数都会返回一个JsonHandler结构体或是TextHandler的引用,这个结构体会被slog.new函数接受,该函数返回一个Logger结构体的引用,这个logger结构体包含Handler接口,拥有一系列日志相关函数,是我们最终打印日志的地方
如此,我们实现了基本的日志结构化输出。
3.日志配置
我们通过对slog.HandlerOptions配置,可以实现例如 是否输出日志来源 等设置;
此处笔者将该s设置为default情况,这样直接使用slog.info就可以用到之前的配置;
最终结果:
可以看到,由于AddSource被设置为true,我们的输出日志中多了source这一信息;
又由于NewTextHandler,所以日志是以键值对的形式输出的。
再来看这一段代码:
在slog配置中将Level设置为了LevelError,如此,将只能使用slog.error这一级别;
最终输出结果:
3. Group形式输出日志
上述代码首先生成一个叫做baseLogger的logger,然后在这个logger上调用方法WithGroup,并传入参数“TTT”,后面两行分别输出info和warn级别的日志;
最终结果如下:
可以看到,在groupLogger后面加上的键值对都被加在了TTT后面;
不过值得关注的是,slog是支持给logger自定义字段的,给一个logger加上一个属性之后,每次用这个logger输出日志,都会输出这个属性对应的键值对,而这个信息不会被包含在WithGroup函数传入的参数后面。
风格
个人认为一般不需要在msg中直接传入代码中的数据,msg中应该尽量直接使用constant常量,这样更可控。
WHAT
以下是slog大致的架构:
全文终。
- 作者:Alex
- 链接:https://nextme.one/wureny.eth/article/slog
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。