0Pricing
Go Academy · 课时

slog 处理器

文本和 JSON 处理器

slog 处理器 是 CoddyKit 上的免费 Go Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

处理程序决定格式

在 slog 中,日志记录器会调用 Handler 来格式化并写入每条记录。更换处理程序即可改变输出格式,而无需改动日志调用。

TextHandler

slog.NewTextHandler 会写出便于人类阅读的 key=value 行。它适合本地开发和终端环境。

package main

import (
    "log/slog"
    "os"
)

func main() {
    h := slog.NewTextHandler(os.Stdout, nil)
    logger := slog.New(h)
    logger.Info("hello", "env", "dev")
}

JSONHandler

slog.NewJSONHandler 会在每一行输出一个 JSON 对象。它非常适合生产环境中的日志流水线。

package main

import (
    "log/slog"
    "os"
)

func main() {
    h := slog.NewJSONHandler(os.Stdout, nil)
    logger := slog.New(h)
    logger.Info("hello", "env", "prod")
}

创建日志记录器

slog.New(handler) 会将一个处理程序封装到日志记录器中。您可以在该实例上调用 logger.Info、logger.Error 等方法。

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

HandlerOptions

处理程序构造函数的第二个参数是 *slog.HandlerOptions。传入 nil 使用默认设置,或者配置日志级别和源代码位置。

opts := &slog.HandlerOptions{
    Level:     slog.LevelDebug,
    AddSource: true,
}
h := slog.NewJSONHandler(os.Stdout, opts)

写入文件或缓冲区

处理程序可以接收任意 io.Writer。您可以将日志写入文件、用于测试的缓冲区或标准输出。这种解耦是 slog 的一个关键设计点。

f, _ := os.Create("app.log")
logger := slog.New(slog.NewJSONHandler(f, nil))

设置默认日志记录器

slog.SetDefault(logger) 会让包级函数(例如 slog.Info)使用您的处理程序。在启动时设置一次即可。

slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil)))
slog.Info("now JSON by default")

文本与 JSON 输出

相同的调用,两种格式:

  • 文本:time=... level=INFO msg=hello env=dev
  • JSON:{"time":"...","level":"INFO","msg":"hello","env":"dev"}

选择处理程序

经验法则:

  • 本地/开发环境:TextHandler(易读)
  • 生产环境/集中聚合:JSONHandler(易于解析)

通过环境变量做出选择,让同一个二进制程序能够适应不同环境。

编写可复用的配置

集中创建日志记录器,让整个应用共享一份配置。

func newLogger(prod bool) *slog.Logger {
    if prod {
        return slog.New(slog.NewJSONHandler(os.Stdout, nil))
    }
    return slog.New(slog.NewTextHandler(os.Stdout, nil))
}

可运行:切换处理程序

这个程序会通过两个处理程序记录同一个事件,方便您比较它们的格式。

package main

import (
    "log/slog"
    "os"
)

func main() {
    text := slog.New(slog.NewTextHandler(os.Stdout, nil))
    js := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    text.Info("login", "user", "ada")
    js.Info("login", "user", "ada")
}

快速检查

请测试您对 slog 处理程序的理解。

回顾

您已了解 slog 处理程序:

  • 处理程序负责格式化和写入记录;日志记录器会调用它们
  • NewTextHandler 面向人类,NewJSONHandler 面向机器
  • 处理程序接受任意 io.Writer 和 *HandlerOptions
  • slog.SetDefault 会连接包级函数

常见问题解答

「slog 处理器」课时是免费的吗?

是的 — 「slog 处理器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「slog 处理器」这节课中我会学到什么?

文本和 JSON 处理器 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「slog 处理器」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么使用结构化日志
  2. slog 处理器
  3. 日志级别与属性
  4. 自定义处理器
← 返回 Go Academy