扩展

FS 读取器

使用 readFsLogs 和 tailFsLogs 重放并尾随本地 NDJSON drain —— 可在进程内运行,也可通过任何外部 Node 工具运行,并且可在重启后继续工作。

文件系统 drain 会将宽事件以 NDJSON 形式写入 .evlog/logs/ 下的 .jsonl 文件中(按天一个文件,例如 2026-05-08.jsonl;当启用基于大小的轮转时,还会带有诸如 .1.jsonl 的轮转后缀)。evlog/fs 模块还提供了读取器,让任何 Node 工具都能回放或跟随这段历史,而无需挂钩到正在运行的应用程序中。

tailFsLogs()·following
.evlog/logs/2026-05-08.jsonl0/5
[info]POST /api/auth/login → 200
[info]GET /api/me → 200
[error]POST /api/checkout → 500
[info]POST /api/email → 200
[info]GET /healthz → 200
.evlog/logs/2026-05-09.jsonlawaiting rotation
[info]POST /api/auth/refresh → 200
[warn]GET /api/cart → 401
[info]POST /api/checkout → 200
reader0/8
consumed0
errors0
files seen1
NDJSON · 1 line / event daily rotation partial-write safe

从磁盘读取或尾随 evlog NDJSON 日志

回放历史

import { readFsLogs } from 'evlog/fs'

for await (const event of readFsLogs({ since: '2026-03-01', level: 'error' })) {
  console.log(event.timestamp, event.action ?? event.message)
}

readFsLogs(options) 会按时间顺序遍历 NDJSON 文件,逐行解析,并产出通过所有过滤条件的事件。日期窗口之外的文件会被直接跳过。

选项

选项类型描述
dirstring要读取的目录。默认:.evlog/logs
sinceDate | string产出 timestamp >= since 的事件。
untilDate | string产出 timestamp <= until 的事件。
levelLogLevel | LogLevel[]按事件级别过滤。
filter(event) => boolean自定义谓词。

格式错误的行(部分写入、手动编辑)会被静默跳过——你的脚本绝不会因为坏行而崩溃。

实时尾随

import { tailFsLogs } from 'evlog/fs'

const ac = new AbortController()
process.on('SIGINT', () => ac.abort())

for await (const event of tailFsLogs({ signal: ac.signal })) {
  console.log('live:', event.action ?? event.message)
}

tailFsLogs(options) 会先产出已有事件(除非 fromEnd: true),然后持续产出新追加的事件——包括写入新创建的按日文件中的事件。跨轮询分割的部分写入会被透明地重新组合。

尾随特有选项

选项类型描述
pollIntervalMsnumber轮询间隔。默认:500ms(最小 50ms)。
fromEndboolean跳过已有事件;仅产出未来事件。默认:false。
signalAbortSignal在中止时停止尾随。

所有 readFsLogs 选项也同样适用。

使用场景

  • 一个本地 Electron / Tauri 仪表盘,从目标项目目录读取 .evlog/logs/
  • 一个在测试运行后扫描日志的 CI 报告聚合器
  • 一个类似 grep 的 CLI,将过滤后的事件管道传给 jq
  • 在切换到实时的进程内订阅之前,先将历史事件回放到仪表盘中。参见 先回放再实时配方