宽事件(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 屏蔽中排除,因为它们不是真实的客户端地址。配置
自定义路径
添加点表示法的路径,以 [REDACTED] 屏蔽特定字段(在内置模式之上):
evlog: {
redact: {
paths: ['user.password', 'headers.authorization'],
}
}
基于路径的脱敏会将整个值替换为 replacement 字符串(默认为 [REDACTED]),与内容无关。
选择性内置模式
仅选择你需要的模式:
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 | 要完全屏蔽的点表示法路径(例如 user.password) |
patterns | RegExp[] | undefined | 自定义正则表达式模式。使用简单的 replacement 字符串 |
builtins | false | string[] | 全部启用 | false 禁用内置模式。数组用于选择特定模式 |
replacement | string | '[REDACTED]' | 路径和自定义模式的替换字符串。内置模式使用智能屏蔽 |
可用的内置名称:creditCard、email、ipv4、phone、jwt、bearer、iban。
工作原理
脱敏在发射管道中运行,在宽事件完全构建后、但在任何输出之前执行:
- 路径脱敏 — 目标字段被替换为
[REDACTED] - 智能屏蔽 — 内置模式递归扫描所有字符串值并进行部分屏蔽
- 模式脱敏 — 自定义正则表达式模式扫描所有字符串值并进行简单替换
- 控制台输出 — 屏蔽后的事件打印到标准输出
- 传输 — 屏蔽后的事件发送到外部服务
脱敏在 HTTP 响应发送之后运行,因此不会增加 API 响应的延迟。
生产环境示例
脱敏在生产环境中默认已启用。结合采样功能可以实现典型配置:
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。