Deforester:写给 Janet 的结构化日志库与一套日志设计哲学
来源: codeberg.org — 2026-07
概述
Deforester 是一套纯 Janet 写的小型日志库(100% Janet),readme 本身就是一篇关于'如何正确地写日志'的设计心得。它遵循'事件(table)→ 处理器 → 格式化(table→string)→ 写出'的现代生产流程:先由 :level 过滤再求值参数、默认落到 stderr 让日志失败不致崩溃、输出 NDJSON(配 json/encode 用 jq 消费);针对个人计算还提供 file-writer 与 text-format。绑定包括 log、set-logger!、with-log-ctx、with-duration-logged、with-config 等;with-config 特别适合测试(可把日志捕获进缓冲区、甚至覆盖 :msg/:time 做快照断言);还可写 processor 仿 Go 的 Zap 转发错误事件到 Sentry 之类,或做采样。文章借此阐述日志哲学:日志 wide events 记结果而非动作、记录决策与原因、键名保持一致且 msg 应作事件名而非散文、凡 I/O 都量 :ms;只把发现点写进日志,事实留在 state 里别把日志当数据库。对 level 的态度也很有意思——level 混淆了'值得多少注意'与'作为过滤值的含义',因此建议 :debug/:info/:warn/:error 只按'注意程度与受众'划分。
核心要点
采用事件(table)→处理器→格式化→写出的流程,先按 level 过滤再求值参数,默认回落到 stderr 保证日志失败不崩
输出 NDJSON(json/encode)方便用 jq 消费;面向个人脚本提供 file-writer 与 text-format
with-config 能在测试里把日志捕获进缓冲区、覆盖 :msg/:time 做稳定快照断言,是极佳的测试工具
可通过 processor 仿 Go Zap 转发指定错误级事件到 Sentry 等,或实现每 N 条采样的 sampler
日志哲学:记 wide events 的结果而非动作、为决策写明原因、msg 应作事件名、I/O 一律量 :ms、别把日志当数据库
level 混淆了'注意度'与'过滤值',建议只按注意程度与受众划分 debug/info/warn/error,附加语义用 :topic
金句
A logging library can only make it easy to emit good events, but the consumer's taxonomy design of what events exist, how they're named, with what fields etc. is where all the benefit comes from.(日志库只能让发出好事件变得容易,而真正的好处来自使用者对'有哪些事件、如何命名、带哪些字段'的分类学设计。)
👍 0
点赞
👎 0
沉底
返回 Lobsters 首页