当前位置: 首页 > news >正文

Golang 结构化日志包 log/slog 详解(四):分组、上下文和属性值类型

上一篇文章讲解了 log/slog 包中的自定义日志属性字段和日志级别,本文讲解下分组、上下文和属性值类型

分组输出

slog 支持将字段放在组中并且可以给分组指定名称。如何展示分组的内容,取决于使用的 handler,例如 TextHandler 使用点号分隔组名和属性,JSONHandler 将每个组视为单独的 JSON 对象,并以组名作为键。分别看下 TextHandler 和 JSONHandler 的示例。

TextHandler:

package mainimport ("log/slog""os"
)func main() {h := slog.NewTextHandler(os.Stdout, nil)logger := slog.New(h)logger = logger.WithGroup("request")logger.Info("路多辛的博客", "method", "post", "url", "xxx.com/post")
}

输出内容如下:

time=2023-09-24T18:17:45.642+08:00 level=INFO msg=路多辛的博客 request.method=post request.url=xxx.com/post

JSONHandler:

package mainimport ("log/slog""os"
)func main() {h := slog.NewJSONHandler(os.Stdout, nil)logger := slog.New(h)logger = logger.WithGroup("request")logger.Info("路多辛的博客", "method", "post", "url", "xxx.com/post")
}

输出内容如下:

{"time":"2023-09-24T18:19:39.025697+08:00","level":"INFO","msg":"路多辛的博客","request":{"method":"post","url":"xxx.com/post"}}

上下文(contexts)支持

一些 handler 或者自定义的 handlers 可能希望得到包含上下文(context.Context)的信息,例如链路追踪的场景,需要从上下文中获取到当前的 span 信息。slog 包提供了对这种场景的支持,Logger.log 和 Logger.LogAttrs 方法将 context.Context 类型的参数作为第一个参数,还有记录几种级别日志的方法,都同时提供了带上下文的方法,对应的方法就是后面跟上 Context。简单示例如下:

package mainimport ("context""log/slog"
)func main() {slog.InfoContext(context.Background(), "路多辛的博客")
}

属性和值

属性是一个键值对,日志输出方法接受交替出现的属性和值,例如:

package mainimport ("log/slog"
)func main() {slog.Info("路多辛的博客", "count", 3)
}

也可写为如下形式:

package mainimport ("log/slog"
)func main() {slog.Info("路多辛的博客", slog.Int("count", 3))
}

这里的 slog.Int 返回一个 slog.Attr 类型的值,slog.Attr 用来表示一个键值对。 slog 还提供了生成其他类型的键值对的函数,例如 float、string 和 Bool 等,属性的值是 slog.Value 类型,像 any 一样,Value 可以保存任何值。要获得最高效的日志输出,可以使用 Logger.LogAttrs,只接受 slog.Attr 类型的日志内容,不接受键值交替出现的值。例如:

package mainimport ("context""log/slog""os"
)func main() {h := slog.NewTextHandler(os.Stdout, nil)logger := slog.New(h)logger = logger.WithGroup("request")logger.LogAttrs(context.Background(), slog.LevelInfo, "路多辛的博客", slog.Int("count", 3))
}

输出效果和如下的代码是一样的:

package mainimport ("log/slog"
)func main() {slog.Info("路多辛的博客", "count", 3)
}

http://www.lryc.cn/news/174579.html

相关文章:

  • 小白学Python:提取Word中的所有图片,只需要1行代码
  • pip修改位于用户目录下的缓存目录
  • 更新、修改
  • 山西电力市场日前价格预测【2023-09-25】
  • 从collections库的Counter类看items()方法和enumerate()方法
  • 2023-09-24 LeetCode每日一题(LRU 缓存)
  • 《计算机视觉中的多视图几何》笔记(10)
  • 【一、虚拟机vmware安装】
  • uniapp 离线打包 plus.runtime.install 安装页面不弹起
  • Docker 自动化部署(保姆级教程)
  • 北工大汇编题——分支程序设计
  • 贴片电容耐压值选取和特性(包含实际电路和PCB)
  • 【云原生】kubernetes中pod(进阶)
  • Cesium 问题:获取高度值,高度值又是相对于谁来说的
  • 第三、四、五场面试
  • 力扣-290.单词规律
  • 常见限流算法学习
  • JS面试相关
  • SSRF漏洞
  • Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例
  • 当下IT测试技术员的求职困境
  • MR混合现实情景实训教学
  • 嵌入式C++总结
  • C语言之内存函数篇(3)
  • java面试题-学成在线项目
  • ViewBinding——Android之视图绑定
  • vue学习-04vue的props配置项和mixin混入
  • 九、多项式朴素贝叶斯算法(Multinomial NB,Multinomial Naive Bayes)(有监督学习)
  • 数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释
  • 如何通过AI视频智能分析技术,构建着装规范检测/工装穿戴检测系统?