核心概念

配置

包含所有 evlog 配置选项的完整参考,包括全局 logger 设置、中间件选项、环境上下文以及框架特定的覆盖配置。

evlog 有两个配置界面:全局选项在启动时设置一次,中间件选项按框架集成分别设置。本页将同时介绍这两者。

全局选项(initLogger

这些选项适用于所有框架。对于独立框架(Hono、Express、Fastify、Elysia、NestJS、SvelteKit、Cloudflare Workers),在应用启动时调用一次 initLogger()。对于 Nuxt 和 Nitro,这些选项通过模块配置设置并自动传递。

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

initLogger({
  enabled: true,
  env: { service: 'my-api', environment: 'production' },
  pretty: false,
  silent: false,
  stringify: true,
  minLevel: 'info',
  sampling: { rates: { info: 10 }, keep: [{ status: 400 }] },
  drain: createAxiomDrain(),
})
选项类型默认值描述
enabledbooleantrue全局启用/禁用日志记录。当为 false 时,所有操作都变为无操作
envPartial<EnvironmentContext>自动检测环境上下文覆盖(详见下文)
prettyboolean开发环境下为 true使用树形格式美化输出。根据 NODE_ENV 自动检测
silentbooleanfalse抑制控制台输出。事件仍会被构建、采样并传递给排水适配器
stringifybooleantruepretty 禁用时输出 JSON 字符串。在 Cloudflare Workers 中设置为 false
minLevel'debug' | 'info' | 'warn' | 'error''debug'仅对全局 log API 生效的最低严重级别(不适用于 createLogger / 请求范围事件)。顺序:debug < info < warn < error
samplingSamplingConfigundefined头部和尾部采样配置。参见 采样
redactboolean | RedactConfig在生产环境下为 true默认在生产环境中启用。false 可禁用。对象用于细粒度控制。参见 自动脱敏
drain(ctx: DrainContext) => voidundefined用于将事件发送到外部服务的排水回调

minLevel 与采样

  • minLevel 是一个 硬阈值,针对简单的 log.* API:低于阈值的级别永远不会被输出。它 适用于来自 useLogger / createLogger().emit() 的宽事件——应使用 sampling.rates(以及尾部 keep)来控制请求量。
  • 头部采样sampling.rates)是在已通过 minLevel 过滤的基础上进行的 概率性 采样。

log.info / log.debug / 等调用的求值顺序为:enabledminLevel → 头部采样 → 输出。

环境上下文

env 选项控制每个日志事件中包含的字段。多数值会自动从环境变量和 package.json 中检测。

字段类型默认值自动检测来源
servicestring'app'SERVICE_NAMEpackage.json 名称
environmentstring'development'NODE_ENV
versionstringundefinedAPP_VERSIONpackage.json 版本
commitHashstringundefinedCOMMIT_SHAGIT_COMMITVERCEL_GIT_COMMIT_SHA
regionstringundefinedFLY_REGIONAWS_REGIONVERCEL_REGION

静默模式

当部署平台以标准输出为主要日志采集方式(GCP Cloud Run、AWS Lambda、Fly.io、铁路等)且你希望由排水适配器控制输出格式时,请使用 silent

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

initLogger({
  silent: process.env.NODE_ENV === 'production',
  drain: createAxiomDrain(),
})
如果启用 silent 但未配置排水适配器,事件会被构建和采样,但永远不会输出到任何地方。evlog 会在启动时对此发出警告。

中间件选项

这些选项传递给框架中间件/插件,用于控制每个请求的行为:包括记录哪些路由、如何排水和丰富事件,以及自定义尾部采样逻辑。

app.use(evlog({
  include: ['/api/**'],
  exclude: ['/api/health'],
  routes: { '/api/auth/**': { service: 'auth' } },
  drain: createAxiomDrain(),
  enrich: (ctx) => { ctx.event.region = process.env.FLY_REGION },
  keep: (ctx) => { if (ctx.duration > 2000) ctx.shouldKeep = true },
}))
选项类型默认值描述
includestring[]undefined要记录的路由 glob 模式。未设置时记录所有路由
excludestring[]undefined要排除的路由模式。排除优先于包含
routesRecord<string, { service: string }>undefined路由级服务名称覆盖
drain(ctx: DrainContext) => voidundefined每个事件发出时调用的排水回调
enrich(ctx: EnrichContext) => voidundefined发出后、排水前调用的增强回调
keep(ctx: TailSamplingContext) => voidundefined自定义尾部采样回调
Nuxt 和 Nitro 使用模块配置而非中间件选项。在 nuxt.config.ts 中通过 evlog 键配置所有全局和中间件选项,并通过 Nitro 钩子(evlog:drainevlog:enrichevlog:emit:keep)处理排水和增强。 参考 Nuxt 配置Nitro 排水与增强器

中间件排水与全局排水

当设置了中间件 drain 时,它会覆盖来自 initLogger() 的全局排水适配器。如果未设置中间件排水,则使用全局排水作为回退,并可获得完整的增强事件(含请求上下文,如方法、路径、头部)。

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

initLogger({
  env: { service: 'my-api' },
  drain: createAxiomDrain(), // 回退:被单例 log API 和无中间件排水时使用
})

app.use(evlog({
  // 未设置排水——回退到全局排水,并携带完整请求上下文
}))

框架特定选项

某些框架拥有超出共享配置的额外选项:

Nuxt

Nuxt 模块在 nuxt.config.tsevlog 键下接受所有全局选项和中间件选项,并额外支持:

选项类型默认值描述
consolebooleantrue启用/禁用浏览器控制台输出(仅客户端)
transport.enabledbooleanfalse通过 API 端点将客户端日志发送到服务器
transport.endpointstring'/api/_evlog/ingest'自定义传输端点
transport.credentialsRequestCredentials'same-origin'请求凭据模式('include' 用于跨域端点)

参见完整的 Nuxt 配置

Nitro

Nitro 模块在 nitro.config.ts 中接受 enabledenvprettysilentsamplingincludeexcluderoutes。排水和增强通过 Nitro 钩子完成。

参见 Nitro 排水与增强器