Loading...
Loading...
Compare original and translation side by side
.evlog/logs/.evlog/logs/.jsonlpretty: falsepretty: trueJSON.parse('[' + content.replace(/\}\n\{/g, '},{') + ']')".evlog/logs/.evlog/logs/apps/*/.evlog/logs/.evlog/logs/*.jsonl
*/.evlog/logs/*.jsonl
apps/*/.evlog/logs/*.jsonl2026-03-14.jsonl.jsonlpretty: falsepretty: trueJSON.parse('[' + content.replace(/\}\n\{/g, '},{') + ']')".evlog/logs/.evlog/logs/apps/*/.evlog/logs/.evlog/logs/*.jsonl
*/.evlog/logs/*.jsonl
apps/*/.evlog/logs/*.jsonl2026-03-14.jsonlimport { createFsDrain } from 'evlog/fs'
// Nuxt / Nitro: server/plugins/evlog-drain.ts
export default defineNitroPlugin((nitroApp) => {
nitroApp.hooks.hook('evlog:drain', createFsDrain())
})
// Hono / Express / Elysia: pass in middleware options
app.use(evlog({ drain: createFsDrain() }))
// Fastify: pass in plugin options
await app.register(evlog, { drain: createFsDrain() })
// NestJS: pass in module options
EvlogModule.forRoot({ drain: createFsDrain() })
// Standalone: pass to initLogger
initLogger({ drain: createFsDrain() })import { createFsDrain } from 'evlog/fs'
// Nuxt / Nitro: server/plugins/evlog-drain.ts
export default defineNitroPlugin((nitroApp) => {
nitroApp.hooks.hook('evlog:drain', createFsDrain())
})
// Hono / Express / Elysia: 传入中间件选项
app.use(evlog({ drain: createFsDrain() }))
// Fastify: 传入插件选项
await app.register(evlog, { drain: createFsDrain() })
// NestJS: 传入模块选项
EvlogModule.forRoot({ drain: createFsDrain() })
// 独立模式: 传入initLogger
initLogger({ drain: createFsDrain() })| Field | Type | Description |
|---|---|---|
| | ISO 8601 timestamp |
| | |
| | Service name |
| | |
| | HTTP method ( |
| | Request path ( |
| | HTTP response status code |
| | Request duration ( |
| | Unique request identifier |
| | Error details: |
| | Human-readable explanation of what went wrong |
| | Suggested fix for the error |
| | |
| | Parsed browser/OS/device info |
log.set()usercartpayment| 字段 | 类型 | 描述 |
|---|---|---|
| | ISO 8601 时间戳 |
| | |
| | 服务名称 |
| | |
| | HTTP方法( |
| | 请求路径( |
| | HTTP响应状态码 |
| | 请求耗时( |
| | 唯一请求标识符 |
| | 错误详情: |
| | 错误原因的人性化说明 |
| | 建议的错误修复方案 |
| | 浏览器日志标记为 |
| | 解析后的浏览器/操作系统/设备信息 |
log.set()usercartpayment.jsonl.jsonl"level":"error"status >= 400pathduration"706ms""source":"client"timestamp"level":"error"status >= 400pathduration"706ms""source":"client"timestamppathmethodstatuslevelerror.messageerror.data.whyerror.data.fixpathmethodstatuslevelerror.messageerror.data.whyerror.data.fixFilter: level === "error"
Group by: error.message or path
Look for: recurring patterns, common failure modes筛选条件: level === "error"
分组方式: error.message 或 path
关注重点: 重复模式、常见故障类型Filter: parse duration string, compare > threshold (e.g. 1000ms)
Sort by: duration descending
Look for: specific endpoints, time-of-day patterns筛选条件: 解析duration字符串,筛选超过阈值的请求(例如1000ms)
排序方式: 按duration降序排列
关注重点: 特定端点、时间段模式Filter: requestId === "the-request-id"
Result: single wide event with all context for that request筛选条件: requestId === "目标请求ID"
结果: 包含该请求所有上下文的单个宽事件Group events by: path
Count: total events vs error events per path
Look for: endpoints with high error ratios分组方式: 按path字段分组
统计: 每个端点的总事件数与错误事件数
关注重点: 错误率高的端点Split by: source === "client" vs no source field
Compare: error patterns between client and server
Look for: client errors that don't have corresponding server errors (network issues)拆分方式: 按`source === "client"`和无source字段拆分
对比: 客户端与服务器端的错误模式
关注重点: 没有对应服务器错误的客户端错误(可能是网络问题)error.data.whyerror.data.fix"706ms""source":"client".gitignoreerror.data.whyerror.data.fix"706ms""source":"client".gitignore