当前位置:首页 > 科技  > 软件

Go 1.21.0 中新增的结构化日志记录标准库 log/slog 详解

来源: 责编: 时间:2023-10-08 07:06:18 390观看
导读01 、介绍在 Go 语言项目开发中,我们通常需要查看日志来调试程序,所以日志的快捷搜索和过滤就会至关重要。因为 Go 标准库中的 log,它不是结构化日志格式,使用上并不方便,所以在 Go 1.21.0 中,Go 标准库新增结构化日志记录

01 、介绍

在 Go 语言项目开发中,我们通常需要查看日志来调试程序,所以日志的快捷搜索和过滤就会至关重要。2sK28资讯网——每日最新资讯28at.com

因为 Go 标准库中的 log,它不是结构化日志格式,使用上并不方便,所以在 Go 1.21.0 中,Go 标准库新增结构化日志记录包 log/slog,它支持键值对格式。2sK28资讯网——每日最新资讯28at.com

本文我们介绍 log/slog 的使用方式。2sK28资讯网——每日最新资讯28at.com

02、log/slog 使用方式

log/slog 的默认 logger 使用的是 log 的默认 logger,新增日志包 log/slog 和原始日志包 log 协同工作,使 log/slog 更易上手。2sK28资讯网——每日最新资讯28at.com

日志级别

log/slog 日志级别包括 Info、Debug、Warn 和 Error,log/slog 为它们分别提供了函数。2sK28资讯网——每日最新资讯28at.com

示例代码:2sK28资讯网——每日最新资讯28at.com

func main() { log.Println("This is log") slog.Debug("This is Debug Level") slog.Info("This is Info Level") slog.Warn("This is Warn Level") slog.Error("This is Error Level")}

输出结果:2sK28资讯网——每日最新资讯28at.com

2023/10/06 11:18:04 This is log2023/10/06 11:18:04 INFO This is Info Level2023/10/06 11:18:04 WARN This is Warn Level2023/10/06 11:18:04 ERROR This is Error Level

阅读上面这段代码,我们可以发现 log/slog 的输出结果和 log 的输出结果非常相似,只是在日志时间和日志消息之间多了日志级别。2sK28资讯网——每日最新资讯28at.com

因为 log/slog 的默认 logger 使用的是 log 的默认 logger。2sK28资讯网——每日最新资讯28at.com

除了上述 4 个不同日志级别的函数之外,还有一个函数 log,我们可以使用 log 函数替代上述 4 个函数。2sK28资讯网——每日最新资讯28at.com

示例代码:2sK28资讯网——每日最新资讯28at.com

func main() { slog.Log(context.Background(), -4, "This is Debug Level") slog.Log(context.Background(), 0, "This is Info Level") slog.Log(context.Background(), 4, "This is Warn Level") slog.Log(context.Background(), 8, "This is Error Level")}

输出结果:2sK28资讯网——每日最新资讯28at.com

2023/10/06 11:41:47 INFO This is Info Level2023/10/06 11:41:47 WARN This is Warn Level2023/10/06 11:41:47 ERROR This is Error Level

阅读上面这段代码,我们可以发现,log 函数通过参数定义日志级别,数字越大,级别越严重,并且不同级别之间,预留 4 个数字,我们可以定义其他日志级别。2sK28资讯网——每日最新资讯28at.com

log 函数与 4 个分别代表不同级别的函数之间,还有另外一个区别,它的第一参数是上下文,其实 4 个分别代表不同级别的函数也对应 4 个支持第一个参数是上下文的函数,分别是 InfoContext()、DebugContext()、WarnContext() 和 ErrorContext。2sK28资讯网——每日最新资讯28at.com

细心的读者朋友们可能发现了,为什么输出结果没有 Debug 级别的日志输出?2sK28资讯网——每日最新资讯28at.com

因为  log/slog 的默认 logger 的默认日志级别是 Info,如果我们想要使用日志级别 Debug,可以新建 logger,并把默认日志级别设置为 Debug。2sK28资讯网——每日最新资讯28at.com

键值对

前面我们已经说过 log/slog 支持键值对格式,但是上述示例代码中并没有体现,接下来,我们以 Info 函数为例,介绍 log/slog 怎么输出键值对格式。2sK28资讯网——每日最新资讯28at.com

func main() { slog.Info("This is Info Level", "uid", 1001)}

输出结果:2sK28资讯网——每日最新资讯28at.com

2023/10/06 11:58:07 INFO This is Info Level uid=1001

阅读上面这段代码,我们发现 Info 函数中,在日志消息之后新增两个参数,分别是 uid 和 1001,它们就是键值对的 key 和 value。2sK28资讯网——每日最新资讯28at.com

Logger 修改输出日志格式

因为 log/slog 默认使用 log 的默认 logger,所以输出格式就是我们上面看到的文本格式。2sK28资讯网——每日最新资讯28at.com

我们可以使用内置的 Handler NewTextHandler 和 NewJSONHandler创建新的 Logger,来输出新文本格式和 json 格式。2sK28资讯网——每日最新资讯28at.com

示例代码:2sK28资讯网——每日最新资讯28at.com

func main() { logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) logger.Info("This is a new text Info Level", "uid", 1002) jsonLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) jsonLogger.Info("This is a json format Info Level", "uid", 1003)}

输出结果:2sK28资讯网——每日最新资讯28at.com

time=2023-10-06T12:19:21.676+08:00 level=INFO msg="This is a new text Info Level" uid=1002{"time":"2023-10-06T12:19:21.676846+08:00","level":"INFO","msg":"This is a json format Info Level","uid":1003}

阅读上面这段代码,我们可以发现通过内置 Handler 创建新的 Logger,输出新的日志格式,其中 NewTextHandler 输出的所有内容都是键值对格式,NewJSONHandler 输出一个 json 对象。2sK28资讯网——每日最新资讯28at.com

此外,我们还可以自定义 Handler,通过实现 slog.Handler 接口,生成特定的输出日志格式或者 wrap 另一个 Handler 来丰富其功能。2sK28资讯网——每日最新资讯28at.com

03 、总结

本文我们介绍 log/slog 的使用方式,包括日志级别和输出日志格式。2sK28资讯网——每日最新资讯28at.com

限于篇幅,还有一些进阶用法没有介绍,比如 LogAttrs 函数,以及 NewTextHandler 和 NewJSONHandler 的方法。2sK28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12377-0.htmlGo 1.21.0 中新增的结构化日志记录标准库 log/slog 详解

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 希尔排序:优化插入排序的精妙算法

下一篇: 网络安全知识:使用USB驱动器进行社会工程

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • OPPO Reno10 Pro英雄联盟定制礼盒公布:萨勒芬妮同款配色梦幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新机,全系标配了超光影长焦镜头,是迄今为止拍照
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
Top