日志记录

日志概览

evlog 为你提供了三种日志方式。简单的一行日志、累积上下文的大型事件,以及自动管理的请求日志。根据你的使用场景选择合适的方式。

evlog 提供了三种日志 API,每种都针对不同的使用场景设计。你可以在同一个项目中使用全部三种。

三种模式

简单日志

快速即发的结构化日志。用 log.infolog.errorlog.warnlog.debug 替代 console.log、consola 或 pino。

大型事件

在一个工作单元(脚本、任务、队列任务或请求)中累积上下文,最终发出一个全面的事件。

请求日志

自动管理的、与 HTTP 请求绑定的大型事件。框架中间件会自动创建日志记录器并为你发出事件。

快速对比

简单日志(log

每次调用一个事件。不累积上下文,也不管理生命周期。

src/index.ts
import { log } from 'evlog'

log.info('auth', 'User logged in')
log.error({ action: 'payment', error: 'card_declined', userId: 42 })

大型事件(createLogger / createRequestLogger

每个工作单元一个事件。逐步累积上下文,完成时发出。

import { createLogger } from 'evlog'

const log = createLogger({ jobId: 'sync-001', queue: 'emails' })
log.set({ batch: { size: 50, processed: 50 } })
log.emit()

createRequestLoggercreateLogger 的轻量封装,预填充了 methodpathrequestId

请求日志(框架中间件)

框架集成会在每个请求上自动创建一个大型事件日志记录器。useLogger(event) 用于获取已附加到请求上下文的日志记录器:

server/api/checkout.post.ts
import { useLogger } from 'evlog'

export default defineEventHandler(async (event) => {
  const log = useLogger(event)
  log.set({ user: { id: 1, plan: 'pro' } })
  return { success: true }
  // 在响应结束时自动发出
})
useLogger(event) 并不会创建日志记录器,而是获取框架中间件已附加到事件上的日志记录器。每个框架有各自的获取方式(useLoggerreq.logc.get('log') 等)。在 Nuxt 中,useLogger 是自动导入的。

何时使用什么

logcreateLogger / createRequestLogger框架中间件
使用场景快速的一次性事件脚本、任务、工作者、队列、无框架的 HTTP 请求使用框架集成的 API 路由
上下文单次调用使用 set() 累积使用 set() 累积
发射立即发射手动调用 emit()响应结束时自动发射
生命周期手动管理框架管理
输出控制台 + 导出控制台 + 导出控制台 + 导出 + 增强
log 开始进行快速结构化日志记录。当需要跨操作累积上下文时,切换到 createLogger(在 HTTP 场景中使用 createRequestLogger)。使用框架集成时,中间件会自动处理一切,只需调用 useLogger(event) 获取日志记录器即可。

共享特性

所有三种模式都基于同一底层能力:

  • 开发环境美化输出,生产环境输出 JSON(默认,无需配置)
  • 导出管道,可将事件发送到 Axiom、Sentry、PostHog 等
  • 结构化错误,提供 whyfixlink,并可选包含仅后端可见的 internal 字段
  • 采样,用于控制生产环境中的日志数量
  • 零依赖,约 5 kB 压缩后大小

下一步