宽事件(Wide events)会捕获全面的上下文信息,这使得意外记录敏感数据变得很容易。自动脱敏会在事件输出到控制台以及**传输到任何接收器(drain)**之前,对事件中的个人身份信息(PII)进行清理。
在生产环境中,脱敏功能默认启用(NODE_ENV === 'production')。在开发环境中,脱敏功能关闭,以便你查看完整的值进行调试。无需配置 — 直接部署即可。
退出脱敏
如果你需要在生产环境中禁用脱敏:
export default defineNuxtConfig({
modules: ['evlog/nuxt'],
evlog: {
redact: false,
},
})
import { createEvlog } from 'evlog/next'
export const { withEvlog, useLogger } = createEvlog({
service: 'my-app',
redact: false,
})
import { initLogger } from 'evlog'
initLogger({
env: { service: 'my-app' },
redact: false,
})
你也可以通过设置 redact: true 在开发环境中显式启用脱敏。
智能屏蔽
内置模式使用部分屏蔽而不是简单的 [REDACTED] — 在保护真实数据的同时保留足够的上下文信息以便调试。
| 模式 | 示例输入 | 屏蔽输出 |
|---|---|---|
creditCard | 4111111111111111 | ****1111 |
email | alice@example.com | a***@***.com |
ipv4 | 192.168.1.100 | ***.***.***.100 |
phone | +33 6 12 34 56 78 | +33 ****5678 |
jwt | eyJhbGciOiJIUzI1NiIs... | eyJ***.*** |
bearer | Bearer sk_live_abc123... | Bearer *** |
iban | FR76 3000 6000 0112 ...189 | FR76****189 |
127.0.0.1 和 0.0.0.0 从 IPv4 屏蔽中排除,因为它们不是真实的客户端地址。配置
路径模式
使用一个带有点表示法和通配符的 paths 数组。像 password 这样的裸段是 **.password 的简写——它会在任意嵌套深度下隐藏该键:
evlog: {
redact: {
paths: [
'password', // same as '**.password'
'*_token', // key-name glob at any depth
'headers.x-forwarded-for', // exact path
'user.*', // everything directly under user
],
}
}
| 模式 | 匹配项 |
|---|---|
user.email | 仅精确路径 |
password or **.password | 任意深度的 password 键 |
*_token | 类似 access_token、refresh_token 的键名 |
user.* | user.email、user.password 等 |
audit.changes.*.password | 精确匹配 + 通配符片段混合 |
路径脱敏会将整个值(包括嵌套对象)替换为 replacement。当你需要对字段内的字符串值使用正则时,请使用 patterns。
这与 auditDiff({ redactPaths: ['password'] }) 一致——同样的 glob 语法,但在输出时全局应用。
选择性内置模式
仅选择你需要的模式:
evlog: {
redact: {
builtins: ['email', 'creditCard'],
}
}
自定义模式
添加你自己的正则表达式模式。这些使用简单的 replacement 字符串,而非智能屏蔽:
evlog: {
redact: {
patterns: [/SECRET_\w+/g, /sk_live_\w+/g],
replacement: '***',
}
}
禁用内置模式
如果你只想使用自定义脱敏:
evlog: {
redact: {
builtins: false,
paths: ['user.ssn'],
patterns: [/INTERNAL_\w+/g],
}
}
配置参考
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
redact | boolean | RedactConfig | 生产环境中的 true | 默认在生产环境中启用。使用 false 可禁用。用于精细控制的对象 |
paths | string[] | undefined | 带通配符的点号表示法路径(password、**.password、*_token、user.*) |
patterns | RegExp[] | undefined | 字符串值上的自定义正则表达式。使用扁平的 replacement 字符串 |
builtins | false | string[] | 全部启用 | false 会禁用内置项。数组可选择特定项 |
replacement | string | '[REDACTED]' | 用于路径和自定义模式的替代方案。内置项会改用智能遮蔽 |
可用的内置名称:creditCard、email、ipv4、phone、jwt、bearer、iban。
工作原理
脱敏在发射管道中运行,在宽事件完全构建后、但在任何输出之前执行:
- 路径脱敏 — 精确路径和通配符会被替换为
[REDACTED] - 智能遮蔽 — 内置模式会递归扫描所有字符串值,并进行部分遮蔽
- 模式脱敏 — 自定义正则模式会扫描所有字符串值,并进行扁平替换
- 控制台输出 — 将遮蔽后的事件打印到标准输出
- 排出 — 将遮蔽后的事件发送到外部服务
生产环境示例
脱敏在生产环境中默认已启用。结合采样功能可以实现典型配置:
export default defineNuxtConfig({
modules: ['evlog/nuxt'],
evlog: {
env: { service: 'my-app' },
},
$production: {
evlog: {
sampling: {
rates: { info: 10, debug: 0 },
keep: [{ status: 400 }, { duration: 1000 }],
},
},
},
})
import { createEvlog } from 'evlog/next'
export const { withEvlog, useLogger } = createEvlog({
service: 'my-app',
sampling: {
rates: { info: 10, debug: 0 },
keep: [{ status: 400 }, { duration: 1000 }],
},
})
import { initLogger } from 'evlog'
initLogger({
env: { service: 'my-app' },
sampling: {
rates: { info: 10, debug: 0 },
keep: [{ status: 400 }, { duration: 1000 }],
},
})
脱敏前 / 脱敏后
未启用脱敏时,敏感数据会进入你的日志和传输器:
{
"user": { "email": "alice@example.com", "ip": "192.168.1.42" },
"payment": { "card": "4111111111111111" },
"auth": "Bearer sk_live_abc123def456"
}
启用 redact: true 后:
{
"user": { "email": "a***@***.com", "ip": "***.***.***.42" },
"payment": { "card": "****1111" },
"auth": "Bearer ***"
}
相同的调试上下文,没有 PII 进入 Axiom/Datadog/Sentry。