所有内置增强器都从 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 // 十进制经度
}
支持的平台:
| 平台 | 头部 | 覆盖范围 |
|---|---|---|
| Vercel | x-vercel-ip-country, x-vercel-ip-country-region, x-vercel-ip-city, x-vercel-ip-latitude, x-vercel-ip-longitude | 完整 |
| Cloudflare | cf-ipcountry | 仅国家 |
Cloudflare 注意: 仅
cf-ipcountry 是标准的 Cloudflare HTTP 头部。其他地理位置字段(city、region、latitude 等)是 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。跟踪上下文
从 traceparent 和 tracestate 头部提取 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"
}
traceId 和 spanId 也在事件顶层设置,便于查询和关联。
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)
})
})