学习

自动脱敏

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

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

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

退出脱敏

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

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

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

wide event·raw
user.email"alice@example.com" ...
payment.card"4111111111111111" ...
user.ip"192.168.1.42" ...
auth"Bearer sk_live_abc123def" ...
metadata.password"hunter2-correct-horse" ...
user.phone"+33 6 12 34 56 78" ...
user.id42 ...
cart.total9999 ...
smart mask path redact untouched ready for drain · 0 PII leaked

智能屏蔽

内置模式使用部分屏蔽而不是简单的 [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 屏蔽中排除,因为它们不是真实的客户端地址。

配置

路径模式

使用一个带有点表示法和通配符的 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_tokenrefresh_token 的键名
user.*user.emailuser.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],
  }
}

配置参考

选项类型默认值描述
redactboolean | RedactConfig生产环境中的 true默认在生产环境中启用。使用 false 可禁用。用于精细控制的对象
pathsstring[]undefined带通配符的点号表示法路径(password**.password*_tokenuser.*
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。

下一步