日志记录

简单日志记录

结构化的日志记录,适用于日常使用。使用 log.info、log.error、log.warn 和 log.debug 替换 console.log。在开发环境中以美观格式输出,在生产环境中以 JSON 格式输出。无需累加,也无需生命周期管理或手动 emit()。

log API 是使用 evlog 的最简单方式。每次调用都会发出一个单独的结构化事件,没有累加,没有生命周期管理,也不需要手动调用 emit()

在 Nuxt 中,log自动导入 的。不需要导入语句。

设置

对于独立项目(非 Nuxt),请在启动时初始化一次:

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

initLogger({
  env: { service: 'my-app' },
})

log.info('app', 'Server started')
如果未指定,env.service 默认值为 'app'。仅当你想使用自定义服务名称时才设置它。

两种调用风格

标签日志

传递一个标签和一条消息,以获得快速、可读的输出:

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

log.info('auth', 'User logged in')
log.warn('cache', 'Cache miss for key user:42')
log.error('payment', 'Stripe webhook failed')
log.debug('router', 'Matched route /api/checkout')
输出(美观格式)
10:23:45.612 [auth] User logged in
10:23:45.613 [cache] Cache miss for key user:42
10:23:45.614 ERROR [payment] Stripe webhook failed
10:23:45.615 [router] Matched route /api/checkout

结构化事件

传递一个对象以生成丰富、可查询的事件,这些事件会通过排水管道传输:

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

log.info({ action: 'user_login', userId: 42, method: 'oauth', provider: 'github' })
log.error({ action: 'sync_failed', source: 'postgres', target: 's3', error: 'connection_timeout' })
输出(美观格式)
10:23:45.612 INFO [my-app]
  ├─ action: user_login
  ├─ userId: 42
  ├─ method: oauth
  └─ provider: github
标签日志 针对控制台可读性进行了优化。结构化事件(对象形式)会生成完整的广泛事件,并通过排水管道传输到外部服务。

日志级别

级别方法使用场景
infolog.info()正常操作:启动、关闭、成功操作
warnlog.warn()可恢复但意外的情况:缓存未命中、重试、弃用
errorlog.error()需要关注的失败:API 错误、超时、无效状态
debuglog.debug()仅开发环境详细信息:SQL 查询、中间状态、路由
log.debug() 调用可以通过 Vite 插件 或 Nuxt 模块的 strip 选项从生产构建设中移除。

常见模式

应用程序生命周期

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

log.info('app', 'Starting server on port 3000')
log.info({ action: 'db_connected', host: 'localhost', database: 'mydb', pool: 10 })
log.info('app', 'Ready to accept connections')

后台任务

src/jobs/cleanup.ts
import { log } from 'evlog'

log.info({ action: 'cron_started', job: 'cleanup', schedule: '0 */6 * * *' })
log.info({ action: 'cron_completed', job: 'cleanup', deleted: 42, duration: 1200 })

实用函数

src/utils/webhook.ts
import { log } from 'evlog'

function processWebhook(payload: WebhookPayload) {
  log.info({ action: 'webhook_received', type: payload.type, source: payload.source })

  if (!isValid(payload)) {
    log.warn({ action: 'webhook_invalid', type: payload.type, reason: 'missing_signature' })
    return
  }
}

排水管道集成

当使用对象形式时,事件会通过 排水管道 传输,就像广泛事件一样:

src/index.ts
import { initLogger, log } from 'evlog'
import { createAxiomDrain } from 'evlog/axiom'

initLogger({
  env: { service: 'my-app' },
  drain: createAxiomDrain(),
})

log.info({ action: 'deploy', version: '1.2.3', region: 'us-east-1' })

何时升级到 createLogger

当每个事件都是独立的,请使用 log。当你需要跨操作的多个步骤累积上下文时,请切换到 createLogger

scripts/sync-data.ts
import { log, createLogger } from 'evlog'

// log:每次调用都是独立的
log.info({ action: 'sync_started', source: 'postgres' })
log.info({ action: 'sync_completed', records: 150 })

// createLogger:累积上下文,仅发出一次
const syncLog = createLogger({ source: 'postgres' })
syncLog.set({ records: 150 })
syncLog.set({ status: 'complete' })
syncLog.emit()

下一步