evlog 有两个配置面,本页面将分别介绍:启动时设置一次的全局选项,以及按框架集成分别设置的中间件选项。
全局选项(initLogger)
这些选项适用于所有框架。对于独立框架(Hono、Express、Fastify、Elysia、NestJS、SvelteKit、Cloudflare Workers),在应用启动时调用一次 initLogger()。对于 Nuxt 和 Nitro,这些选项通过模块配置设置并自动传递。
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(),
})
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
enabled | boolean | true | 全局启用或禁用所有日志记录。当为 false 时,所有操作都变为空操作 |
env | Partial<EnvironmentContext> | 自动检测 | 环境上下文覆盖项(见下文) |
pretty | boolean | 开发环境中为 true | 使用树形格式进行美化输出。根据 NODE_ENV 自动检测 |
dev | 'evlog' | 'nitro' | 'both' | object | 美化开发环境中为 'evlog' | 开发终端预设,或 { frameworkOverlay, prettyError },请参见调整开发终端输出 |
silent | boolean | false | 禁止控制台输出。事件仍会被构建、采样并传递给排水适配器 |
stringify | boolean | true | 在禁用 pretty 时输出 JSON 字符串。在 Cloudflare Workers 中设置为 false |
minLevel | 'debug' | 'info' | 'warn' | 'error' | 'debug' | 仅适用于全局 log API 的最低严重级别(不适用于 createLogger / 请求范围事件)。顺序:debug < info < warn < error |
sampling | SamplingConfig | undefined | 头部和尾部采样配置。请参见采样 |
redact | boolean | RedactConfig | 生产环境中为 true | 在生产环境中默认启用。设置为 false 可禁用。使用对象进行细粒度控制。请参见自动脱敏 |
drain | (ctx: DrainContext) => void | undefined | 用于向外部服务发送事件的排水回调 |
RedactConfig 字段(当 redact 为对象时):paths(带通配符的点号表示法)、patterns(针对字符串值的正则表达式)、builtins、replacement(字符串,或根据匹配值计算替换内容的函数)、transform(用于条件策略的钩子)。完整表格请参见自动脱敏。
minLevel 与采样的区别
minLevel是简单log.*API 上的硬阈值:低于该阈值的级别永远不会输出。它不适用于来自useLogger/createLogger().emit()的宽事件,请使用sampling.rates(以及尾部采样的keep)控制请求量- 头部采样(
sampling.rates)针对简单日志中已经通过minLevel的内容进行概率采样
对 log.info / log.debug / 等调用的求值顺序为:enabled → minLevel → 头部采样 → 输出。
调整开发终端输出
美化错误块仅在 pretty: true 时运行(开发环境中的默认值)。生产环境始终输出 JSON 宽事件,不包含堆栈片段,也不会读取磁盘。
使用 dev 来控制两个相互独立的轴:Nitro 的 Youch 覆盖层是否运行,以及 evlog 在宽事件中打印多少堆栈细节。
预设(推荐):
| 预设 | Nitro 覆盖层 | evlog 错误块 |
|---|---|---|
'evlog'(美化开发环境中的默认值) | 关闭 | 完整——位置、片段、堆栈尾部、原因/修复 |
'nitro' | 开启 | 仅提供指导——消息 + 原因/修复/链接(堆栈来自 Nitro) |
'both' | 开启 | 完整——evlog 块 + Nitro 覆盖层(调试) |
export default defineNuxtConfig({
modules: ['evlog/nuxt'],
evlog: {
pretty: true,
dev: 'evlog', // 或 'nitro' | 'both'
},
})
显式对象(细粒度):
evlog: {
dev: {
frameworkOverlay: true,
prettyError: {
snippet: false,
stackDepth: 0,
compact: true,
detail: 'guidance', // 'full' | 'guidance'
},
},
}
请参见 Structured Errors 中的开发终端输出,了解美化错误树的示例。
在每个事件中标记环境
env 选项控制每个日志事件中包含的字段。下表列出了未设置字段时读取各字段的变量。
| 字段 | 类型 | 默认值 | 自动检测来源 |
|---|---|---|---|
service | string | 'app' | SERVICE_NAME |
environment | string | 'development' | NODE_ENV |
version | string | undefined | APP_VERSION |
commitHash | string | undefined | COMMIT_SHA、GITHUB_SHA、VERCEL_GIT_COMMIT_SHA、CF_PAGES_COMMIT_SHA |
region | string | undefined | VERCEL_REGION、AWS_REGION、FLY_REGION、CF_REGION |
静默终端
当部署平台以标准输出为主要日志采集方式(GCP Cloud Run、AWS Lambda、Fly.io、Railway 等),且你希望由排水适配器控制输出格式时,请使用 silent。
import { initLogger } from 'evlog'
import { createAxiomDrain } from 'evlog/axiom'
initLogger({
silent: process.env.NODE_ENV === 'production',
drain: createAxiomDrain(),
})
silent 但未设置排水适配器,事件会被构建和采样,但不会输出到任何位置,evlog 会在启动时对此发出警告。中间件选项
这些选项传递给框架中间件/插件,用于控制每个请求的行为:包括记录哪些路由、如何排水和丰富事件,以及自定义尾部采样逻辑。
// lib/evlog.ts
import { createEvlog } from 'evlog/next'
import { createAxiomDrain } from 'evlog/axiom'
export const { withEvlog, useLogger, log, createError } = createEvlog({
service: 'my-app',
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 },
})
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 },
}))
app.use(evlog({
include: ['/api/**'],
drain: createAxiomDrain(),
enrich: (ctx) => { ctx.event.region = process.env.FLY_REGION },
}))
await app.register(evlog, {
include: ['/api/**'],
drain: createAxiomDrain(),
})
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
include | string[] | undefined | 要记录的路由 glob 模式。未设置时记录所有路由 |
exclude | string[] | undefined | 要排除的路由模式。排除优先于包含 |
routes | Record<string, { service: string }> | undefined | 路由级服务名称覆盖 |
drain | (ctx: DrainContext) => void | undefined | 每个事件发出时调用的排水回调 |
enrich | (ctx: EnrichContext) => void | undefined | 发出后、排水前调用的增强回调 |
keep | (ctx: TailSamplingContext) => void | undefined | 自定义尾部采样回调 |
evlog:drain、evlog:enrich、evlog:emit:keep)而不是中间件选项。请参见 Nuxt 和 Nitro 页面。中间件排水与全局排水
当设置了中间件 drain 时,它会覆盖来自 initLogger() 的全局排水适配器。如果未设置中间件排水,则使用全局排水作为回退,并可获得完整的增强事件(含请求上下文,如方法、路径、头部)。
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.ts 的 evlog 键下接受所有全局选项和中间件选项,并额外支持:
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
console | boolean | true | 启用/禁用浏览器控制台输出(仅客户端) |
transport.enabled | boolean | false | 通过 API 端点将客户端日志发送到服务器 |
transport.endpoint | string | '/api/_evlog/ingest' | 自定义传输端点 |
transport.credentials | RequestCredentials | 'same-origin' | 请求凭据模式('include' 用于跨域端点) |
查看完整的 Nuxt 配置。
Nitro
Nitro 模块在 nitro.config.ts 中接受 enabled、env、pretty、silent、sampling、include、exclude 和 routes,而排水和增强则交由 Nitro 钩子处理。
查看 Nitro 排水与增强器。