[{"data":1,"prerenderedAt":2464},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-enrichers":434,"-use-cases-enrichers-surround":2459},[4,30,80,240,348,403],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"Integrate","\u002Fintegrate","3.integrate",[85,89,152],{"title":36,"path":86,"stem":87,"icon":88},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":90,"path":91,"stem":92,"children":93,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[94,97,137],{"title":36,"path":95,"stem":96,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":98,"path":99,"stem":100,"children":101,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[102,107,112,117,122,127,132],{"title":103,"path":104,"stem":105,"icon":106},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":108,"path":109,"stem":110,"icon":111},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":113,"path":114,"stem":115,"icon":116},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":118,"path":119,"stem":120,"icon":121},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":123,"path":124,"stem":125,"icon":126},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":128,"path":129,"stem":130,"icon":131},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":133,"path":134,"stem":135,"icon":136},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[142,147],{"title":143,"path":144,"stem":145,"icon":146},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":148,"path":149,"stem":150,"icon":151},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":153,"path":154,"stem":155,"children":156,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[157,161,166,171,176,181,186,191,196,201,206,211,216,221,225,230,235],{"title":36,"path":158,"stem":159,"icon":160},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":162,"path":163,"stem":164,"icon":165},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":167,"path":168,"stem":169,"icon":170},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":172,"path":173,"stem":174,"icon":175},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":177,"path":178,"stem":179,"icon":180},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":182,"path":183,"stem":184,"icon":185},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":187,"path":188,"stem":189,"icon":190},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":192,"path":193,"stem":194,"icon":195},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":197,"path":198,"stem":199,"icon":200},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":202,"path":203,"stem":204,"icon":205},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":207,"path":208,"stem":209,"icon":210},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":212,"path":213,"stem":214,"icon":215},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":217,"path":218,"stem":219,"icon":220},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":222,"path":223,"stem":224,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":226,"path":227,"stem":228,"icon":229},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":231,"path":232,"stem":233,"icon":234},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":236,"path":237,"stem":238,"icon":239},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":241,"path":242,"stem":243,"children":244,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[245,249,254,283,311,343],{"title":36,"path":246,"stem":247,"icon":248},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":250,"path":251,"stem":252,"icon":253},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":255,"icon":256,"path":257,"stem":258,"children":259,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[260,263,268,273,278],{"title":36,"path":261,"stem":262,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":264,"path":265,"stem":266,"icon":267},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":269,"path":270,"stem":271,"icon":272},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":274,"path":275,"stem":276,"icon":277},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":279,"path":280,"stem":281,"icon":282},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":284,"icon":285,"path":286,"stem":287,"children":288,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[289,292,297,302,306],{"title":36,"path":290,"stem":291,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":293,"path":294,"stem":295,"icon":296},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":298,"path":299,"stem":300,"icon":301},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":303,"path":304,"stem":305,"icon":253},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":307,"path":308,"stem":309,"icon":310},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":312,"icon":313,"path":314,"stem":315,"children":316,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[317,320,325,330,335,339],{"title":36,"path":318,"stem":319,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":321,"path":322,"stem":323,"icon":324},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":326,"path":327,"stem":328,"icon":329},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":331,"path":332,"stem":333,"icon":334},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":336,"path":337,"stem":338,"icon":313},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":340,"path":341,"stem":342,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":344,"path":345,"stem":346,"icon":347},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":349,"path":350,"stem":351,"children":352,"page":29},"Extend","\u002Fextend","5.extend",[353,357,362,367,372,376,380,384,388,393,398],{"title":36,"path":354,"stem":355,"icon":356},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":358,"path":359,"stem":360,"icon":361},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":363,"path":364,"stem":365,"icon":366},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":368,"path":369,"stem":370,"icon":371},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":340,"path":373,"stem":374,"icon":375},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":377,"path":378,"stem":379,"icon":356},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":381,"path":382,"stem":383,"icon":347},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":385,"path":386,"stem":387,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":389,"path":390,"stem":391,"icon":392},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":394,"path":395,"stem":396,"icon":397},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":399,"path":400,"stem":401,"icon":402},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":404,"path":405,"stem":406,"children":407,"page":29},"Reference","\u002Freference","6.reference",[408,413,416,421,425,430],{"title":409,"path":410,"stem":411,"icon":412},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":307,"path":414,"stem":415,"icon":310},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":417,"path":418,"stem":419,"icon":420},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":422,"path":423,"stem":424,"icon":313},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":426,"path":427,"stem":428,"icon":429},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":431,"path":432,"stem":433,"icon":347},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":435,"title":344,"body":436,"description":2449,"extension":2450,"links":2451,"meta":2455,"navigation":2456,"path":345,"seo":2457,"stem":346,"__hash__":2458},"docs\u002F4.use-cases\u002F5.enrichers.md",{"type":437,"value":438,"toc":2441},"minimark",[439,443,460,500,575,580,587,597,622,627,789,794,984,990,996,1000,1003,1010,1029,1033,1125,1130,1192,1228,1232,1239,1246,1265,1269,1312,1316,1377,1386,1390,1400,1413,1432,1436,1503,1507,1632,1639,1651,1655,1658,2420,2424,2437],[440,441,442],"p",{},"Enrichers add derived context to your wide events after they are emitted, before they reach your drain adapters. Use them to automatically extract useful information from request headers without cluttering your application code.",[440,444,445,446,450,451,454,455,459],{},"All built-in enrichers are exported from ",[447,448,449],"code",{},"evlog\u002Fenrichers",". Each enricher is a factory function that returns an ",[447,452,453],{},"(ctx: EnrichContext) => void"," callback. To write your own, see ",[456,457,458],"a",{"href":382},"Custom Enrichers",".",[461,462,465,468,487],"prompt",{":actions":463,"description":464,"icon":366},"[\"copy\",\"cursor\",\"windsurf\"]","Add all built-in evlog enrichers",[440,466,467],{},"Add all built-in enrichers to my evlog setup.",[469,470,471,475,478,481,484],"ol",{},[472,473,474],"li",{},"Identify which framework I'm using and follow its evlog integration pattern",[472,476,477],{},"Import createUserAgentEnricher, createGeoEnricher, createRequestSizeEnricher, and createTraceContextEnricher from 'evlog\u002Fenrichers'",[472,479,480],{},"Wire the enrichers into my framework's enrich configuration",[472,482,483],{},"Enrichers add userAgent, geo, requestSize, and traceContext fields to wide events",[472,485,486],{},"All enrichers accept { overwrite?: boolean } - defaults to false to preserve user-set data",[440,488,489,490,495,496],{},"Enricher docs: ",[456,491,492],{"href":492,"rel":493},"https:\u002F\u002Fwww.evlog.dev\u002Fuse-cases\u002Fenrichers",[494],"nofollow","\nFramework setup: ",[456,497,498],{"href":498,"rel":499},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Foverview",[494],[501,502,508],"pre",{"className":503,"code":504,"filename":505,"language":506,"meta":507,"style":507},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  createUserAgentEnricher,\n  createGeoEnricher,\n  createRequestSizeEnricher,\n  createTraceContextEnricher,\n} from 'evlog\u002Fenrichers'\n","server\u002Fplugins\u002Fevlog-enrich.ts","typescript","",[447,509,510,523,533,541,549,557],{"__ignoreMap":507},[511,512,515,519],"span",{"class":513,"line":514},"line",1,[511,516,518],{"class":517},"s7zQu","import",[511,520,522],{"class":521},"sMK4o"," {\n",[511,524,526,530],{"class":513,"line":525},2,[511,527,529],{"class":528},"sTEyZ","  createUserAgentEnricher",[511,531,532],{"class":521},",\n",[511,534,536,539],{"class":513,"line":535},3,[511,537,538],{"class":528},"  createGeoEnricher",[511,540,532],{"class":521},[511,542,544,547],{"class":513,"line":543},4,[511,545,546],{"class":528},"  createRequestSizeEnricher",[511,548,532],{"class":521},[511,550,552,555],{"class":513,"line":551},5,[511,553,554],{"class":528},"  createTraceContextEnricher",[511,556,532],{"class":521},[511,558,560,563,566,569,572],{"class":513,"line":559},6,[511,561,562],{"class":521},"}",[511,564,565],{"class":517}," from",[511,567,568],{"class":521}," '",[511,570,449],{"class":571},"sfazB",[511,573,574],{"class":521},"'\n",[576,577,579],"h2",{"id":578},"user-agent","User Agent",[440,581,582,583,586],{},"Parse browser, OS, and device type from the ",[447,584,585],{},"User-Agent"," header.",[440,588,589,593,594],{},[590,591,592],"strong",{},"Sets:"," ",[447,595,596],{},"event.userAgent",[501,598,601],{"className":503,"code":599,"filename":600,"language":506,"meta":507,"style":507},"const enrich = createUserAgentEnricher()\n","user-agent-enricher.ts",[447,602,603],{"__ignoreMap":507},[511,604,605,609,612,615,619],{"class":513,"line":514},[511,606,608],{"class":607},"spNyl","const",[511,610,611],{"class":528}," enrich ",[511,613,614],{"class":521},"=",[511,616,618],{"class":617},"s2Zo4"," createUserAgentEnricher",[511,620,621],{"class":528},"()\n",[440,623,624],{},[590,625,626],{},"Output shape:",[501,628,631],{"className":503,"code":629,"filename":630,"language":506,"meta":507,"style":507},"interface UserAgentInfo {\n  raw: string                                      \u002F\u002F Original User-Agent string\n  browser?: { name: string; version?: string }     \u002F\u002F Chrome, Firefox, Safari, Edge\n  os?: { name: string; version?: string }          \u002F\u002F Windows, macOS, iOS, Android, Linux\n  device?: { type: 'mobile' | 'tablet' | 'desktop' | 'bot' | 'unknown' }\n}\n","user-agent-types.ts",[447,632,633,644,660,694,722,784],{"__ignoreMap":507},[511,634,635,638,642],{"class":513,"line":514},[511,636,637],{"class":607},"interface",[511,639,641],{"class":640},"sBMFI"," UserAgentInfo",[511,643,522],{"class":521},[511,645,646,650,653,656],{"class":513,"line":525},[511,647,649],{"class":648},"swJcz","  raw",[511,651,652],{"class":521},":",[511,654,655],{"class":640}," string",[511,657,659],{"class":658},"sHwdD","                                      \u002F\u002F Original User-Agent string\n",[511,661,662,665,668,671,674,676,678,681,684,686,688,691],{"class":513,"line":535},[511,663,664],{"class":648},"  browser",[511,666,667],{"class":521},"?:",[511,669,670],{"class":521}," {",[511,672,673],{"class":648}," name",[511,675,652],{"class":521},[511,677,655],{"class":640},[511,679,680],{"class":521},";",[511,682,683],{"class":648}," version",[511,685,667],{"class":521},[511,687,655],{"class":640},[511,689,690],{"class":521}," }",[511,692,693],{"class":658},"     \u002F\u002F Chrome, Firefox, Safari, Edge\n",[511,695,696,699,701,703,705,707,709,711,713,715,717,719],{"class":513,"line":543},[511,697,698],{"class":648},"  os",[511,700,667],{"class":521},[511,702,670],{"class":521},[511,704,673],{"class":648},[511,706,652],{"class":521},[511,708,655],{"class":640},[511,710,680],{"class":521},[511,712,683],{"class":648},[511,714,667],{"class":521},[511,716,655],{"class":640},[511,718,690],{"class":521},[511,720,721],{"class":658},"          \u002F\u002F Windows, macOS, iOS, Android, Linux\n",[511,723,724,727,729,731,734,736,738,741,744,747,749,752,754,756,758,761,763,765,767,770,772,774,776,779,781],{"class":513,"line":551},[511,725,726],{"class":648},"  device",[511,728,667],{"class":521},[511,730,670],{"class":521},[511,732,733],{"class":648}," type",[511,735,652],{"class":521},[511,737,568],{"class":521},[511,739,740],{"class":571},"mobile",[511,742,743],{"class":521},"'",[511,745,746],{"class":521}," |",[511,748,568],{"class":521},[511,750,751],{"class":571},"tablet",[511,753,743],{"class":521},[511,755,746],{"class":521},[511,757,568],{"class":521},[511,759,760],{"class":571},"desktop",[511,762,743],{"class":521},[511,764,746],{"class":521},[511,766,568],{"class":521},[511,768,769],{"class":571},"bot",[511,771,743],{"class":521},[511,773,746],{"class":521},[511,775,568],{"class":521},[511,777,778],{"class":571},"unknown",[511,780,743],{"class":521},[511,782,783],{"class":521}," }\n",[511,785,786],{"class":513,"line":559},[511,787,788],{"class":521},"}\n",[440,790,791],{},[590,792,793],{},"Example output:",[501,795,800],{"className":796,"code":797,"filename":798,"language":799,"meta":507,"style":507},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"userAgent\": {\n    \"raw\": \"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36 Chrome\u002F120.0.0.0\",\n    \"browser\": { \"name\": \"Chrome\", \"version\": \"120.0.0.0\" },\n    \"os\": { \"name\": \"macOS\", \"version\": \"10.15.7\" },\n    \"device\": { \"type\": \"desktop\" }\n  }\n}\n","Example wide event: userAgent","json",[447,801,802,807,822,844,896,943,973,979],{"__ignoreMap":507},[511,803,804],{"class":513,"line":514},[511,805,806],{"class":521},"{\n",[511,808,809,812,815,818,820],{"class":513,"line":525},[511,810,811],{"class":521},"  \"",[511,813,814],{"class":607},"userAgent",[511,816,817],{"class":521},"\"",[511,819,652],{"class":521},[511,821,522],{"class":521},[511,823,824,827,830,832,834,837,840,842],{"class":513,"line":535},[511,825,826],{"class":521},"    \"",[511,828,829],{"class":640},"raw",[511,831,817],{"class":521},[511,833,652],{"class":521},[511,835,836],{"class":521}," \"",[511,838,839],{"class":571},"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36 Chrome\u002F120.0.0.0",[511,841,817],{"class":521},[511,843,532],{"class":521},[511,845,846,848,851,853,855,857,859,863,865,867,869,872,874,877,879,882,884,886,888,891,893],{"class":513,"line":543},[511,847,826],{"class":521},[511,849,850],{"class":640},"browser",[511,852,817],{"class":521},[511,854,652],{"class":521},[511,856,670],{"class":521},[511,858,836],{"class":521},[511,860,862],{"class":861},"sbssI","name",[511,864,817],{"class":521},[511,866,652],{"class":521},[511,868,836],{"class":521},[511,870,871],{"class":571},"Chrome",[511,873,817],{"class":521},[511,875,876],{"class":521},",",[511,878,836],{"class":521},[511,880,881],{"class":861},"version",[511,883,817],{"class":521},[511,885,652],{"class":521},[511,887,836],{"class":521},[511,889,890],{"class":571},"120.0.0.0",[511,892,817],{"class":521},[511,894,895],{"class":521}," },\n",[511,897,898,900,903,905,907,909,911,913,915,917,919,922,924,926,928,930,932,934,936,939,941],{"class":513,"line":551},[511,899,826],{"class":521},[511,901,902],{"class":640},"os",[511,904,817],{"class":521},[511,906,652],{"class":521},[511,908,670],{"class":521},[511,910,836],{"class":521},[511,912,862],{"class":861},[511,914,817],{"class":521},[511,916,652],{"class":521},[511,918,836],{"class":521},[511,920,921],{"class":571},"macOS",[511,923,817],{"class":521},[511,925,876],{"class":521},[511,927,836],{"class":521},[511,929,881],{"class":861},[511,931,817],{"class":521},[511,933,652],{"class":521},[511,935,836],{"class":521},[511,937,938],{"class":571},"10.15.7",[511,940,817],{"class":521},[511,942,895],{"class":521},[511,944,945,947,950,952,954,956,958,961,963,965,967,969,971],{"class":513,"line":559},[511,946,826],{"class":521},[511,948,949],{"class":640},"device",[511,951,817],{"class":521},[511,953,652],{"class":521},[511,955,670],{"class":521},[511,957,836],{"class":521},[511,959,960],{"class":861},"type",[511,962,817],{"class":521},[511,964,652],{"class":521},[511,966,836],{"class":521},[511,968,760],{"class":571},[511,970,817],{"class":521},[511,972,783],{"class":521},[511,974,976],{"class":513,"line":975},7,[511,977,978],{"class":521},"  }\n",[511,980,982],{"class":513,"line":981},8,[511,983,788],{"class":521},[440,985,986,989],{},[590,987,988],{},"Detected browsers:"," Edge, Chrome, Firefox, Safari (checked in order, Edge before Chrome to avoid false matches).",[440,991,992,995],{},[590,993,994],{},"Detected devices:"," Bot (crawlers, spiders), Tablet (iPad), Mobile (iPhone, Android phones), Desktop (fallback).",[576,997,999],{"id":998},"geo","Geo",[440,1001,1002],{},"Extract geographic data from platform-injected headers.",[440,1004,1005,593,1007],{},[590,1006,592],{},[447,1008,1009],{},"event.geo",[501,1011,1014],{"className":503,"code":1012,"filename":1013,"language":506,"meta":507,"style":507},"const enrich = createGeoEnricher()\n","geo-enricher.ts",[447,1015,1016],{"__ignoreMap":507},[511,1017,1018,1020,1022,1024,1027],{"class":513,"line":514},[511,1019,608],{"class":607},[511,1021,611],{"class":528},[511,1023,614],{"class":521},[511,1025,1026],{"class":617}," createGeoEnricher",[511,1028,621],{"class":528},[440,1030,1031],{},[590,1032,626],{},[501,1034,1037],{"className":503,"code":1035,"filename":1036,"language":506,"meta":507,"style":507},"interface GeoInfo {\n  country?: string      \u002F\u002F ISO country code (e.g., \"US\", \"FR\")\n  region?: string       \u002F\u002F Region\u002Fstate name\n  regionCode?: string   \u002F\u002F Region code\n  city?: string         \u002F\u002F City name\n  latitude?: number     \u002F\u002F Decimal latitude\n  longitude?: number    \u002F\u002F Decimal longitude\n}\n","geo-types.ts",[447,1038,1039,1048,1060,1072,1084,1096,1109,1121],{"__ignoreMap":507},[511,1040,1041,1043,1046],{"class":513,"line":514},[511,1042,637],{"class":607},[511,1044,1045],{"class":640}," GeoInfo",[511,1047,522],{"class":521},[511,1049,1050,1053,1055,1057],{"class":513,"line":525},[511,1051,1052],{"class":648},"  country",[511,1054,667],{"class":521},[511,1056,655],{"class":640},[511,1058,1059],{"class":658},"      \u002F\u002F ISO country code (e.g., \"US\", \"FR\")\n",[511,1061,1062,1065,1067,1069],{"class":513,"line":535},[511,1063,1064],{"class":648},"  region",[511,1066,667],{"class":521},[511,1068,655],{"class":640},[511,1070,1071],{"class":658},"       \u002F\u002F Region\u002Fstate name\n",[511,1073,1074,1077,1079,1081],{"class":513,"line":543},[511,1075,1076],{"class":648},"  regionCode",[511,1078,667],{"class":521},[511,1080,655],{"class":640},[511,1082,1083],{"class":658},"   \u002F\u002F Region code\n",[511,1085,1086,1089,1091,1093],{"class":513,"line":551},[511,1087,1088],{"class":648},"  city",[511,1090,667],{"class":521},[511,1092,655],{"class":640},[511,1094,1095],{"class":658},"         \u002F\u002F City name\n",[511,1097,1098,1101,1103,1106],{"class":513,"line":559},[511,1099,1100],{"class":648},"  latitude",[511,1102,667],{"class":521},[511,1104,1105],{"class":640}," number",[511,1107,1108],{"class":658},"     \u002F\u002F Decimal latitude\n",[511,1110,1111,1114,1116,1118],{"class":513,"line":975},[511,1112,1113],{"class":648},"  longitude",[511,1115,667],{"class":521},[511,1117,1105],{"class":640},[511,1119,1120],{"class":658},"    \u002F\u002F Decimal longitude\n",[511,1122,1123],{"class":513,"line":981},[511,1124,788],{"class":521},[440,1126,1127],{},[590,1128,1129],{},"Supported platforms:",[1131,1132,1133,1149],"table",{},[1134,1135,1136],"thead",{},[1137,1138,1139,1143,1146],"tr",{},[1140,1141,1142],"th",{},"Platform",[1140,1144,1145],{},"Headers",[1140,1147,1148],{},"Coverage",[1150,1151,1152,1179],"tbody",{},[1137,1153,1154,1158,1176],{},[1155,1156,1157],"td",{},"Vercel",[1155,1159,1160,1163,1164,1163,1167,1163,1170,1163,1173],{},[447,1161,1162],{},"x-vercel-ip-country",", ",[447,1165,1166],{},"x-vercel-ip-country-region",[447,1168,1169],{},"x-vercel-ip-city",[447,1171,1172],{},"x-vercel-ip-latitude",[447,1174,1175],{},"x-vercel-ip-longitude",[1155,1177,1178],{},"Full",[1137,1180,1181,1184,1189],{},[1155,1182,1183],{},"Cloudflare",[1155,1185,1186],{},[447,1187,1188],{},"cf-ipcountry",[1155,1190,1191],{},"Country only",[1193,1194,1196,1199,1200,1202,1203,1163,1206,1163,1209,1212,1213,1216,1217,1220,1221,1223,1224,1227],"callout",{"color":1195,"icon":13},"info",[590,1197,1198],{},"Cloudflare note:"," Only ",[447,1201,1188],{}," is a standard Cloudflare HTTP header. Other geo fields (",[447,1204,1205],{},"city",[447,1207,1208],{},"region",[447,1210,1211],{},"latitude",", etc.) are properties of ",[447,1214,1215],{},"request.cf",", which is not exposed as headers. For full Cloudflare geo data, write a ",[456,1218,1219],{"href":382},"custom enricher"," that reads ",[447,1222,1215],{},", or use a Workers middleware to copy ",[447,1225,1226],{},"cf"," properties into custom headers.",[576,1229,1231],{"id":1230},"request-size","Request Size",[440,1233,1234,1235,1238],{},"Capture request and response payload sizes from ",[447,1236,1237],{},"Content-Length"," headers.",[440,1240,1241,593,1243],{},[590,1242,592],{},[447,1244,1245],{},"event.requestSize",[501,1247,1250],{"className":503,"code":1248,"filename":1249,"language":506,"meta":507,"style":507},"const enrich = createRequestSizeEnricher()\n","request-size-enricher.ts",[447,1251,1252],{"__ignoreMap":507},[511,1253,1254,1256,1258,1260,1263],{"class":513,"line":514},[511,1255,608],{"class":607},[511,1257,611],{"class":528},[511,1259,614],{"class":521},[511,1261,1262],{"class":617}," createRequestSizeEnricher",[511,1264,621],{"class":528},[440,1266,1267],{},[590,1268,626],{},[501,1270,1273],{"className":503,"code":1271,"filename":1272,"language":506,"meta":507,"style":507},"interface RequestSizeInfo {\n  requestBytes?: number    \u002F\u002F Request Content-Length\n  responseBytes?: number   \u002F\u002F Response Content-Length\n}\n","request-size-types.ts",[447,1274,1275,1284,1296,1308],{"__ignoreMap":507},[511,1276,1277,1279,1282],{"class":513,"line":514},[511,1278,637],{"class":607},[511,1280,1281],{"class":640}," RequestSizeInfo",[511,1283,522],{"class":521},[511,1285,1286,1289,1291,1293],{"class":513,"line":525},[511,1287,1288],{"class":648},"  requestBytes",[511,1290,667],{"class":521},[511,1292,1105],{"class":640},[511,1294,1295],{"class":658},"    \u002F\u002F Request Content-Length\n",[511,1297,1298,1301,1303,1305],{"class":513,"line":535},[511,1299,1300],{"class":648},"  responseBytes",[511,1302,667],{"class":521},[511,1304,1105],{"class":640},[511,1306,1307],{"class":658},"   \u002F\u002F Response Content-Length\n",[511,1309,1310],{"class":513,"line":543},[511,1311,788],{"class":521},[440,1313,1314],{},[590,1315,793],{},[501,1317,1320],{"className":796,"code":1318,"filename":1319,"language":799,"meta":507,"style":507},"{\n  \"requestSize\": {\n    \"requestBytes\": 1234,\n    \"responseBytes\": 5678\n  }\n}\n","Example wide event: requestSize",[447,1321,1322,1326,1339,1355,1369,1373],{"__ignoreMap":507},[511,1323,1324],{"class":513,"line":514},[511,1325,806],{"class":521},[511,1327,1328,1330,1333,1335,1337],{"class":513,"line":525},[511,1329,811],{"class":521},[511,1331,1332],{"class":607},"requestSize",[511,1334,817],{"class":521},[511,1336,652],{"class":521},[511,1338,522],{"class":521},[511,1340,1341,1343,1346,1348,1350,1353],{"class":513,"line":535},[511,1342,826],{"class":521},[511,1344,1345],{"class":640},"requestBytes",[511,1347,817],{"class":521},[511,1349,652],{"class":521},[511,1351,1352],{"class":861}," 1234",[511,1354,532],{"class":521},[511,1356,1357,1359,1362,1364,1366],{"class":513,"line":543},[511,1358,826],{"class":521},[511,1360,1361],{"class":640},"responseBytes",[511,1363,817],{"class":521},[511,1365,652],{"class":521},[511,1367,1368],{"class":861}," 5678\n",[511,1370,1371],{"class":513,"line":551},[511,1372,978],{"class":521},[511,1374,1375],{"class":513,"line":559},[511,1376,788],{"class":521},[1193,1378,1379,1380,1382,1383,459],{"color":1195,"icon":13},"This enricher reads the ",[447,1381,1237],{}," header from both the request and response. If the header is missing (e.g., for chunked transfer encoding), the corresponding field will be ",[447,1384,1385],{},"undefined",[576,1387,1389],{"id":1388},"trace-context","Trace Context",[440,1391,1392,1393,1396,1397,1238],{},"Extract W3C trace context from the ",[447,1394,1395],{},"traceparent"," and ",[447,1398,1399],{},"tracestate",[440,1401,1402,593,1404,1163,1407,1163,1410],{},[590,1403,592],{},[447,1405,1406],{},"event.traceContext",[447,1408,1409],{},"event.traceId",[447,1411,1412],{},"event.spanId",[501,1414,1417],{"className":503,"code":1415,"filename":1416,"language":506,"meta":507,"style":507},"const enrich = createTraceContextEnricher()\n","trace-context-enricher.ts",[447,1418,1419],{"__ignoreMap":507},[511,1420,1421,1423,1425,1427,1430],{"class":513,"line":514},[511,1422,608],{"class":607},[511,1424,611],{"class":528},[511,1426,614],{"class":521},[511,1428,1429],{"class":617}," createTraceContextEnricher",[511,1431,621],{"class":528},[440,1433,1434],{},[590,1435,626],{},[501,1437,1440],{"className":503,"code":1438,"filename":1439,"language":506,"meta":507,"style":507},"interface TraceContextInfo {\n  traceparent?: string   \u002F\u002F Full traceparent header value\n  tracestate?: string    \u002F\u002F Full tracestate header value\n  traceId?: string       \u002F\u002F 32-char hex trace ID (parsed from traceparent)\n  spanId?: string        \u002F\u002F 16-char hex span ID (parsed from traceparent)\n}\n","trace-context-types.ts",[447,1441,1442,1451,1463,1475,1487,1499],{"__ignoreMap":507},[511,1443,1444,1446,1449],{"class":513,"line":514},[511,1445,637],{"class":607},[511,1447,1448],{"class":640}," TraceContextInfo",[511,1450,522],{"class":521},[511,1452,1453,1456,1458,1460],{"class":513,"line":525},[511,1454,1455],{"class":648},"  traceparent",[511,1457,667],{"class":521},[511,1459,655],{"class":640},[511,1461,1462],{"class":658},"   \u002F\u002F Full traceparent header value\n",[511,1464,1465,1468,1470,1472],{"class":513,"line":535},[511,1466,1467],{"class":648},"  tracestate",[511,1469,667],{"class":521},[511,1471,655],{"class":640},[511,1473,1474],{"class":658},"    \u002F\u002F Full tracestate header value\n",[511,1476,1477,1480,1482,1484],{"class":513,"line":543},[511,1478,1479],{"class":648},"  traceId",[511,1481,667],{"class":521},[511,1483,655],{"class":640},[511,1485,1486],{"class":658},"       \u002F\u002F 32-char hex trace ID (parsed from traceparent)\n",[511,1488,1489,1492,1494,1496],{"class":513,"line":551},[511,1490,1491],{"class":648},"  spanId",[511,1493,667],{"class":521},[511,1495,655],{"class":640},[511,1497,1498],{"class":658},"        \u002F\u002F 16-char hex span ID (parsed from traceparent)\n",[511,1500,1501],{"class":513,"line":559},[511,1502,788],{"class":521},[440,1504,1505],{},[590,1506,793],{},[501,1508,1511],{"className":796,"code":1509,"filename":1510,"language":799,"meta":507,"style":507},"{\n  \"traceContext\": {\n    \"traceparent\": \"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01\",\n    \"traceId\": \"4bf92f3577b34da6a3ce929d0e0e4736\",\n    \"spanId\": \"00f067aa0ba902b7\"\n  },\n  \"traceId\": \"4bf92f3577b34da6a3ce929d0e0e4736\",\n  \"spanId\": \"00f067aa0ba902b7\"\n}\n","Example wide event: traceContext",[447,1512,1513,1517,1530,1549,1569,1588,1593,1611,1627],{"__ignoreMap":507},[511,1514,1515],{"class":513,"line":514},[511,1516,806],{"class":521},[511,1518,1519,1521,1524,1526,1528],{"class":513,"line":525},[511,1520,811],{"class":521},[511,1522,1523],{"class":607},"traceContext",[511,1525,817],{"class":521},[511,1527,652],{"class":521},[511,1529,522],{"class":521},[511,1531,1532,1534,1536,1538,1540,1542,1545,1547],{"class":513,"line":535},[511,1533,826],{"class":521},[511,1535,1395],{"class":640},[511,1537,817],{"class":521},[511,1539,652],{"class":521},[511,1541,836],{"class":521},[511,1543,1544],{"class":571},"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",[511,1546,817],{"class":521},[511,1548,532],{"class":521},[511,1550,1551,1553,1556,1558,1560,1562,1565,1567],{"class":513,"line":543},[511,1552,826],{"class":521},[511,1554,1555],{"class":640},"traceId",[511,1557,817],{"class":521},[511,1559,652],{"class":521},[511,1561,836],{"class":521},[511,1563,1564],{"class":571},"4bf92f3577b34da6a3ce929d0e0e4736",[511,1566,817],{"class":521},[511,1568,532],{"class":521},[511,1570,1571,1573,1576,1578,1580,1582,1585],{"class":513,"line":551},[511,1572,826],{"class":521},[511,1574,1575],{"class":640},"spanId",[511,1577,817],{"class":521},[511,1579,652],{"class":521},[511,1581,836],{"class":521},[511,1583,1584],{"class":571},"00f067aa0ba902b7",[511,1586,1587],{"class":521},"\"\n",[511,1589,1590],{"class":513,"line":559},[511,1591,1592],{"class":521},"  },\n",[511,1594,1595,1597,1599,1601,1603,1605,1607,1609],{"class":513,"line":975},[511,1596,811],{"class":521},[511,1598,1555],{"class":607},[511,1600,817],{"class":521},[511,1602,652],{"class":521},[511,1604,836],{"class":521},[511,1606,1564],{"class":571},[511,1608,817],{"class":521},[511,1610,532],{"class":521},[511,1612,1613,1615,1617,1619,1621,1623,1625],{"class":513,"line":981},[511,1614,811],{"class":521},[511,1616,1575],{"class":607},[511,1618,817],{"class":521},[511,1620,652],{"class":521},[511,1622,836],{"class":521},[511,1624,1584],{"class":571},[511,1626,1587],{"class":521},[511,1628,1630],{"class":513,"line":1629},9,[511,1631,788],{"class":521},[440,1633,1634,1396,1636,1638],{},[447,1635,1555],{},[447,1637,1575],{}," are also set at the top level of the event for easy querying and correlation.",[1193,1640,1641,1642,1647,1648,459],{"color":1195,"icon":13},"The traceparent format follows the ",[456,1643,1646],{"href":1644,"rel":1645},"https:\u002F\u002Fwww.w3.org\u002FTR\u002Ftrace-context\u002F",[494],"W3C Trace Context"," specification: ",[447,1649,1650],{},"{version}-{traceId}-{spanId}-{flags}",[576,1652,1654],{"id":1653},"full-setup-example","Full Setup Example",[440,1656,1657],{},"Use all built-in enrichers together. The list of enrichers is identical across frameworks — only the wiring changes.",[1659,1660,1661,1900,2134,2282],"code-group",{},[501,1662,1665],{"className":503,"code":1663,"filename":1664,"language":506,"meta":507,"style":507},"\u002F\u002F server\u002Fplugins\u002Fevlog-enrich.ts\nimport {\n  createUserAgentEnricher,\n  createGeoEnricher,\n  createRequestSizeEnricher,\n  createTraceContextEnricher,\n} from 'evlog\u002Fenrichers'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const enrichers = [\n    createUserAgentEnricher(),\n    createGeoEnricher(),\n    createRequestSizeEnricher(),\n    createTraceContextEnricher(),\n  ]\n\n  nitroApp.hooks.hook('evlog:enrich', (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n  })\n})\n","Nuxt \u002F Nitro",[447,1666,1667,1672,1678,1684,1690,1696,1702,1714,1720,1748,1763,1774,1784,1794,1804,1810,1815,1854,1885,1893],{"__ignoreMap":507},[511,1668,1669],{"class":513,"line":514},[511,1670,1671],{"class":658},"\u002F\u002F server\u002Fplugins\u002Fevlog-enrich.ts\n",[511,1673,1674,1676],{"class":513,"line":525},[511,1675,518],{"class":517},[511,1677,522],{"class":521},[511,1679,1680,1682],{"class":513,"line":535},[511,1681,529],{"class":528},[511,1683,532],{"class":521},[511,1685,1686,1688],{"class":513,"line":543},[511,1687,538],{"class":528},[511,1689,532],{"class":521},[511,1691,1692,1694],{"class":513,"line":551},[511,1693,546],{"class":528},[511,1695,532],{"class":521},[511,1697,1698,1700],{"class":513,"line":559},[511,1699,554],{"class":528},[511,1701,532],{"class":521},[511,1703,1704,1706,1708,1710,1712],{"class":513,"line":975},[511,1705,562],{"class":521},[511,1707,565],{"class":517},[511,1709,568],{"class":521},[511,1711,449],{"class":571},[511,1713,574],{"class":521},[511,1715,1716],{"class":513,"line":981},[511,1717,1719],{"emptyLinePlaceholder":1718},true,"\n",[511,1721,1722,1725,1728,1731,1734,1736,1740,1743,1746],{"class":513,"line":1629},[511,1723,1724],{"class":517},"export",[511,1726,1727],{"class":517}," default",[511,1729,1730],{"class":617}," defineNitroPlugin",[511,1732,1733],{"class":528},"(",[511,1735,1733],{"class":521},[511,1737,1739],{"class":1738},"sHdIc","nitroApp",[511,1741,1742],{"class":521},")",[511,1744,1745],{"class":607}," =>",[511,1747,522],{"class":521},[511,1749,1751,1754,1757,1760],{"class":513,"line":1750},10,[511,1752,1753],{"class":607},"  const",[511,1755,1756],{"class":528}," enrichers",[511,1758,1759],{"class":521}," =",[511,1761,1762],{"class":648}," [\n",[511,1764,1766,1769,1772],{"class":513,"line":1765},11,[511,1767,1768],{"class":617},"    createUserAgentEnricher",[511,1770,1771],{"class":648},"()",[511,1773,532],{"class":521},[511,1775,1777,1780,1782],{"class":513,"line":1776},12,[511,1778,1779],{"class":617},"    createGeoEnricher",[511,1781,1771],{"class":648},[511,1783,532],{"class":521},[511,1785,1787,1790,1792],{"class":513,"line":1786},13,[511,1788,1789],{"class":617},"    createRequestSizeEnricher",[511,1791,1771],{"class":648},[511,1793,532],{"class":521},[511,1795,1797,1800,1802],{"class":513,"line":1796},14,[511,1798,1799],{"class":617},"    createTraceContextEnricher",[511,1801,1771],{"class":648},[511,1803,532],{"class":521},[511,1805,1807],{"class":513,"line":1806},15,[511,1808,1809],{"class":648},"  ]\n",[511,1811,1813],{"class":513,"line":1812},16,[511,1814,1719],{"emptyLinePlaceholder":1718},[511,1816,1818,1821,1823,1826,1828,1831,1833,1835,1838,1840,1842,1845,1848,1850,1852],{"class":513,"line":1817},17,[511,1819,1820],{"class":528},"  nitroApp",[511,1822,459],{"class":521},[511,1824,1825],{"class":528},"hooks",[511,1827,459],{"class":521},[511,1829,1830],{"class":617},"hook",[511,1832,1733],{"class":648},[511,1834,743],{"class":521},[511,1836,1837],{"class":571},"evlog:enrich",[511,1839,743],{"class":521},[511,1841,876],{"class":521},[511,1843,1844],{"class":521}," (",[511,1846,1847],{"class":1738},"ctx",[511,1849,1742],{"class":521},[511,1851,1745],{"class":607},[511,1853,522],{"class":521},[511,1855,1857,1860,1862,1864,1867,1870,1872,1875,1878,1880,1882],{"class":513,"line":1856},18,[511,1858,1859],{"class":517},"    for",[511,1861,1844],{"class":648},[511,1863,608],{"class":607},[511,1865,1866],{"class":528}," enricher",[511,1868,1869],{"class":521}," of",[511,1871,1756],{"class":528},[511,1873,1874],{"class":648},") ",[511,1876,1877],{"class":617},"enricher",[511,1879,1733],{"class":648},[511,1881,1847],{"class":528},[511,1883,1884],{"class":648},")\n",[511,1886,1888,1891],{"class":513,"line":1887},19,[511,1889,1890],{"class":521},"  }",[511,1892,1884],{"class":648},[511,1894,1896,1898],{"class":513,"line":1895},20,[511,1897,562],{"class":521},[511,1899,1884],{"class":528},[501,1901,1903],{"className":503,"code":1902,"filename":167,"language":506,"meta":507,"style":507},"\u002F\u002F lib\u002Fevlog.ts\nimport { createEvlog } from 'evlog\u002Fnext'\nimport {\n  createUserAgentEnricher,\n  createGeoEnricher,\n  createRequestSizeEnricher,\n  createTraceContextEnricher,\n} from 'evlog\u002Fenrichers'\n\nconst enrichers = [\n  createUserAgentEnricher(),\n  createGeoEnricher(),\n  createRequestSizeEnricher(),\n  createTraceContextEnricher(),\n]\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  enrich: (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n  },\n})\n",[447,1904,1905,1910,1930,1936,1942,1948,1954,1960,1972,1976,1987,1995,2003,2011,2019,2024,2028,2065,2081,2098,2122,2127],{"__ignoreMap":507},[511,1906,1907],{"class":513,"line":514},[511,1908,1909],{"class":658},"\u002F\u002F lib\u002Fevlog.ts\n",[511,1911,1912,1914,1916,1919,1921,1923,1925,1928],{"class":513,"line":525},[511,1913,518],{"class":517},[511,1915,670],{"class":521},[511,1917,1918],{"class":528}," createEvlog",[511,1920,690],{"class":521},[511,1922,565],{"class":517},[511,1924,568],{"class":521},[511,1926,1927],{"class":571},"evlog\u002Fnext",[511,1929,574],{"class":521},[511,1931,1932,1934],{"class":513,"line":535},[511,1933,518],{"class":517},[511,1935,522],{"class":521},[511,1937,1938,1940],{"class":513,"line":543},[511,1939,529],{"class":528},[511,1941,532],{"class":521},[511,1943,1944,1946],{"class":513,"line":551},[511,1945,538],{"class":528},[511,1947,532],{"class":521},[511,1949,1950,1952],{"class":513,"line":559},[511,1951,546],{"class":528},[511,1953,532],{"class":521},[511,1955,1956,1958],{"class":513,"line":975},[511,1957,554],{"class":528},[511,1959,532],{"class":521},[511,1961,1962,1964,1966,1968,1970],{"class":513,"line":981},[511,1963,562],{"class":521},[511,1965,565],{"class":517},[511,1967,568],{"class":521},[511,1969,449],{"class":571},[511,1971,574],{"class":521},[511,1973,1974],{"class":513,"line":1629},[511,1975,1719],{"emptyLinePlaceholder":1718},[511,1977,1978,1980,1983,1985],{"class":513,"line":1750},[511,1979,608],{"class":607},[511,1981,1982],{"class":528}," enrichers ",[511,1984,614],{"class":521},[511,1986,1762],{"class":528},[511,1988,1989,1991,1993],{"class":513,"line":1765},[511,1990,529],{"class":617},[511,1992,1771],{"class":528},[511,1994,532],{"class":521},[511,1996,1997,1999,2001],{"class":513,"line":1776},[511,1998,538],{"class":617},[511,2000,1771],{"class":528},[511,2002,532],{"class":521},[511,2004,2005,2007,2009],{"class":513,"line":1786},[511,2006,546],{"class":617},[511,2008,1771],{"class":528},[511,2010,532],{"class":521},[511,2012,2013,2015,2017],{"class":513,"line":1796},[511,2014,554],{"class":617},[511,2016,1771],{"class":528},[511,2018,532],{"class":521},[511,2020,2021],{"class":513,"line":1806},[511,2022,2023],{"class":528},"]\n",[511,2025,2026],{"class":513,"line":1812},[511,2027,1719],{"emptyLinePlaceholder":1718},[511,2029,2030,2032,2035,2037,2040,2042,2045,2047,2050,2052,2055,2057,2059,2061,2063],{"class":513,"line":1817},[511,2031,1724],{"class":517},[511,2033,2034],{"class":607}," const",[511,2036,670],{"class":521},[511,2038,2039],{"class":528}," withEvlog",[511,2041,876],{"class":521},[511,2043,2044],{"class":528}," useLogger",[511,2046,876],{"class":521},[511,2048,2049],{"class":528}," log",[511,2051,876],{"class":521},[511,2053,2054],{"class":528}," createError ",[511,2056,562],{"class":521},[511,2058,1759],{"class":521},[511,2060,1918],{"class":617},[511,2062,1733],{"class":528},[511,2064,806],{"class":521},[511,2066,2067,2070,2072,2074,2077,2079],{"class":513,"line":1856},[511,2068,2069],{"class":648},"  service",[511,2071,652],{"class":521},[511,2073,568],{"class":521},[511,2075,2076],{"class":571},"my-app",[511,2078,743],{"class":521},[511,2080,532],{"class":521},[511,2082,2083,2086,2088,2090,2092,2094,2096],{"class":513,"line":1887},[511,2084,2085],{"class":617},"  enrich",[511,2087,652],{"class":521},[511,2089,1844],{"class":521},[511,2091,1847],{"class":1738},[511,2093,1742],{"class":521},[511,2095,1745],{"class":607},[511,2097,522],{"class":521},[511,2099,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118,2120],{"class":513,"line":1895},[511,2101,1859],{"class":517},[511,2103,1844],{"class":648},[511,2105,608],{"class":607},[511,2107,1866],{"class":528},[511,2109,1869],{"class":521},[511,2111,1756],{"class":528},[511,2113,1874],{"class":648},[511,2115,1877],{"class":617},[511,2117,1733],{"class":648},[511,2119,1847],{"class":528},[511,2121,1884],{"class":648},[511,2123,2125],{"class":513,"line":2124},21,[511,2126,1592],{"class":521},[511,2128,2130,2132],{"class":513,"line":2129},22,[511,2131,562],{"class":521},[511,2133,1884],{"class":528},[501,2135,2138],{"className":503,"code":2136,"filename":2137,"language":506,"meta":507,"style":507},"import {\n  createUserAgentEnricher,\n  createGeoEnricher,\n  createRequestSizeEnricher,\n  createTraceContextEnricher,\n} from 'evlog\u002Fenrichers'\n\nconst enrichers = [\n  createUserAgentEnricher(),\n  createGeoEnricher(),\n  createRequestSizeEnricher(),\n  createTraceContextEnricher(),\n]\n\napp.use(evlog({ enrichers })) \u002F\u002F Hono \u002F Express \u002F Elysia\n\u002F\u002F await app.register(evlog, { enrichers }) \u002F\u002F Fastify\n\u002F\u002F EvlogModule.forRoot({ enrichers }) \u002F\u002F NestJS\n","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS",[447,2139,2140,2146,2152,2158,2164,2170,2182,2186,2196,2204,2212,2220,2228,2232,2236,2266,2274],{"__ignoreMap":507},[511,2141,2142,2144],{"class":513,"line":514},[511,2143,518],{"class":517},[511,2145,522],{"class":521},[511,2147,2148,2150],{"class":513,"line":525},[511,2149,529],{"class":528},[511,2151,532],{"class":521},[511,2153,2154,2156],{"class":513,"line":535},[511,2155,538],{"class":528},[511,2157,532],{"class":521},[511,2159,2160,2162],{"class":513,"line":543},[511,2161,546],{"class":528},[511,2163,532],{"class":521},[511,2165,2166,2168],{"class":513,"line":551},[511,2167,554],{"class":528},[511,2169,532],{"class":521},[511,2171,2172,2174,2176,2178,2180],{"class":513,"line":559},[511,2173,562],{"class":521},[511,2175,565],{"class":517},[511,2177,568],{"class":521},[511,2179,449],{"class":571},[511,2181,574],{"class":521},[511,2183,2184],{"class":513,"line":975},[511,2185,1719],{"emptyLinePlaceholder":1718},[511,2187,2188,2190,2192,2194],{"class":513,"line":981},[511,2189,608],{"class":607},[511,2191,1982],{"class":528},[511,2193,614],{"class":521},[511,2195,1762],{"class":528},[511,2197,2198,2200,2202],{"class":513,"line":1629},[511,2199,529],{"class":617},[511,2201,1771],{"class":528},[511,2203,532],{"class":521},[511,2205,2206,2208,2210],{"class":513,"line":1750},[511,2207,538],{"class":617},[511,2209,1771],{"class":528},[511,2211,532],{"class":521},[511,2213,2214,2216,2218],{"class":513,"line":1765},[511,2215,546],{"class":617},[511,2217,1771],{"class":528},[511,2219,532],{"class":521},[511,2221,2222,2224,2226],{"class":513,"line":1776},[511,2223,554],{"class":617},[511,2225,1771],{"class":528},[511,2227,532],{"class":521},[511,2229,2230],{"class":513,"line":1786},[511,2231,2023],{"class":528},[511,2233,2234],{"class":513,"line":1796},[511,2235,1719],{"emptyLinePlaceholder":1718},[511,2237,2238,2241,2243,2246,2248,2251,2253,2256,2258,2260,2263],{"class":513,"line":1806},[511,2239,2240],{"class":528},"app",[511,2242,459],{"class":521},[511,2244,2245],{"class":617},"use",[511,2247,1733],{"class":528},[511,2249,2250],{"class":617},"evlog",[511,2252,1733],{"class":528},[511,2254,2255],{"class":521},"{",[511,2257,1982],{"class":528},[511,2259,562],{"class":521},[511,2261,2262],{"class":528},")) ",[511,2264,2265],{"class":658},"\u002F\u002F Hono \u002F Express \u002F Elysia\n",[511,2267,2268,2271],{"class":513,"line":1812},[511,2269,2270],{"class":658},"\u002F\u002F await app.register(evlog, { enrichers })",[511,2272,2273],{"class":658}," \u002F\u002F Fastify\n",[511,2275,2276,2279],{"class":513,"line":1817},[511,2277,2278],{"class":658},"\u002F\u002F EvlogModule.forRoot({ enrichers })",[511,2280,2281],{"class":658}," \u002F\u002F NestJS\n",[501,2283,2285],{"className":503,"code":2284,"filename":222,"language":506,"meta":507,"style":507},"\u002F\u002F index.ts\nimport { initLogger } from 'evlog'\nimport {\n  createUserAgentEnricher,\n  createGeoEnricher,\n  createRequestSizeEnricher,\n  createTraceContextEnricher,\n} from 'evlog\u002Fenrichers'\n\ninitLogger({\n  enrichers: [\n    createUserAgentEnricher(),\n    createGeoEnricher(),\n    createRequestSizeEnricher(),\n    createTraceContextEnricher(),\n  ],\n})\n",[447,2286,2287,2292,2311,2317,2323,2329,2335,2341,2353,2357,2366,2375,2383,2391,2399,2407,2414],{"__ignoreMap":507},[511,2288,2289],{"class":513,"line":514},[511,2290,2291],{"class":658},"\u002F\u002F index.ts\n",[511,2293,2294,2296,2298,2301,2303,2305,2307,2309],{"class":513,"line":525},[511,2295,518],{"class":517},[511,2297,670],{"class":521},[511,2299,2300],{"class":528}," initLogger",[511,2302,690],{"class":521},[511,2304,565],{"class":517},[511,2306,568],{"class":521},[511,2308,2250],{"class":571},[511,2310,574],{"class":521},[511,2312,2313,2315],{"class":513,"line":535},[511,2314,518],{"class":517},[511,2316,522],{"class":521},[511,2318,2319,2321],{"class":513,"line":543},[511,2320,529],{"class":528},[511,2322,532],{"class":521},[511,2324,2325,2327],{"class":513,"line":551},[511,2326,538],{"class":528},[511,2328,532],{"class":521},[511,2330,2331,2333],{"class":513,"line":559},[511,2332,546],{"class":528},[511,2334,532],{"class":521},[511,2336,2337,2339],{"class":513,"line":975},[511,2338,554],{"class":528},[511,2340,532],{"class":521},[511,2342,2343,2345,2347,2349,2351],{"class":513,"line":981},[511,2344,562],{"class":521},[511,2346,565],{"class":517},[511,2348,568],{"class":521},[511,2350,449],{"class":571},[511,2352,574],{"class":521},[511,2354,2355],{"class":513,"line":1629},[511,2356,1719],{"emptyLinePlaceholder":1718},[511,2358,2359,2362,2364],{"class":513,"line":1750},[511,2360,2361],{"class":617},"initLogger",[511,2363,1733],{"class":528},[511,2365,806],{"class":521},[511,2367,2368,2371,2373],{"class":513,"line":1765},[511,2369,2370],{"class":648},"  enrichers",[511,2372,652],{"class":521},[511,2374,1762],{"class":528},[511,2376,2377,2379,2381],{"class":513,"line":1776},[511,2378,1768],{"class":617},[511,2380,1771],{"class":528},[511,2382,532],{"class":521},[511,2384,2385,2387,2389],{"class":513,"line":1786},[511,2386,1779],{"class":617},[511,2388,1771],{"class":528},[511,2390,532],{"class":521},[511,2392,2393,2395,2397],{"class":513,"line":1796},[511,2394,1789],{"class":617},[511,2396,1771],{"class":528},[511,2398,532],{"class":521},[511,2400,2401,2403,2405],{"class":513,"line":1806},[511,2402,1799],{"class":617},[511,2404,1771],{"class":528},[511,2406,532],{"class":521},[511,2408,2409,2412],{"class":513,"line":1812},[511,2410,2411],{"class":528},"  ]",[511,2413,532],{"class":521},[511,2415,2416,2418],{"class":513,"line":1817},[511,2417,562],{"class":521},[511,2419,1884],{"class":528},[576,2421,2423],{"id":2422},"next-steps","Next Steps",[2425,2426,2427,2432],"ul",{},[472,2428,2429,2431],{},[456,2430,458],{"href":382}," - Write your own enricher",[472,2433,2434,2436],{},[456,2435,90],{"href":95}," - Send enriched events to external services",[2438,2439,2440],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":507,"searchDepth":525,"depth":525,"links":2442},[2443,2444,2445,2446,2447,2448],{"id":578,"depth":525,"text":579},{"id":998,"depth":525,"text":999},{"id":1230,"depth":525,"text":1231},{"id":1388,"depth":525,"text":1389},{"id":1653,"depth":525,"text":1654},{"id":2422,"depth":525,"text":2423},"Add derived context to every wide event automatically — user agent, geo, request size, and trace context. Built-in enrichers from evlog\u002Fenrichers, plus how to compose them with your own.","md",[2452],{"label":458,"icon":267,"to":382,"color":2453,"variant":2454},"neutral","subtle",{},{"title":344,"icon":347},{"title":344,"description":2449},"R0Y6me2GtBHAVrjeXbhFc0xLhYYXeLZrvrZyaL-SWSc",[2460,2462],{"title":340,"path":341,"stem":342,"description":2461,"icon":79,"children":-1},"File system, Axiom, and Postgres recipes for audit logs, plus mockAudit for tests and the full API reference.",{"title":36,"path":354,"stem":355,"description":2463,"icon":356,"children":-1},"Observe what flows through the pipeline (stream, fs reader, consumer recipes), plug into the pipeline (plugins, enrichers, tail sampling, identity headers), or build your own bricks (custom drains, drain pipeline, custom framework integration).",1778445518791]