日志记录
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
标签日志 针对控制台可读性进行了优化。结构化事件(对象形式)会生成完整的广泛事件,并通过排水管道传输到外部服务。
日志级别
| 级别 | 方法 | 使用场景 |
|---|---|---|
info | log.info() | 正常操作:启动、关闭、成功操作 |
warn | log.warn() | 可恢复但意外的情况:缓存未命中、重试、弃用 |
error | log.error() | 需要关注的失败:API 错误、超时、无效状态 |
debug | log.debug() | 仅开发环境详细信息:SQL 查询、中间状态、路由 |
常见模式
应用程序生命周期
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()