核心概念

自动脱敏

在控制台输出和传输之前自动清理事件中的个人身份信息(PII)。内置对信用卡、电子邮件、IP地址、电话号码、JWT等的智能屏蔽。

宽事件(Wide events)捕获全面的上下文信息,这使得意外记录敏感数据变得很容易。自动脱敏会在事件输出到控制台以及**传输到任何接收器(drain)**之前,对事件中的个人身份信息(PII)进行清理。

在生产环境中,脱敏功能默认启用NODE_ENV === 'production')。在开发环境中,脱敏功能关闭,以便你查看完整的值进行调试。无需配置 — 直接部署即可。

退出脱敏

如果你需要在生产环境中禁用脱敏:

export default defineNuxtConfig({
  modules: ['evlog/nuxt'],
  evlog: {
    redact: false,
  },
})

你也可以通过设置 redact: true 在开发环境中显式启用脱敏。

智能屏蔽

内置模式使用部分屏蔽而不是简单的 [REDACTED] — 在保护真实数据的同时保留足够的上下文信息以便调试。

模式示例输入屏蔽输出
creditCard4111111111111111****1111
emailalice@example.coma***@***.com
ipv4192.168.1.100***.***.***.100
phone+33 6 12 34 56 78+33 ****5678
jwteyJhbGciOiJIUzI1NiIs...eyJ***.***
bearerBearer sk_live_abc123...Bearer ***
ibanFR76 3000 6000 0112 ...189FR76****189
127.0.0.10.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],
  }
}

配置参考

选项类型默认值描述
redactboolean | RedactConfig生产环境中为 true生产环境中默认启用。false 表示禁用。对象用于细粒度控制
pathsstring[]undefined要完全屏蔽的点表示法路径(例如 user.password
patternsRegExp[]undefined自定义正则表达式模式。使用简单的 replacement 字符串
builtinsfalse | string[]全部启用false 禁用内置模式。数组用于选择特定模式
replacementstring'[REDACTED]'路径和自定义模式的替换字符串。内置模式使用智能屏蔽

可用的内置名称:creditCardemailipv4phonejwtbeareriban

工作原理

脱敏在发射管道中运行,在宽事件完全构建后、但在任何输出之前执行:

  1. 路径脱敏 — 目标字段被替换为 [REDACTED]
  2. 智能屏蔽 — 内置模式递归扫描所有字符串值并进行部分屏蔽
  3. 模式脱敏 — 自定义正则表达式模式扫描所有字符串值并进行简单替换
  4. 控制台输出 — 屏蔽后的事件打印到标准输出
  5. 传输 — 屏蔽后的事件发送到外部服务
脱敏在 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 }],
      },
    },
  },
})

脱敏前 / 脱敏后

未启用脱敏时,敏感数据会进入你的日志和传输器:

{
  "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。

下一步