增强器

内置增强器

所有内置 evlog 增强器的参考。解析用户代理、提取地理位置数据、测量请求大小并自动捕获跟踪上下文。

所有内置增强器都从 evlog/enrichers 导出。每个增强器都是一个工厂函数,返回一个 (ctx: EnrichContext) => void 回调。

提示
将所有内置增强器添加到我的 evlog 配置中。

1. 确定我正在使用的框架并遵循其 evlog 集成模式
2. 从 'evlog/enrichers' 导入 createUserAgentEnricher、createGeoEnricher、createRequestSizeEnricher 和 createTraceContextEnricher
3. 将增强器集成到框架的增强配置中
4. 增强器为广泛事件添加 userAgent、geo、requestSize 和 traceContext 字段
5. 所有增强器都接受 { overwrite?: boolean } - 默认为 false 以保留用户设置的数据

增强器文档:https://www.evlog.dev/enrichers/built-in
框架配置:https://www.evlog.dev/frameworks
server/plugins/evlog-enrich.ts
import {
  createUserAgentEnricher,
  createGeoEnricher,
  createRequestSizeEnricher,
  createTraceContextEnricher,
} from 'evlog/enrichers'

用户代理

User-Agent 标头解析浏览器、操作系统和设备类型。

设置: event.userAgent

user-agent-enricher.ts
const enrich = createUserAgentEnricher()

输出结构:

user-agent-types.ts
interface UserAgentInfo {
  raw: string                                      // 原始 User-Agent 字符串
  browser?: { name: string; version?: string }     // Chrome、Firefox、Safari、Edge
  os?: { name: string; version?: string }          // Windows、macOS、iOS、Android、Linux
  device?: { type: 'mobile' | 'tablet' | 'desktop' | 'bot' | 'unknown' }
}

示例输出:

示例宽事件:userAgent
{
  "userAgent": {
    "raw": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/120.0.0.0",
    "browser": { "name": "Chrome", "version": "120.0.0.0" },
    "os": { "name": "macOS", "version": "10.15.7" },
    "device": { "type": "desktop" }
  }
}

检测到的浏览器: Edge、Chrome、Firefox、Safari(按顺序检查,Edge 在 Chrome 之前以避免错误匹配)。

检测到的设备: 机器人(爬虫、蜘蛛)、平板(iPad)、手机(iPhone、Android 手机)、桌面(备用)。

地理位置

从平台注入的头部提取地理位置数据。

设置: event.geo

geo-enricher.ts
const enrich = createGeoEnricher()

输出结构:

geo-types.ts
interface GeoInfo {
  country?: string      // ISO 国家代码(例如:"US"、"FR")
  region?: string       // 区域/州名称
  regionCode?: string   // 区域代码
  city?: string         // 城市名称
  latitude?: number     // 十进制纬度
  longitude?: number    // 十进制经度
}

支持的平台:

平台头部覆盖范围
Vercelx-vercel-ip-country, x-vercel-ip-country-region, x-vercel-ip-city, x-vercel-ip-latitude, x-vercel-ip-longitude完整
Cloudflarecf-ipcountry仅国家
Cloudflare 注意:cf-ipcountry 是标准的 Cloudflare HTTP 头部。其他地理位置字段(cityregionlatitude 等)是 request.cf 的属性,不会作为头部暴露。如需完整的 Cloudflare 地理位置数据,请编写一个 自定义增强器 来读取 request.cf,或使用 Workers 中间件将 cf 属性复制到自定义头部。

请求大小

Content-Length 头部捕获请求和响应有效负载大小。

设置: event.requestSize

request-size-enricher.ts
const enrich = createRequestSizeEnricher()

输出结构:

request-size-types.ts
interface RequestSizeInfo {
  requestBytes?: number    // 请求 Content-Length
  responseBytes?: number   // 响应 Content-Length
}

示例输出:

示例宽事件:requestSize
{
  "requestSize": {
    "requestBytes": 1234,
    "responseBytes": 5678
  }
}
此增强器读取请求和响应的 Content-Length 头部。如果头部缺失(例如分块传输编码),对应字段将为 undefined

跟踪上下文

traceparenttracestate 头部提取 W3C 跟踪上下文。

设置: event.traceContext, event.traceId, event.spanId

trace-context-enricher.ts
const enrich = createTraceContextEnricher()

输出结构:

trace-context-types.ts
interface TraceContextInfo {
  traceparent?: string   // 完整的 traceparent 头部值
  tracestate?: string    // 完整的 tracestate 头部值
  traceId?: string       // 32 位十六进制跟踪 ID(从 traceparent 解析)
  spanId?: string        // 16 位十六进制跨度 ID(从 traceparent 解析)
}

示例输出:

示例宽事件:traceContext
{
  "traceContext": {
    "traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
    "traceId": "4bf92f3577b34da6a3ce929d0e0e4736",
    "spanId": "00f067aa0ba902b7"
  },
  "traceId": "4bf92f3577b34da6a3ce929d0e0e4736",
  "spanId": "00f067aa0ba902b7"
}

traceIdspanId 也在事件顶层设置,便于查询和关联。

traceparent 格式遵循 W3C 跟踪上下文 规范:{version}-{traceId}-{spanId}-{flags}

完整配置示例

同时使用所有内置增强器:

server/plugins/evlog-enrich.ts
import {
  createUserAgentEnricher,
  createGeoEnricher,
  createRequestSizeEnricher,
  createTraceContextEnricher,
} from 'evlog/enrichers'

export default defineNitroPlugin((nitroApp) => {
  const enrichers = [
    createUserAgentEnricher(),
    createGeoEnricher(),
    createRequestSizeEnricher(),
    createTraceContextEnricher(),
  ]

  nitroApp.hooks.hook('evlog:enrich', (ctx) => {
    for (const enricher of enrichers) enricher(ctx)
  })
})

下一步