在 Go 语言中,日志记录是开发和调试过程中不可或缺的一环。从 Go 1.21 版本开始,官方推出了全新的 log/slog 包,它提供了结构化日志、上下文支持以及灵活的日志输出目标配置能力。
本文将手把手教你如何使用 Go语言日志输出 功能,重点讲解 slog包使用 中如何配置不同的 日志目标配置,即使是编程小白也能轻松上手!
log/slog 是 Go 官方提供的结构化日志库,相比传统的 log 包,它支持键值对日志、不同日志级别(如 Info、Warn、Error)、自定义 Handler(处理器)等高级特性。
如果不做任何配置,slog 默认会将日志输出到标准错误(os.Stderr),格式为文本形式。例如:
package mainimport ( "log/slog")func main() { slog.Info("这是一条信息日志")} 运行后,终端会输出类似:
2024/06/15 10:30:45 INFO 这是一条信息日志
在实际项目中,我们常常需要将日志写入文件、发送到网络服务,或者同时输出到多个地方。这时就需要自定义 日志目标配置。
下面的代码演示如何将日志写入本地文件 app.log:
package mainimport ( "log/slog" "os")func main() { // 打开或创建日志文件 file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { panic(err) } defer file.Close() // 创建一个新的 Logger,指定输出到文件 logger := slog.New(slog.NewTextHandler(file, nil)) // 使用自定义 logger logger.Info("日志已写入文件!")} 有时我们需要既在控制台看到日志,又保存一份到文件。可以通过自定义 Handler 实现,但更简单的方式是使用 io.MultiWriter:
package mainimport ( "io" "log/slog" "os")func main() { file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) defer file.Close() // 同时写入标准输出和文件 multi := io.MultiWriter(os.Stdout, file) logger := slog.New(slog.NewTextHandler(multi, nil)) logger.Info("这条日志会同时出现在控制台和文件中!")} 在微服务或云环境中,JSON 格式更便于日志收集系统(如 ELK、Loki)解析。只需将 NewTextHandler 替换为 NewJSONHandler:
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))logger.Info("这是 JSON 格式的日志", "user_id", 123, "action", "login") 输出结果:
{"time":"2024-06-15T10:35:00.123456789Z","level":"INFO","msg":"这是 JSON 格式的日志","user_id":123,"action":"login"} 如果你希望整个程序都使用同一个日志配置,可以调用 slog.SetDefault 设置全局默认 Logger:
// 设置全局 loggerslog.SetDefault(slog.New(slog.NewJSONHandler(file, nil)))// 之后直接使用 slog.Info 即可slog.Info("使用全局配置的日志") 通过本文,你已经掌握了 Go slog教程 中最核心的部分:如何灵活配置日志的输出目标。无论是输出到文件、控制台,还是使用 JSON 格式,log/slog 都提供了简洁而强大的 API。
记住,良好的日志实践能极大提升系统可观测性和故障排查效率。现在就去你的 Go 项目中试试这些技巧吧!
关键词回顾:Go语言日志输出、slog包使用、日志目标配置、Go slog教程。
本文由主机测评网于2025-12-07发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124250.html