后端可观测性【免费下载链接】zerologZero Allocation JSON Logger项目地址https://gitcode.com/gh_mirrors/ze/zerolog点击查看免费下载zerolog 专注于高效的 JSON 结构化日志输出而 PrettyLog 是官方仓库中提供的一个命令行小工具用于把 JSON 格式的日志流翻译成带颜色、易读的文本输出解决开发调试时日志难以直接阅读的问题。读完本文你将掌握 PrettyLog 的编译与直跑两种方式、Linux 与 Windows 下 stderr 管道的正确接入方法、-time-format参数用法以及它基于zerolog.ConsoleWriter的底层实现原理可以直接在自己的服务日志场景中落地使用。工具定位为什么需要 PrettyLogzerolog 的设计哲学是专注高效的结构化日志其核心输出是 JSON 或 CBOR 二进制格式一条典型的日志长这样{time:5:41PM,level:info,message:Starting listener,listen::8080,pid:37556}这种格式适合程序解析与存储却不适合人眼在终端里直接阅读。为此仓库在 README.md 中明确指出控制台上的友好输出由内置的但相对低效的zerolog.ConsoleWriter提供。PrettyLog 正是把这一能力封装成独立 CLI 的官方示例位于仓库的 cmd/prettylog 目录。它的工作方式很直接从标准输入或指定文件逐行读取 JSON 日志交给zerolog.ConsoleWriter解析并重排为带 ANSI 颜色的可读文本再写到标准输出。因此它不依赖任何配置文件也不需要改动你的业务代码——只要日志还是 JSON 格式就能被美化。核心前提zerolog 默认把日志写到 stderr使用 PrettyLog 之前必须理解一个关键事实zerolog 默认并不把日志写到stdout而是写到stderr。这一点在 cmd/prettylog/README.md 中有明确说明。从源码看全局日志器的初始化也印证了这一点log.go 中的示例使用zerolog.New(os.Stderr)创建日志器而 README.md 的 Pretty Logging 一节同样使用log.Output(zerolog.ConsoleWriter{Out: os.Stderr})。因此把 PrettyLog 接入业务程序时必须正确重定向 stderr 流同时保持 stdout 不被污染例如 HTTP 服务的响应体仍走 stdout。编译与运行两种启动方式PrettyLog 的源码只有一个文件 cmd/prettylog/prettylog.go依赖 zerolog 主模块与go-colorable用于 Windows 下的颜色兼容见 console.go编译非常简单。方式一编译为可执行文件在仓库根目录执行go build -o prettylog cmd/prettylog/prettylog.go生成prettylog可执行文件后即可在任意终端使用见下文管道命令。方式二用go run直接运行无需编译直接把源码作为程序运行go run cmd/prettylog/prettylog.go注意两种方式都必须从仓库根目录或模块内对应相对路径执行因为go run需要解析github.com/rs/zerolog模块依赖见 go.mod。使用方式Linux 与 Windows 的管道接入官方文档给出了两条平台的完整接入命令以下逐一说明其含义。Linux / macOSbash、zshLinux 使用 bash 的进程替换process substitution语法只把 stderr 重定向给 PrettyLogstdout 完全不受影响# 1. 使用编译好的版本 some_program_with_zerolog 2 (prettylog) # 2. 直接使用 go run some_program_with_zerolog 2 (go run cmd/prettylog/prettylog.go)这里2把 stderr 重定向到(...)进程替换创建的管道some_program_with_zerolog可以是任何输出 zerolog JSON 日志的程序。WindowsPowerShell / CMDWindows 不支持进程替换语法官方给出的方案是先把 stderr 合并到 stdout再整体管道给 PrettyLog# 1. 使用编译好的版本 some_program_with_zerolog 21 | prettylog # 2. 直接使用 go run some_program_with_zerolog 21 | go run cmd/prettylog/prettylog.go21将 stderr 重定向到 stdout随后|把合并后的流管道给 PrettyLog。注意此方式下 stdout 与 stderr 已合并无法再区分两者这是 Windows 平台的取舍。读取日志文件无管道时除了管道模式PrettyLog 还支持直接指定日志文件这是官方 README 未展开、但源码明确支持的能力。不带管道、同时传入文件名时它会依次扫描每个文件的每一行并美化输出见 cmd/prettylog/prettylog.goprettylog zerolog_output.jsonl仓库根目录恰好提供了一个真实示例文件 example.jsonl包含 7 条模拟应用日志启动监听、数据库访问、HTTP 请求、慢请求警告、数据库断连错误。用以下命令即可复现官方 pretty.png 展示的效果go run cmd/prettylog/prettylog.go example.jsonl该文件中的每条日志对应图片里的一行彩色输出INF绿色、DBG灰色、WRN黄色、ERR红色字段名与值以不同颜色区分正是 PrettyLog 的典型效果。无参数运行时的用法提示既没有管道输入也没有文件名参数时PrettyLog 会打印如下用法提示并退出返回码 1见 cmd/prettylog/prettylog.goUsage: app_with_zerolog | 2 (prettylog) prettylog zerolog_output.jsonl命令行参数-time-formatPrettyLog 支持一个命令行参数-time-format用于控制日志时间戳的显示格式取值如下定义见 cmd/prettylog/prettylog.go取值对应 Go 时间布局输出示例default默认值time.Kitchen5:41PMfulltime.RFC1123Mon, 13 Oct 2026 13:22:09 0800使用方式some_program_with_zerolog 2 (prettylog -time-format full)传入其他取值时程序会直接panic(Invalid time-format provided)见 cmd/prettylog/prettylog.go因此请严格使用上述两个取值。值得注意的是default对应的time.Kitchen正是zerolog.ConsoleWriter的默认时间格式在 console.go 中定义了consoleDefaultTimeFormat time.Kitchen与 example.jsonl 中time:5:41PM的字段值完全一致——这也解释了为什么示例日志的时间戳恰好是这种格式。底层原理PrettyLog 与 ConsoleWriter 的分工PrettyLog 本体很薄核心逻辑只有两个函数见 cmd/prettylog/prettylog.goisInputFromPipe()通过os.Stdin.Stat()检查标准输入是否为管道字符设备标志决定走管道模式还是文件模式cmd/prettylog/prettylog.go。processInput()用bufio.Scanner逐行读取输入把每一行 JSON 原样交给 writercmd/prettylog/prettylog.go。真正的美化工作在zerolog.NewConsoleWriter()与ConsoleWriter.Write()中完成每一行 JSON 被json.Decoder解析为 mapconsole.go按照默认部件顺序time → level → caller → message依次渲染consoleDefaultPartsOrder()见 console.go时间戳按TimeFormat格式化等级根据FormattedLevels/LevelColors映射着色console.go消息加粗字段名用青色、错误字段用红色加粗console.go其余字段按字母序排列输出其中error字段会被特殊提到最前console.go。另外如果进程环境中设置了NO_COLOR环境变量ConsoleWriter会自动禁用颜色输出console.go适合在无终端或 CI 场景下使用。使用注意事项与限制stdout 保持干净Linux 的2 (prettylog)写法让 stdout 完全不受影响Windows 的21 |会合并两路流需按场景选择。逐行处理processInput基于bufio.Scanner逐行扫描输入必须是一行一条 JSON的标准 zerolog 格式如 example.jsonl不支持多行 JSON 事件同时单行长度受bufio.Scanner默认 token 上限影响超长单行可能被截断报错。文件模式错误处理文件打不开或扫描出错时PrettyLog 会打印错误并os.Exit(1)cmd/prettylog/prettylog.go便于在 shell 中感知失败。性能取舍正如 README.md 所述ConsoleWriter属于提供但相对低效的展示型输出PrettyLog 只适合开发调试、日志回放等人工阅读场景生产环境的日志采集仍应保留原始 JSON 输出。小结PrettyLog 是理解 zerolog 生态结构化输出与人类可读输出分离设计思路的最佳入口业务代码无需任何改动只需一行 shell 管道Linux 用进程替换重定向 stderrWindows 用21合并后管道就能把 JSON 日志流变成带颜色、分级明确的终端文本。配合-time-format参数、文件模式与NO_COLOR环境变量足以覆盖日常开发调试的大部分需求想深入了解颜色与布局的定制能力可继续阅读 console.go 中ConsoleWriter的FormatLevel、FormatTimestamp、FormatFieldName等可配置项以及 console_test.go 中的示例用例。赞分享后端可观测性【免费下载链接】zerologZero Allocation JSON Logger项目地址https://gitcode.com/gh_mirrors/ze/zerolog点击查看免费下载相关推荐EVM Opcodes更新历史从Istanbul到London硬分叉的操作码演进EVM Opcodes更新历史从Istanbul到London硬分叉的操作码演进 EVM以太坊虚拟机操作码是以太坊区块链运行的基础它们的每一次更新都深刻在 OpenCloud 中使用 slog-zerolog把标准库 slog 接入 zerolog 的结构化日志管线在 OpenCloud 中使用 slog zerolog把标准库 slog 接入 zerolog 的结构化日志管线 slog zerolog 是 samber后端微服务存储认证鉴权告别日志混乱Zerolog多输出实战指南同时写入文件与控制台告别日志混乱Zerolog多输出实战指南同时写入文件与控制台 你是否还在为日志管理烦恼开发时需要清晰的控制台输出生产环境又需要详细的文件记录切换配置总后端可观测性上一篇Notepad--10 分钟跑通的跨平台文本编辑器批量替换、文件对比、乱码转换一次搞定下一篇如何通过RedisDesktopManager快速连接AWS ElastiCache和Azure Redis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考