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大致的架构:
notion image
 
全文终。
 
飞书群聊如何自动通知github仓库代码提交 利好小白的爬虫工具
Alex
Alex
某不知名青年|web2.5人士|喜欢猫与美少女
公告
type
status
date
slug
summary
tags
category
icon
password
有事请邮箱联系:alexwu7@outlook.com
🚀🚀🚀