首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏旅途散记

    Go新增的slog: structured, leveled logging

    go现有的log库有什么问题 Go社区最近对log/slog搞得热火朝天。 这篇文章更全面总结了现有log包存在的问题 ---- go新增的log/slog是干什么的 log/slog 是一个 Go 语言实现的日志库,可以帮助开发人员在应用程序中记录各种信息和调试消息,从而更好地了解应用程序的运行情况 (slog最开始和slices,maps一样位于试验性质的x/exp包,现已过提案,“转正”进入到标准库) 文档可参考 src/log/slog/doc.go (https://github.com/golang /go/blob/master/src/log/slog/doc.go) 相关设计由Jonathan Amsterdam提出并开发 (https://github.com/golang/go/commits pli=1#) log/slog: structured, leveled logging (https://github.com/golang/go/issues/56345) 从x/exp移入标准库的初始化提交

    1.1K20编辑于 2023-06-18
  • 来自专栏猫头虎博客专区

    2023年8月22日 Go生态洞察:Structured Logging with slog

    2023年8月22日 Go生态洞察:Structured Logging with slog 摘要 猫头虎博主在此,带来最新Go语言技术洞察! 今日搜索词条:Structured Logging with slogGo 1.21引入的log/slog包标志着结构化日志在标准库的重大进步。 那么,让我们深入了解slog的世界吧! 引言 Go语言自十多年前首次发布以来,一直拥有标准的日志包log。但随着时间推移,对于Go程序员来说,结构化日志变得日益重要。 在Go的年度调查中,它一直排名很高,许多Go生态系统中的包都提供了结构化日志功能。现在,让我们深入探讨Go 1.21版中的slog包及其重要性。 探讨了Go 1.21中引入的slog包,其为Go语言带来了结构化日志的重要进步,通过社区驱动的设计和性能优化,提供了一个强大且灵活的日志记录方案。

    28610编辑于 2024-04-09
  • 来自专栏code人生

    Structured Logging with slog

    他们更喜欢明确的属性来表示结构: slog.Info("message", slog.Int("k1", v1), slog.String("k2", v2)) 但我们觉得轻量级的语法对于保持Go易用和有趣 到7月初,log/slog包的实现完成了,测试/slogtest包用于验证处理器和vet检查用于正确使用交替的键和值。 8月8日,Go 1.21发布了,slog也随之发布。 你们的贡献极大地改进了slog。 资源 log/slog包的文档[15]解释了如何使用它,并提供了几个例子。 wiki页面[16]有Go社区提供的额外资源,包括各种处理器。 [5] 这里: https://pkg.go.dev/log/slog [6] Handler接口: https://pkg.go.dev/log/slog#Handler [7] Zap: https [15] 文档: https://pkg.go.dev/log/slog [16] wiki页面: https://github.com/golang/go/wiki/Resources-for-slog

    63510编辑于 2023-10-19
  • 来自专栏Go技术干货

    Go slog 包:开启结构化日志的奇妙之旅

    本文中涉及到的相关代码,都已上传至:https://github.com/chenmingyong0423/blog/tree/master/tutorial-code/slog前言go 1.21.0 mainimport ( "context" "log/slog")func main() { slog.Info("slog msg", "greeting", "hello slog 21:21:31","level":"ERROR","source":{"function":"main.main","file":"D:/goproject/src/gocode/play/main.go 小结本文对 go 语言里的 slog 包进行了详细介绍,包括基本的使用、Logger 实例的创建和高效输出日志以及自定义日志信息等内容。 : https://pkg.go.dev/log/slog我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

    2.1K32编辑于 2023-10-16
  • Go每日一库之191:slog(官方结构化日志库)

    前言 go 1.21.0 版本引入了一个新的包 log/slog,该包提供了结构化日志的功能。 21:21:31","level":"ERROR","source":{"function":"main.main","file":"D:/goproject/src/gocode/play/main.go 小结 按官方benchmark结果,log/slog的性能要高于Go社区常用的结构化日志包,比如zap等。 slog填补了Go标准库在结构化日志支持上的短板,提供了简洁、易用、易扩展的API。相信随着slog的推广,可以逐步统一Go社区中的日志实践,也让更多人受益。 对于没有升级到Go 1.21版本的新项目,也可以使用exp/slog,目前exp/slog也已经与log/slog保持了同步。

    58610编辑于 2025-01-06
  • 来自专栏golang从入门到进阶

    Go 结构化日志新宠:`slog` 入门与实战指南(附避坑秘籍)

    Go1.21终于带来了官方结构化日志包——log/slog。 BADKEY,而老板正盯着你……✅正确姿势:用slog.Attr展开代码语言:GoAI代码解释logger.Warn("权限不足",slog.Int("user_id",123),slog.String slog配合社区库slog-context能轻松实现。 放心用slog,省下的心智负担远超那几微秒。六、进阶建议日志级别动态调整:用slog.LevelVar实现不停机调DEBUG。多输出:用slog-multi同时写stdout+文件+网络。 是Go应用日志的首选方案。

    27010编辑于 2026-02-07
  • 来自专栏golang

    每日一库:slog 实现日志双写

    Go 1.21 的 slog 提供结构化日志,相比传统 log 包更灵活,较 zap 更简洁。本文展示如何用 slog 实现日志双写,同时输出到文件和控制台,满足开发与生产需求。 为什么用 slog 和日志双写?slog 支持键值对结构化日志,JSON 格式便于分析。双写兼顾开发调试(实时输出)和生产监控(持久保存),灵活可靠。 (mode string) {var handler slog.Handleropts := &slog.HandlerOptions{AddSource: true}switch mode {case = nil {slog.Error("打开日志文件失败", "error", err)return}opts.Level = slog.LevelInfohandler = slog.NewJSONHandler = slog.NewTextHandler(os.Stdout, opts)default:panic("无效模式")}slog.SetDefault(slog.New(handler))}生产模式以

    52210编辑于 2025-04-18
  • 来自专栏Go与云原生

    Golang 库: golang slog 怎么设置日志 Debug 等级

    在 exp 中, Go 加入了一个新库 `exp/slog`[1], 希望能转正。 使用 slog 习惯误区, 默认日志级别是 Info 如果直接把 slog 当成 log 使用, 可能又一点问题。 slog 官方给了一个 slog 实现自定义日志等级 - Go Playground[3] 的 Demo。 比我们之前的代码多很多, 也不是很复杂。 /logr 开源了一个自己实现的 go-jarvis/logr - Github[4] 实现了日志等级 延续了 log.Debug(format, ...any) 的使用习惯 参考了 go-kratos - Go Playground: https://go.dev/play/p/WXrfqyfKGUt [4] go-jarvis/logr - Github: https://github.com/ go-jarvis/logr [5] go-kratos/kratos - Github: https://github.com/go-kratos/kratos

    3.3K30编辑于 2023-02-25
  • 来自专栏云原生生态圈

    Go语言结构化日志:深入了解日志的力量与魔法

    我们将从 Go 现有的日志包及其局限性开始,然后通过涵盖所有最重要的概念来深入研究 slog 库。我们还将简要讨论 Go 生态系统中使用最广泛的一些结构化日志库。 鉴于前面提到的限制,一个新的日志包被称为 slog,以填补 Go 标准库中的现有空白。 结构化日志包 slog slog 包源于 Jonathan Amsterdam 主导的讨论,该讨论后来促成了描述包的确切设计的建议,一旦它最终确定并在 Go 版本中实现,预计将放在在 log/slog 要跟随本文中的示例,你可以使用以下命令将 slog 安装到项目中: go get golang.org/x/exp/slog@latest slog 日志包使用 这个 slog 包公开了一个默认 Logger , slog.Int("pid", os.Getpid()), slog.String("go_version", buildInfo.GoVersion), ), ) 有了这个配置

    1.5K20编辑于 2023-08-23
  • 来自专栏Golang语言开发栈

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

    01 介绍 在 Go 语言项目开发中,我们通常需要查看日志来调试程序,所以日志的快捷搜索和过滤就会至关重要。 因为 Go 标准库中的 log,它不是结构化日志格式,使用上并不方便,所以在 Go 1.21.0 中,Go 标准库新增结构化日志记录包 log/slog,它支持键值对格式。 感兴趣的读者朋友们,可以阅读标准库 log/slog[1] 文档了解更多。 推荐阅读 Go 怎么操作 OSS 阿里云对象存储? Go 语言各个版本支持 Go Modules 的演进史 Golang 语言怎么使用 panic 函数? Golang 语言的标准库 log 包怎么使用? Go 语言实现创建型设计模式 - 工厂模式 参考资料 [1] 标准库 log/slog: https://pkg.go.dev/log/slog

    2.2K40编辑于 2023-10-08
  • 来自专栏Go与云原生

    Golang 库: 为什么 Golang slog 库不支持 Fatal

    / 使用 slog 默认不支持 Fatal 如果直接把 slog 当成 log 使用, 会有一点点头疼 func main() { slog.Debug("debug") slog.Info("info ") slog.Warn("warn") slog.Error("err", fmt.Errorf("game over")) // slog.Fatal("don't support") } 参考 Golang 库: 怎么使用 golang slog 设置日志 Debug 等级[1] slog 默认不支持 Fatal API。 换而言之, 无法使用 slog 终止进程了。 我猜 Go 官网是希望我们, 在终止前做一些退出处理, 不要太过于暴力。 : https://stackoverflow.com/questions/33885235/should-a-go-package-ever-use-log-fatal-and-when

    93320编辑于 2023-02-25
  • 来自专栏Go技术干货

    Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能

    前言在现有的日志库中,包括 go 1.21.0 引入的 slog 日志库,它们通常都支持对日志文件进行轮转与切割,只不过这些功能并不直接被内置,而是需要我们主动配置来启用。 前段时间发布了一篇 Go slog 包:开启结构化日志的奇妙之旅 文章,有一位网友问我该日志库是否支持日志轮转与切割功能,此文章也算是解答他的一个疑惑。 logrus 日志库logrus 是一个功能丰富的Go语言日志库,它提供了结构化日志记录、日志级别控制等功能。 slog 日志库slog 是在 go 1.21.0 版本引入的一个官网日志库,它提供了结构化日志。如果想要更详细地了解 slog 日志库,自荐一篇文章 Go slog 包:开启结构化日志的奇妙之旅。 textLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))jsonLogger := slog.New(slog.NewJSONHandler

    3K71编辑于 2023-11-28
  • Go 1.21 相比 Go 1.20 有哪些值得注意的改动?

    本系列旨在梳理 Go 的 release notes 与发展史,来更加深入地理解 Go 语言设计的思路。 https://go.dev/doc/go1.21Go 1.21 值得关注的改动:版本号规则变更:Go 1.21 开始,首个版本号将标记为 1.N.0 而不是之前的 1.N,例如 Go 1.21 的首个版本是 为什么需要 slog?在 slog 之前,Go 的标准库 log 包主要输出简单的文本行。 标准库提供了 slog.TextHandler 和 slog.JSONHandler。记录器(Loggers) :slog.Logger 是进行日志记录操作的入口点。 slog 的配套测试库:testing/slogtest伴随着 log/slog 包的引入,Go 1.21 还提供了一个新的测试包 testing/slogtest。

    75400编辑于 2025-05-03
  • 来自专栏golang从入门到进阶

    Go 中防止敏感数据意外泄露的几种姿势

    Go语言中,调试方便是出了名的——结构体直接Println就能输出字段,JSON自动序列化,日志随手一打……但这种“便利”一旦遇到敏感数据(比如密码、Token、SessionID),就可能变成一场“ Go的标准库非常贴心地提供了几个单方法接口,只要你的类型实现了它们,就能接管格式化、日志、序列化等行为。我们只需要返回一个“假数据”,比如"<!SECRET_REDACTED! 2️⃣防结构化日志泄露:实现slog.Valuer如果你用的是Go1.21+的log/slog(或者兼容它的日志库),光靠fmt.Formatter可不够!因为slog会绕过fmt,直接取值。 >logger:=slog.New(slog.NewTextHandler(os.Stdout,nil))logger.Info("loginattempt","pwd",pwd)//pwd="<! ✅总结:三招防泄漏,安心写Go场景接口作用范围fmt.Println等fmt.Formatter所有格式化输出slog结构化日志slog.Valuer日志记录json/xml序列化encoding.TextMarshaler

    11710编辑于 2026-01-18
  • Go 中如何让结构体不可比较?

    最近我在使用 Go 官方出品的结构化日志包 slog 时,看到 slog.Value 源码中有一个比较好玩的小 Tips,可以限制两个结构体之间的相等性比较,本文就来跟大家分享下。 在 Go 中结构体可以比较吗?在 Go 中结构体可以比较吗? run main.gotrue更优雅的做法最近我在使用 Go 官方出品的结构化日志包 slog 时,看到 slog.Value 源码:// A Value can represent any Go value 我在看到 slog.Value 源码使用 _ [0]func() 来禁用结构体相等性比较时,又搜索了 Go 的源码中多处在使用,我想这应该是社区推荐的做法了。 延伸阅读slog 源码: https://github.com/golang/go/blob/master/src/log/slog/value.go#L21Golang Tip #50: Make Structs

    96610编辑于 2024-06-15
  • 来自专栏go程序例子

    Go程序例子(76):日志记录

    Go 标准库提供了简单的工具来从 Go 程序中输出日志,其中 log 包用于自由格式的输出,而 log/slog 包用于结构化输出。 fmt.Print("from buflog:", buf.String())// slog 包提供了结构化的日志输出。例如,以 JSON 格式记录日志非常简单。 jsonHandler := slog.NewJSONHandler(os.Stderr, nil) myslog := slog.New(jsonHandler) myslog.Info( "hi there")// 除了消息外,slog 输出还可以包含任意数量的 key=value 对。 myslog.Info("hello again", "key", "val", "age", 25)}运行结果:➜ go run logging.go 2025/01

    37010编辑于 2025-01-20
  • 来自专栏码客

    Go中日志库

    版本及以上 安装 go get go.uber.org/zap 设置全局变量 如果您想在不先创建 Logger 实例的情况下写入日志,您可以在 init() 函数中使用 ReplaceGlobals Hello World {“name”: “psvmc”} log/slog 需要go1.21版本及以上 log/slogGo 1.21中引入的一个新的结构化日志库,它与标准库的log 基本示例 例如,以下代码: package main import ( "log/slog" "os" ) func main() { slog.Info("helloworld", "user 标准错误和标准输出 以下是一个使用log/slog的示例代码: package main import ( "log/slog" "os" ) func main() { // 创建一个文本处理器 textHandler := slog.NewTextHandler(os.Stderr, nil) // 创建一个文本 Logger textLogger := slog.New(textHandler

    50110编辑于 2024-03-29
  • 来自专栏golang从入门到进阶

    Go 1.26 新特性速览:更安全、更快、更聪明的 Go

    前几天go1.26发布了,下面来看看这次带来了哪些新特性。 2.log/slog.MultiHandler:同时输出到文件+控制台展开代码语言:GoAI代码解释logger:=slog.New(slog.NewMultiHandler(slog.NewTextHandler (os.Stdout,nil),slog.NewJSONHandler(file,nil),))3.net.Dialer支持带Context的TCP/UDP拨号展开代码语言:GoAI代码解释conn,_ ✅升级建议立即升级:Go1.26兼容性极好,绝大多数项目可无缝迁移。 结语Go1.26是一次“润物细无声”的大版本:对开发者:更简洁的语法、更安全的错误处理对运维:更低的GC压力、更强的可观测性对用户:更快的响应、更稳的服务Go的哲学没变:简单、可靠、高效。

    94110编辑于 2026-02-21
  • 来自专栏俞其荣的博客

    Activity生命周期调用流程

    the window manager, // and this guy didn't finish itself or start another activity, // then go (start == ON_PAUSE && finish == ON_RESUME) { // Special case when we can just directly go ON_RESUME); } else if (start <= ON_STOP && finish >= ON_START) { // Restart and go to required state. // Go to stopped state first. to required state // Go to destroyed state first.

    84530发布于 2021-11-24
  • 来自专栏俞其荣的博客

    Activity生命周期调用流程

    the window manager, // and this guy didn't finish itself or start another activity, // then go (start == ON_PAUSE && finish == ON_RESUME) { // Special case when we can just directly go ON_RESUME); } else if (start <= ON_STOP && finish >= ON_START) { // Restart and go to required state. // Go to stopped state first. to required state // Go to destroyed state first.

    1.9K20发布于 2019-07-09
领券