[{"data":1,"prerenderedAt":2756},["ShallowReactive",2],{"navigation_docs":3,"-learn-lifecycle":464,"-learn-lifecycle-surround":2751},[4,30,80,245,379,434],{"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,157],{"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,152],{"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,"icon":156},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","3.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":158,"path":159,"stem":160,"children":161,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[162,166,171,176,181,186,191,196,201,206,211,216,221,226,230,235,240],{"title":36,"path":163,"stem":164,"icon":165},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":167,"path":168,"stem":169,"icon":170},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":172,"path":173,"stem":174,"icon":175},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":182,"path":183,"stem":184,"icon":185},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":187,"path":188,"stem":189,"icon":190},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":192,"path":193,"stem":194,"icon":195},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":197,"path":198,"stem":199,"icon":200},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":202,"path":203,"stem":204,"icon":205},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":207,"path":208,"stem":209,"icon":210},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":212,"path":213,"stem":214,"icon":215},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":217,"path":218,"stem":219,"icon":220},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":222,"path":223,"stem":224,"icon":225},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":227,"path":228,"stem":229,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":231,"path":232,"stem":233,"icon":234},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":236,"path":237,"stem":238,"icon":239},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":241,"path":242,"stem":243,"icon":244},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":246,"path":247,"stem":248,"children":249,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[250,254,259,288,316,348,369,374],{"title":36,"path":251,"stem":252,"icon":253},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":255,"path":256,"stem":257,"icon":258},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[265,268,273,278,283],{"title":36,"path":266,"stem":267,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":269,"path":270,"stem":271,"icon":272},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":274,"path":275,"stem":276,"icon":277},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":279,"path":280,"stem":281,"icon":282},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":284,"path":285,"stem":286,"icon":287},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[294,297,302,307,311],{"title":36,"path":295,"stem":296,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":298,"path":299,"stem":300,"icon":301},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":303,"path":304,"stem":305,"icon":306},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":308,"path":309,"stem":310,"icon":258},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":312,"path":313,"stem":314,"icon":315},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":317,"icon":318,"path":319,"stem":320,"children":321,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[322,325,330,335,340,344],{"title":36,"path":323,"stem":324,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":326,"path":327,"stem":328,"icon":329},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":331,"path":332,"stem":333,"icon":334},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":336,"path":337,"stem":338,"icon":339},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":341,"path":342,"stem":343,"icon":318},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":345,"path":346,"stem":347,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":284,"icon":315,"path":349,"stem":350,"children":351,"page":29},"\u002Fuse-cases\u002Ftelemetry","4.use-cases\u002F4.telemetry",[352,355,360,365],{"title":36,"path":353,"stem":354,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","4.use-cases\u002F4.telemetry\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","4.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":361,"path":362,"stem":363,"icon":364},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","4.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":366,"path":367,"stem":368,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","4.use-cases\u002F4.telemetry\u002F04.reference",{"title":370,"path":371,"stem":372,"icon":373},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":375,"path":376,"stem":377,"icon":378},"eve","\u002Fuse-cases\u002Feve","4.use-cases\u002F5.eve","i-custom-eve",{"title":380,"path":381,"stem":382,"children":383,"page":29},"Extend","\u002Fextend","5.extend",[384,388,393,398,403,407,411,415,419,424,429],{"title":36,"path":385,"stem":386,"icon":387},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":389,"path":390,"stem":391,"icon":392},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":394,"path":395,"stem":396,"icon":397},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":399,"path":400,"stem":401,"icon":402},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":404,"stem":405,"icon":406},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":408,"path":409,"stem":410,"icon":387},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":412,"path":413,"stem":414,"icon":373},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":416,"path":417,"stem":418,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":420,"path":421,"stem":422,"icon":423},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":425,"path":426,"stem":427,"icon":428},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":430,"path":431,"stem":432,"icon":433},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":366,"path":435,"stem":436,"children":437,"page":29},"\u002Freference","6.reference",[438,443,446,451,455,460],{"title":439,"path":440,"stem":441,"icon":442},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":444,"stem":445,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":447,"path":448,"stem":449,"icon":450},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":452,"path":453,"stem":454,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":456,"path":457,"stem":458,"icon":459},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":461,"path":462,"stem":463,"icon":373},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":465,"title":56,"body":466,"description":2740,"extension":2741,"links":2742,"meta":2747,"navigation":2748,"path":57,"seo":2749,"stem":58,"__hash__":2750},"docs\u002F2.learn\u002F4.lifecycle.md",{"type":467,"value":468,"toc":2718},"minimark",[469,473,476,481,626,664,668,671,676,686,692,801,805,812,881,887,891,897,1111,1117,1121,1124,1164,1167,1174,1186,1294,1300,1432,1442,1446,1449,1456,1525,1548,1551,1555,1561,1812,1815,1822,1825,1905,2061,2068,2075,2085,2168,2175,2179,2244,2248,2255,2366,2370,2376,2409,2419,2423,2430,2478,2688,2692,2714],[470,471,472],"p",{},"evlog events follow a pipeline from creation to delivery. The pipeline differs slightly depending on which logging mode you use, but the core stages (emit, sample, enrich, drain) are shared.",[474,475],"lifecycle-flow",{},[477,478,480],"h2",{"id":479},"overview-by-mode","Overview by Mode",[482,483,484,513],"table",{},[485,486,487],"thead",{},[488,489,490,494,501,510],"tr",{},[491,492,493],"th",{},"Stage",[491,495,496,500],{},[497,498,499],"code",{},"log"," (simple)",[491,502,503,506,507],{},[497,504,505],{},"createLogger"," \u002F ",[497,508,509],{},"createRequestLogger",[491,511,512],{},"Framework middleware",[514,515,516,540,564,583,598,613],"tbody",{},[488,517,518,525,528,537],{},[519,520,521],"td",{},[522,523,524],"strong",{},"Create",[519,526,527],{},"Implicit per call",[519,529,530,533,534],{},[497,531,532],{},"createLogger({...})"," or ",[497,535,536],{},"createRequestLogger({...})",[519,538,539],{},"Auto on request start",[488,541,542,547,550,556],{},[519,543,544],{},[522,545,546],{},"Accumulate",[519,548,549],{},"N\u002FA (single call)",[519,551,552,555],{},[497,553,554],{},"log.set()"," multiple times",[519,557,558,560,561],{},[497,559,554],{}," via ",[497,562,563],{},"useLogger(event)",[488,565,566,571,574,580],{},[519,567,568],{},[522,569,570],{},"Emit",[519,572,573],{},"Immediate",[519,575,576,577],{},"Manual ",[497,578,579],{},"log.emit()",[519,581,582],{},"Auto on response end",[488,584,585,590,593,596],{},[519,586,587],{},[522,588,589],{},"Sample",[519,591,592],{},"Head sampling only",[519,594,595],{},"Head + tail sampling",[519,597,595],{},[488,599,600,605,608,610],{},[519,601,602],{},[522,603,604],{},"Enrich",[519,606,607],{},"Via global drain",[519,609,607],{},[519,611,612],{},"Via hooks or callbacks",[488,614,615,620,622,624],{},[519,616,617],{},[522,618,619],{},"Drain",[519,621,607],{},[519,623,607],{},[519,625,612],{},[470,627,628,629,634,635,638,639,506,642,506,645,506,648,651,652,657,658,663],{},"After ",[522,630,631],{},[497,632,633],{},"emit"," (including when sampling returns no output), the request logger is ",[522,636,637],{},"sealed",": later ",[497,640,641],{},"set",[497,643,644],{},"error",[497,646,647],{},"info",[497,649,650],{},"warn"," calls are ignored with a console warning. For background work that needs its own event, use ",[522,653,654],{},[497,655,656],{},"log.fork()"," where your integration supports it. See ",[659,660,662],"a",{"href":661},"\u002Flearn\u002Fwide-events#after-emit-sealing-and-background-work","Wide events — After emit",".",[477,665,667],{"id":666},"request-logging-step-by-step","Request Logging — Step by Step",[470,669,670],{},"For framework-managed request logging, every request walks the pipeline above. Each stage is detailed below.",[672,673,675],"h3",{"id":674},"_1-route-filtering","1. Route Filtering",[470,677,678,679,506,682,685],{},"When a request arrives, evlog checks whether the path matches the configured ",[497,680,681],{},"include",[497,683,684],{},"exclude"," patterns. If the route is excluded, no logger is created and the request proceeds without any logging overhead.",[470,687,688,689,691],{},"By default, all routes are logged. Use ",[497,690,681],{}," to restrict logging to specific patterns:",[693,694,700],"pre",{"className":695,"code":696,"filename":697,"language":698,"meta":699,"style":699},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['evlog\u002Fnuxt'],\n  evlog: {\n    include: ['\u002Fapi\u002F**'],\n  },\n})\n","nuxt.config.ts","typescript","",[497,701,702,726,754,765,786,792],{"__ignoreMap":699},[703,704,707,711,714,718,722],"span",{"class":705,"line":706},"line",1,[703,708,710],{"class":709},"s7zQu","export",[703,712,713],{"class":709}," default",[703,715,717],{"class":716},"s2Zo4"," defineNuxtConfig",[703,719,721],{"class":720},"sTEyZ","(",[703,723,725],{"class":724},"sMK4o","{\n",[703,727,729,733,736,739,742,746,748,751],{"class":705,"line":728},2,[703,730,732],{"class":731},"swJcz","  modules",[703,734,735],{"class":724},":",[703,737,738],{"class":720}," [",[703,740,741],{"class":724},"'",[703,743,745],{"class":744},"sfazB","evlog\u002Fnuxt",[703,747,741],{"class":724},[703,749,750],{"class":720},"]",[703,752,753],{"class":724},",\n",[703,755,757,760,762],{"class":705,"line":756},3,[703,758,759],{"class":731},"  evlog",[703,761,735],{"class":724},[703,763,764],{"class":724}," {\n",[703,766,768,771,773,775,777,780,782,784],{"class":705,"line":767},4,[703,769,770],{"class":731},"    include",[703,772,735],{"class":724},[703,774,738],{"class":720},[703,776,741],{"class":724},[703,778,779],{"class":744},"\u002Fapi\u002F**",[703,781,741],{"class":724},[703,783,750],{"class":720},[703,785,753],{"class":724},[703,787,789],{"class":705,"line":788},5,[703,790,791],{"class":724},"  },\n",[703,793,795,798],{"class":705,"line":794},6,[703,796,797],{"class":724},"}",[703,799,800],{"class":720},")\n",[672,802,804],{"id":803},"_2-logger-creation","2. Logger Creation",[470,806,807,808,811],{},"For matched routes, evlog creates a ",[497,809,810],{},"RequestLogger"," and attaches it to the request context. The logger is pre-populated with:",[482,813,814,824],{},[485,815,816],{},[488,817,818,821],{},[491,819,820],{},"Field",[491,822,823],{},"Source",[514,825,826,844,854,868],{},[488,827,828,833],{},[519,829,830],{},[497,831,832],{},"method",[519,834,835,836,839,840,843],{},"HTTP method (",[497,837,838],{},"GET",", ",[497,841,842],{},"POST",", ...)",[488,845,846,851],{},[519,847,848],{},[497,849,850],{},"path",[519,852,853],{},"Request path",[488,855,856,861],{},[519,857,858],{},[497,859,860],{},"requestId",[519,862,863,864,867],{},"Auto-generated UUID (or ",[497,865,866],{},"cf-ray"," on Cloudflare)",[488,869,870,875],{},[519,871,872],{},[497,873,874],{},"startTime",[519,876,877,880],{},[497,878,879],{},"Date.now()"," for duration calculation",[470,882,883,884,886],{},"The logger is stored on the event context. ",[497,885,563],{}," is a shortcut to retrieve it, it doesn't create a new logger.",[672,888,890],{"id":889},"_3-context-accumulation","3. Context Accumulation",[470,892,893,894,896],{},"During the handler, you call ",[497,895,554],{}," to attach context. Each call deep-merges into the existing context, so you can call it as many times as needed:",[693,898,901],{"className":695,"code":899,"filename":900,"language":698,"meta":699,"style":699},"import { useLogger } from 'evlog'\n\nconst log = useLogger(event)\n\nconst user = await getUser(event)\nlog.set({ user: { id: user.id, plan: user.plan } })\n\nconst cart = await getCart(user.id)\nlog.set({ cart: { items: cart.items.length, total: cart.total } })\n","server\u002Fapi\u002Fcheckout.post.ts",[497,902,903,929,935,952,956,973,1026,1031,1054],{"__ignoreMap":699},[703,904,905,908,911,914,917,920,923,926],{"class":705,"line":706},[703,906,907],{"class":709},"import",[703,909,910],{"class":724}," {",[703,912,913],{"class":720}," useLogger",[703,915,916],{"class":724}," }",[703,918,919],{"class":709}," from",[703,921,922],{"class":724}," '",[703,924,925],{"class":744},"evlog",[703,927,928],{"class":724},"'\n",[703,930,931],{"class":705,"line":728},[703,932,934],{"emptyLinePlaceholder":933},true,"\n",[703,936,937,941,944,947,949],{"class":705,"line":756},[703,938,940],{"class":939},"spNyl","const",[703,942,943],{"class":720}," log ",[703,945,946],{"class":724},"=",[703,948,913],{"class":716},[703,950,951],{"class":720},"(event)\n",[703,953,954],{"class":705,"line":767},[703,955,934],{"emptyLinePlaceholder":933},[703,957,958,960,963,965,968,971],{"class":705,"line":788},[703,959,940],{"class":939},[703,961,962],{"class":720}," user ",[703,964,946],{"class":724},[703,966,967],{"class":709}," await",[703,969,970],{"class":716}," getUser",[703,972,951],{"class":720},[703,974,975,977,979,981,983,986,989,991,993,996,998,1000,1002,1005,1008,1011,1013,1015,1017,1020,1022,1024],{"class":705,"line":794},[703,976,499],{"class":720},[703,978,663],{"class":724},[703,980,641],{"class":716},[703,982,721],{"class":720},[703,984,985],{"class":724},"{",[703,987,988],{"class":731}," user",[703,990,735],{"class":724},[703,992,910],{"class":724},[703,994,995],{"class":731}," id",[703,997,735],{"class":724},[703,999,988],{"class":720},[703,1001,663],{"class":724},[703,1003,1004],{"class":720},"id",[703,1006,1007],{"class":724},",",[703,1009,1010],{"class":731}," plan",[703,1012,735],{"class":724},[703,1014,988],{"class":720},[703,1016,663],{"class":724},[703,1018,1019],{"class":720},"plan ",[703,1021,797],{"class":724},[703,1023,916],{"class":724},[703,1025,800],{"class":720},[703,1027,1029],{"class":705,"line":1028},7,[703,1030,934],{"emptyLinePlaceholder":933},[703,1032,1034,1036,1039,1041,1043,1046,1049,1051],{"class":705,"line":1033},8,[703,1035,940],{"class":939},[703,1037,1038],{"class":720}," cart ",[703,1040,946],{"class":724},[703,1042,967],{"class":709},[703,1044,1045],{"class":716}," getCart",[703,1047,1048],{"class":720},"(user",[703,1050,663],{"class":724},[703,1052,1053],{"class":720},"id)\n",[703,1055,1057,1059,1061,1063,1065,1067,1070,1072,1074,1077,1079,1081,1083,1086,1088,1091,1093,1096,1098,1100,1102,1105,1107,1109],{"class":705,"line":1056},9,[703,1058,499],{"class":720},[703,1060,663],{"class":724},[703,1062,641],{"class":716},[703,1064,721],{"class":720},[703,1066,985],{"class":724},[703,1068,1069],{"class":731}," cart",[703,1071,735],{"class":724},[703,1073,910],{"class":724},[703,1075,1076],{"class":731}," items",[703,1078,735],{"class":724},[703,1080,1069],{"class":720},[703,1082,663],{"class":724},[703,1084,1085],{"class":720},"items",[703,1087,663],{"class":724},[703,1089,1090],{"class":720},"length",[703,1092,1007],{"class":724},[703,1094,1095],{"class":731}," total",[703,1097,735],{"class":724},[703,1099,1069],{"class":720},[703,1101,663],{"class":724},[703,1103,1104],{"class":720},"total ",[703,1106,797],{"class":724},[703,1108,916],{"class":724},[703,1110,800],{"class":720},[470,1112,1113,1114,1116],{},"If an error is thrown, evlog's ",[497,1115,644],{}," hook captures it automatically and records it on the logger with the status code.",[672,1118,1120],{"id":1119},"_4-request-end","4. Request End",[470,1122,1123],{},"When the response is sent (or an error is thrown), evlog computes:",[1125,1126,1127,1141,1150],"ul",{},[1128,1129,1130,1133,1134,506,1137,1140],"li",{},[522,1131,1132],{},"Status code"," from the response (or from the error's ",[497,1135,1136],{},"status",[497,1138,1139],{},"statusCode",")",[1128,1142,1143,1146,1147],{},[522,1144,1145],{},"Duration"," from ",[497,1148,1149],{},"Date.now() - startTime",[1128,1151,1152,1155,1156,1158,1159,1161,1162],{},[522,1153,1154],{},"Level"," - ",[497,1157,644],{}," if an error was recorded, ",[497,1160,650],{}," if status >= 400, otherwise ",[497,1163,647],{},[470,1165,1166],{},"If an error triggered the emit, the request is marked as already emitted to prevent double-emission in the response hook.",[672,1168,1170,1171,1140],{"id":1169},"_5-tail-sampling-evlogemitkeep","5. Tail Sampling (",[497,1172,1173],{},"evlog:emit:keep",[470,1175,1176,1177,1180,1181,1185],{},"Before the event is sampled, evlog evaluates ",[522,1178,1179],{},"tail sampling"," rules. These run ",[1182,1183,1184],"em",{},"after"," the request completes, so they can inspect the outcome:",[693,1187,1189],{"className":695,"code":1188,"filename":697,"language":698,"meta":699,"style":699},"evlog: {\n  sampling: {\n    keep: [\n      { duration: 1000 },          \u002F\u002F slow requests\n      { status: 400 },             \u002F\u002F client\u002Fserver errors\n      { path: '\u002Fapi\u002Fcritical\u002F**' }, \u002F\u002F critical paths\n    ],\n  },\n}\n",[497,1190,1191,1200,1209,1219,1240,1257,1278,1285,1289],{"__ignoreMap":699},[703,1192,1193,1196,1198],{"class":705,"line":706},[703,1194,925],{"class":1195},"sBMFI",[703,1197,735],{"class":724},[703,1199,764],{"class":724},[703,1201,1202,1205,1207],{"class":705,"line":728},[703,1203,1204],{"class":1195},"  sampling",[703,1206,735],{"class":724},[703,1208,764],{"class":724},[703,1210,1211,1214,1216],{"class":705,"line":756},[703,1212,1213],{"class":1195},"    keep",[703,1215,735],{"class":724},[703,1217,1218],{"class":731}," [\n",[703,1220,1221,1224,1227,1229,1233,1236],{"class":705,"line":767},[703,1222,1223],{"class":724},"      {",[703,1225,1226],{"class":731}," duration",[703,1228,735],{"class":724},[703,1230,1232],{"class":1231},"sbssI"," 1000",[703,1234,1235],{"class":724}," },",[703,1237,1239],{"class":1238},"sHwdD","          \u002F\u002F slow requests\n",[703,1241,1242,1244,1247,1249,1252,1254],{"class":705,"line":788},[703,1243,1223],{"class":724},[703,1245,1246],{"class":731}," status",[703,1248,735],{"class":724},[703,1250,1251],{"class":1231}," 400",[703,1253,1235],{"class":724},[703,1255,1256],{"class":1238},"             \u002F\u002F client\u002Fserver errors\n",[703,1258,1259,1261,1264,1266,1268,1271,1273,1275],{"class":705,"line":794},[703,1260,1223],{"class":724},[703,1262,1263],{"class":731}," path",[703,1265,735],{"class":724},[703,1267,922],{"class":724},[703,1269,1270],{"class":744},"\u002Fapi\u002Fcritical\u002F**",[703,1272,741],{"class":724},[703,1274,1235],{"class":724},[703,1276,1277],{"class":1238}," \u002F\u002F critical paths\n",[703,1279,1280,1283],{"class":705,"line":1028},[703,1281,1282],{"class":731},"    ]",[703,1284,753],{"class":724},[703,1286,1287],{"class":705,"line":1033},[703,1288,791],{"class":724},[703,1290,1291],{"class":705,"line":1056},[703,1292,1293],{"class":724},"}\n",[470,1295,1296,1297,1299],{},"The ",[497,1298,1173],{}," hook also fires, letting you force-keep based on custom business logic:",[693,1301,1304],{"className":695,"code":1302,"filename":1303,"language":698,"meta":699,"style":699},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:emit:keep', (ctx) => {\n    if (ctx.context.user?.premium) {\n      ctx.shouldKeep = true\n    }\n  })\n})\n","server\u002Fplugins\u002Fevlog-custom.ts",[497,1305,1306,1330,1367,1397,1414,1419,1426],{"__ignoreMap":699},[703,1307,1308,1310,1312,1315,1317,1319,1323,1325,1328],{"class":705,"line":706},[703,1309,710],{"class":709},[703,1311,713],{"class":709},[703,1313,1314],{"class":716}," defineNitroPlugin",[703,1316,721],{"class":720},[703,1318,721],{"class":724},[703,1320,1322],{"class":1321},"sHdIc","nitroApp",[703,1324,1140],{"class":724},[703,1326,1327],{"class":939}," =>",[703,1329,764],{"class":724},[703,1331,1332,1335,1337,1340,1342,1345,1347,1349,1351,1353,1355,1358,1361,1363,1365],{"class":705,"line":728},[703,1333,1334],{"class":720},"  nitroApp",[703,1336,663],{"class":724},[703,1338,1339],{"class":720},"hooks",[703,1341,663],{"class":724},[703,1343,1344],{"class":716},"hook",[703,1346,721],{"class":731},[703,1348,741],{"class":724},[703,1350,1173],{"class":744},[703,1352,741],{"class":724},[703,1354,1007],{"class":724},[703,1356,1357],{"class":724}," (",[703,1359,1360],{"class":1321},"ctx",[703,1362,1140],{"class":724},[703,1364,1327],{"class":939},[703,1366,764],{"class":724},[703,1368,1369,1372,1374,1376,1378,1381,1383,1386,1389,1392,1395],{"class":705,"line":756},[703,1370,1371],{"class":709},"    if",[703,1373,1357],{"class":731},[703,1375,1360],{"class":720},[703,1377,663],{"class":724},[703,1379,1380],{"class":720},"context",[703,1382,663],{"class":724},[703,1384,1385],{"class":720},"user",[703,1387,1388],{"class":724},"?.",[703,1390,1391],{"class":720},"premium",[703,1393,1394],{"class":731},") ",[703,1396,725],{"class":724},[703,1398,1399,1402,1404,1407,1410],{"class":705,"line":767},[703,1400,1401],{"class":720},"      ctx",[703,1403,663],{"class":724},[703,1405,1406],{"class":720},"shouldKeep",[703,1408,1409],{"class":724}," =",[703,1411,1413],{"class":1412},"sfNiH"," true\n",[703,1415,1416],{"class":705,"line":788},[703,1417,1418],{"class":724},"    }\n",[703,1420,1421,1424],{"class":705,"line":794},[703,1422,1423],{"class":724},"  }",[703,1425,800],{"class":731},[703,1427,1428,1430],{"class":705,"line":1028},[703,1429,797],{"class":724},[703,1431,800],{"class":720},[470,1433,1434,1435,1438,1439,663],{},"If any rule or hook sets ",[497,1436,1437],{},"shouldKeep = true",", the event ",[522,1440,1441],{},"bypasses head sampling entirely",[672,1443,1445],{"id":1444},"_6-head-sampling","6. Head Sampling",[470,1447,1448],{},"If the event wasn't force-kept by tail sampling, head sampling applies. This is a random coin flip per log level.",[470,1450,1451,1452,1455],{},"By default, all levels are kept at 100% (no sampling). Configure ",[497,1453,1454],{},"sampling.rates"," to reduce volume in production:",[693,1457,1459],{"className":695,"code":1458,"filename":697,"language":698,"meta":699,"style":699},"evlog: {\n  sampling: {\n    rates: { info: 10, warn: 50, debug: 0 },\n  },\n}\n",[497,1460,1461,1469,1477,1517,1521],{"__ignoreMap":699},[703,1462,1463,1465,1467],{"class":705,"line":706},[703,1464,925],{"class":1195},[703,1466,735],{"class":724},[703,1468,764],{"class":724},[703,1470,1471,1473,1475],{"class":705,"line":728},[703,1472,1204],{"class":1195},[703,1474,735],{"class":724},[703,1476,764],{"class":724},[703,1478,1479,1482,1484,1486,1489,1491,1494,1496,1499,1501,1504,1506,1509,1511,1514],{"class":705,"line":756},[703,1480,1481],{"class":1195},"    rates",[703,1483,735],{"class":724},[703,1485,910],{"class":724},[703,1487,1488],{"class":1195}," info",[703,1490,735],{"class":724},[703,1492,1493],{"class":1231}," 10",[703,1495,1007],{"class":724},[703,1497,1498],{"class":1195}," warn",[703,1500,735],{"class":724},[703,1502,1503],{"class":1231}," 50",[703,1505,1007],{"class":724},[703,1507,1508],{"class":1195}," debug",[703,1510,735],{"class":724},[703,1512,1513],{"class":1231}," 0",[703,1515,1516],{"class":724}," },\n",[703,1518,1519],{"class":705,"line":767},[703,1520,791],{"class":724},[703,1522,1523],{"class":705,"line":788},[703,1524,1293],{"class":724},[1125,1526,1527,1533,1539],{},[1128,1528,1529,1532],{},[497,1530,1531],{},"info: 10"," - keep 10% of info-level events",[1128,1534,1535,1538],{},[497,1536,1537],{},"warn: 50"," - keep 50% of warnings",[1128,1540,1541,1543,1544,1547],{},[497,1542,644],{}," defaults to ",[522,1545,1546],{},"100%"," (never sampled out, even if you set a rate)",[470,1549,1550],{},"If the event is sampled out, processing stops entirely: no console output, no enrichment, no drain.",[672,1552,1554],{"id":1553},"_7-emit","7. Emit",[470,1556,1296,1557,1560],{},[497,1558,1559],{},"WideEvent"," object is built from the accumulated context:",[693,1562,1566],{"className":1563,"code":1564,"filename":1559,"language":1565,"meta":699,"style":699},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"timestamp\": \"2026-01-15T10:30:00.000Z\",\n  \"level\": \"info\",\n  \"service\": \"my-app\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Fcheckout\",\n  \"requestId\": \"abc-123\",\n  \"duration\": 234,\n  \"status\": 200,\n  \"user\": { \"id\": 1, \"plan\": \"pro\" },\n  \"cart\": { \"items\": 3, \"total\": 9999 }\n}\n","json",[497,1567,1568,1572,1595,1614,1634,1652,1671,1690,1706,1721,1765,1807],{"__ignoreMap":699},[703,1569,1570],{"class":705,"line":706},[703,1571,725],{"class":724},[703,1573,1574,1577,1580,1583,1585,1588,1591,1593],{"class":705,"line":728},[703,1575,1576],{"class":724},"  \"",[703,1578,1579],{"class":939},"timestamp",[703,1581,1582],{"class":724},"\"",[703,1584,735],{"class":724},[703,1586,1587],{"class":724}," \"",[703,1589,1590],{"class":744},"2026-01-15T10:30:00.000Z",[703,1592,1582],{"class":724},[703,1594,753],{"class":724},[703,1596,1597,1599,1602,1604,1606,1608,1610,1612],{"class":705,"line":756},[703,1598,1576],{"class":724},[703,1600,1601],{"class":939},"level",[703,1603,1582],{"class":724},[703,1605,735],{"class":724},[703,1607,1587],{"class":724},[703,1609,647],{"class":744},[703,1611,1582],{"class":724},[703,1613,753],{"class":724},[703,1615,1616,1618,1621,1623,1625,1627,1630,1632],{"class":705,"line":767},[703,1617,1576],{"class":724},[703,1619,1620],{"class":939},"service",[703,1622,1582],{"class":724},[703,1624,735],{"class":724},[703,1626,1587],{"class":724},[703,1628,1629],{"class":744},"my-app",[703,1631,1582],{"class":724},[703,1633,753],{"class":724},[703,1635,1636,1638,1640,1642,1644,1646,1648,1650],{"class":705,"line":788},[703,1637,1576],{"class":724},[703,1639,832],{"class":939},[703,1641,1582],{"class":724},[703,1643,735],{"class":724},[703,1645,1587],{"class":724},[703,1647,842],{"class":744},[703,1649,1582],{"class":724},[703,1651,753],{"class":724},[703,1653,1654,1656,1658,1660,1662,1664,1667,1669],{"class":705,"line":794},[703,1655,1576],{"class":724},[703,1657,850],{"class":939},[703,1659,1582],{"class":724},[703,1661,735],{"class":724},[703,1663,1587],{"class":724},[703,1665,1666],{"class":744},"\u002Fapi\u002Fcheckout",[703,1668,1582],{"class":724},[703,1670,753],{"class":724},[703,1672,1673,1675,1677,1679,1681,1683,1686,1688],{"class":705,"line":1028},[703,1674,1576],{"class":724},[703,1676,860],{"class":939},[703,1678,1582],{"class":724},[703,1680,735],{"class":724},[703,1682,1587],{"class":724},[703,1684,1685],{"class":744},"abc-123",[703,1687,1582],{"class":724},[703,1689,753],{"class":724},[703,1691,1692,1694,1697,1699,1701,1704],{"class":705,"line":1033},[703,1693,1576],{"class":724},[703,1695,1696],{"class":939},"duration",[703,1698,1582],{"class":724},[703,1700,735],{"class":724},[703,1702,1703],{"class":1231}," 234",[703,1705,753],{"class":724},[703,1707,1708,1710,1712,1714,1716,1719],{"class":705,"line":1056},[703,1709,1576],{"class":724},[703,1711,1136],{"class":939},[703,1713,1582],{"class":724},[703,1715,735],{"class":724},[703,1717,1718],{"class":1231}," 200",[703,1720,753],{"class":724},[703,1722,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1745,1747,1749,1752,1754,1756,1758,1761,1763],{"class":705,"line":1723},10,[703,1725,1576],{"class":724},[703,1727,1385],{"class":939},[703,1729,1582],{"class":724},[703,1731,735],{"class":724},[703,1733,910],{"class":724},[703,1735,1587],{"class":724},[703,1737,1004],{"class":1195},[703,1739,1582],{"class":724},[703,1741,735],{"class":724},[703,1743,1744],{"class":1231}," 1",[703,1746,1007],{"class":724},[703,1748,1587],{"class":724},[703,1750,1751],{"class":1195},"plan",[703,1753,1582],{"class":724},[703,1755,735],{"class":724},[703,1757,1587],{"class":724},[703,1759,1760],{"class":744},"pro",[703,1762,1582],{"class":724},[703,1764,1516],{"class":724},[703,1766,1768,1770,1773,1775,1777,1779,1781,1783,1785,1787,1790,1792,1794,1797,1799,1801,1804],{"class":705,"line":1767},11,[703,1769,1576],{"class":724},[703,1771,1772],{"class":939},"cart",[703,1774,1582],{"class":724},[703,1776,735],{"class":724},[703,1778,910],{"class":724},[703,1780,1587],{"class":724},[703,1782,1085],{"class":1195},[703,1784,1582],{"class":724},[703,1786,735],{"class":724},[703,1788,1789],{"class":1231}," 3",[703,1791,1007],{"class":724},[703,1793,1587],{"class":724},[703,1795,1796],{"class":1195},"total",[703,1798,1582],{"class":724},[703,1800,735],{"class":724},[703,1802,1803],{"class":1231}," 9999",[703,1805,1806],{"class":724}," }\n",[703,1808,1810],{"class":705,"line":1809},12,[703,1811,1293],{"class":724},[470,1813,1814],{},"The event is printed to the console, pretty-formatted in development and as JSON in production. This is the default behavior, no configuration needed.",[672,1816,1818,1819,1140],{"id":1817},"_8-enrich-evlogenrich","8. Enrich (",[497,1820,1821],{},"evlog:enrich",[470,1823,1824],{},"After emission, enrichers add derived context to the event. Built-in enrichers extract data from request headers:",[482,1826,1827,1839],{},[485,1828,1829],{},[488,1830,1831,1834,1837],{},[491,1832,1833],{},"Enricher",[491,1835,1836],{},"Adds",[491,1838,823],{},[514,1840,1841,1858,1872,1889],{},[488,1842,1843,1846,1852],{},[519,1844,1845],{},"User Agent",[519,1847,1848,1851],{},[497,1849,1850],{},"userAgent"," (browser, OS, device)",[519,1853,1854,1857],{},[497,1855,1856],{},"User-Agent"," header",[488,1859,1860,1863,1869],{},[519,1861,1862],{},"Geo",[519,1864,1865,1868],{},[497,1866,1867],{},"geo"," (country, region, city)",[519,1870,1871],{},"Platform headers (Vercel, Cloudflare)",[488,1873,1874,1877,1883],{},[519,1875,1876],{},"Request Size",[519,1878,1879,1882],{},[497,1880,1881],{},"requestSize"," (request\u002Fresponse bytes)",[519,1884,1885,1888],{},[497,1886,1887],{},"Content-Length"," headers",[488,1890,1891,1894,1900],{},[519,1892,1893],{},"Trace Context",[519,1895,1896,1899],{},[497,1897,1898],{},"traceContext"," (traceId, spanId)",[519,1901,1902,1857],{},[497,1903,1904],{},"traceparent",[693,1906,1909],{"className":695,"code":1907,"filename":1908,"language":698,"meta":699,"style":699},"import { createUserAgentEnricher, createGeoEnricher } from 'evlog\u002Fenrichers'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const enrichers = [createUserAgentEnricher(), createGeoEnricher()]\n\n  nitroApp.hooks.hook('evlog:enrich', (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n  })\n})\n","server\u002Fplugins\u002Fevlog-enrich.ts",[497,1910,1911,1936,1940,1960,1985,1989,2021,2049,2055],{"__ignoreMap":699},[703,1912,1913,1915,1917,1920,1922,1925,1927,1929,1931,1934],{"class":705,"line":706},[703,1914,907],{"class":709},[703,1916,910],{"class":724},[703,1918,1919],{"class":720}," createUserAgentEnricher",[703,1921,1007],{"class":724},[703,1923,1924],{"class":720}," createGeoEnricher",[703,1926,916],{"class":724},[703,1928,919],{"class":709},[703,1930,922],{"class":724},[703,1932,1933],{"class":744},"evlog\u002Fenrichers",[703,1935,928],{"class":724},[703,1937,1938],{"class":705,"line":728},[703,1939,934],{"emptyLinePlaceholder":933},[703,1941,1942,1944,1946,1948,1950,1952,1954,1956,1958],{"class":705,"line":756},[703,1943,710],{"class":709},[703,1945,713],{"class":709},[703,1947,1314],{"class":716},[703,1949,721],{"class":720},[703,1951,721],{"class":724},[703,1953,1322],{"class":1321},[703,1955,1140],{"class":724},[703,1957,1327],{"class":939},[703,1959,764],{"class":724},[703,1961,1962,1965,1968,1970,1972,1975,1978,1980,1982],{"class":705,"line":767},[703,1963,1964],{"class":939},"  const",[703,1966,1967],{"class":720}," enrichers",[703,1969,1409],{"class":724},[703,1971,738],{"class":731},[703,1973,1974],{"class":716},"createUserAgentEnricher",[703,1976,1977],{"class":731},"()",[703,1979,1007],{"class":724},[703,1981,1924],{"class":716},[703,1983,1984],{"class":731},"()]\n",[703,1986,1987],{"class":705,"line":788},[703,1988,934],{"emptyLinePlaceholder":933},[703,1990,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019],{"class":705,"line":794},[703,1992,1334],{"class":720},[703,1994,663],{"class":724},[703,1996,1339],{"class":720},[703,1998,663],{"class":724},[703,2000,1344],{"class":716},[703,2002,721],{"class":731},[703,2004,741],{"class":724},[703,2006,1821],{"class":744},[703,2008,741],{"class":724},[703,2010,1007],{"class":724},[703,2012,1357],{"class":724},[703,2014,1360],{"class":1321},[703,2016,1140],{"class":724},[703,2018,1327],{"class":939},[703,2020,764],{"class":724},[703,2022,2023,2026,2028,2030,2033,2036,2038,2040,2043,2045,2047],{"class":705,"line":1028},[703,2024,2025],{"class":709},"    for",[703,2027,1357],{"class":731},[703,2029,940],{"class":939},[703,2031,2032],{"class":720}," enricher",[703,2034,2035],{"class":724}," of",[703,2037,1967],{"class":720},[703,2039,1394],{"class":731},[703,2041,2042],{"class":716},"enricher",[703,2044,721],{"class":731},[703,2046,1360],{"class":720},[703,2048,800],{"class":731},[703,2050,2051,2053],{"class":705,"line":1033},[703,2052,1423],{"class":724},[703,2054,800],{"class":731},[703,2056,2057,2059],{"class":705,"line":1056},[703,2058,797],{"class":724},[703,2060,800],{"class":720},[470,2062,2063,2064,2067],{},"Enrichers receive the full ",[497,2065,2066],{},"EnrichContext"," with the mutable event, request metadata, safe headers, and response info.",[672,2069,2071,2072,1140],{"id":2070},"_9-drain-evlogdrain","9. Drain (",[497,2073,2074],{},"evlog:drain",[470,2076,2077,2078,2080,2081,2084],{},"The final step sends the enriched event to your observability platform. The ",[497,2079,2074],{}," hook receives a ",[497,2082,2083],{},"DrainContext"," with the complete event:",[693,2086,2089],{"className":695,"code":2087,"filename":2088,"language":698,"meta":699,"style":699},"import { createAxiomDrain } from 'evlog\u002Faxiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())\n})\n","server\u002Fplugins\u002Fevlog-drain.ts",[497,2090,2091,2111,2115,2135,2162],{"__ignoreMap":699},[703,2092,2093,2095,2097,2100,2102,2104,2106,2109],{"class":705,"line":706},[703,2094,907],{"class":709},[703,2096,910],{"class":724},[703,2098,2099],{"class":720}," createAxiomDrain",[703,2101,916],{"class":724},[703,2103,919],{"class":709},[703,2105,922],{"class":724},[703,2107,2108],{"class":744},"evlog\u002Faxiom",[703,2110,928],{"class":724},[703,2112,2113],{"class":705,"line":728},[703,2114,934],{"emptyLinePlaceholder":933},[703,2116,2117,2119,2121,2123,2125,2127,2129,2131,2133],{"class":705,"line":756},[703,2118,710],{"class":709},[703,2120,713],{"class":709},[703,2122,1314],{"class":716},[703,2124,721],{"class":720},[703,2126,721],{"class":724},[703,2128,1322],{"class":1321},[703,2130,1140],{"class":724},[703,2132,1327],{"class":939},[703,2134,764],{"class":724},[703,2136,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159],{"class":705,"line":767},[703,2138,1334],{"class":720},[703,2140,663],{"class":724},[703,2142,1339],{"class":720},[703,2144,663],{"class":724},[703,2146,1344],{"class":716},[703,2148,721],{"class":731},[703,2150,741],{"class":724},[703,2152,2074],{"class":744},[703,2154,741],{"class":724},[703,2156,1007],{"class":724},[703,2158,2099],{"class":716},[703,2160,2161],{"class":731},"())\n",[703,2163,2164,2166],{"class":705,"line":788},[703,2165,797],{"class":724},[703,2167,800],{"class":720},[470,2169,2170,2171,2174],{},"On platforms with ",[497,2172,2173],{},"waitUntil"," (Cloudflare Workers, Vercel Edge), the drain runs after the response is sent to avoid adding latency. On traditional servers, the drain is awaited to prevent losing events in serverless cold shutdowns.",[477,2176,2178],{"id":2177},"hook-execution-order","Hook Execution Order",[482,2180,2181,2197],{},[485,2182,2183],{},[488,2184,2185,2188,2191,2194],{},[491,2186,2187],{},"Order",[491,2189,2190],{},"Hook",[491,2192,2193],{},"When",[491,2195,2196],{},"Purpose",[514,2198,2199,2214,2229],{},[488,2200,2201,2204,2208,2211],{},[519,2202,2203],{},"1",[519,2205,2206],{},[497,2207,1173],{},[519,2209,2210],{},"After request ends, before sampling",[519,2212,2213],{},"Force-keep events based on outcome",[488,2215,2216,2219,2223,2226],{},[519,2217,2218],{},"2",[519,2220,2221],{},[497,2222,1821],{},[519,2224,2225],{},"After emit, before drain",[519,2227,2228],{},"Add derived context to the event",[488,2230,2231,2234,2238,2241],{},[519,2232,2233],{},"3",[519,2235,2236],{},[497,2237,2074],{},[519,2239,2240],{},"After enrichment",[519,2242,2243],{},"Send event to external services",[477,2245,2247],{"id":2246},"error-vs-success-path","Error vs Success Path",[470,2249,2250,2251,2254],{},"Both paths converge at the same emit\u002Fenrich\u002Fdrain pipeline. The only difference is ",[1182,2252,2253],{},"when"," the emit is triggered:",[482,2256,2257,2269],{},[485,2258,2259],{},[488,2260,2261,2263,2266],{},[491,2262],{},[491,2264,2265],{},"Success",[491,2267,2268],{},"Error",[514,2270,2271,2291,2309,2325,2346],{},[488,2272,2273,2278,2287],{},[519,2274,2275],{},[522,2276,2277],{},"Trigger",[519,2279,2280,506,2283,2286],{},[497,2281,2282],{},"afterResponse",[497,2284,2285],{},"response"," hook",[519,2288,2289,2286],{},[497,2290,644],{},[488,2292,2293,2297,2305],{},[519,2294,2295],{},[522,2296,1154],{},[519,2298,2299,2301,2302,2304],{},[497,2300,647],{}," (or ",[497,2303,650],{}," if status >= 400)",[519,2306,2307],{},[497,2308,644],{},[488,2310,2311,2316,2319],{},[519,2312,2313],{},[522,2314,2315],{},"Status",[519,2317,2318],{},"From response",[519,2320,2321,2322,2324],{},"From error's ",[497,2323,1136],{}," field (default 500)",[488,2326,2327,2332,2335],{},[519,2328,2329],{},[522,2330,2331],{},"Error context",[519,2333,2334],{},"None",[519,2336,2337,2339,2340,839,2343],{},[497,2338,644],{}," field with message, stack, ",[497,2341,2342],{},"why",[497,2344,2345],{},"fix",[488,2347,2348,2353,2360],{},[519,2349,2350],{},[522,2351,2352],{},"Double-emit guard",[519,2354,2355,2356,2359],{},"Checks ",[497,2357,2358],{},"_evlogEmitted"," flag",[519,2361,2362,2363],{},"Sets ",[497,2364,2365],{},"_evlogEmitted = true",[477,2367,2369],{"id":2368},"simple-logging-pipeline","Simple Logging Pipeline",[470,2371,2372,2373,2375],{},"When using the ",[497,2374,499],{}," singleton, the pipeline is shorter:",[2377,2378,2379,2391,2396],"ol",{},[1128,2380,2381,2384,2385,533,2388],{},[522,2382,2383],{},"Call",": ",[497,2386,2387],{},"log.info({ action: 'deploy' })",[497,2389,2390],{},"log.info('tag', 'message')",[1128,2392,2393,2395],{},[522,2394,570],{},": The event is built and printed immediately",[1128,2397,2398,2400,2401,2404,2405,2408],{},[522,2399,619],{},": If a global ",[497,2402,2403],{},"drain"," was configured via ",[497,2406,2407],{},"initLogger()",", the event is sent to external services",[470,2410,2411,2412,2414,2415,2418],{},"Tagged logs (",[497,2413,2390],{},") are console-only in pretty mode. Object-form logs (",[497,2416,2417],{},"log.info({ ... })",") always flow through the drain pipeline.",[477,2420,2422],{"id":2421},"standalone-wide-event-pipeline","Standalone Wide Event Pipeline",[470,2424,2425,2426,2429],{},"When using ",[497,2427,2428],{},"createLogger()"," outside a framework:",[2377,2431,2432,2439,2455,2463,2471],{},[1128,2433,2434,2384,2436],{},[522,2435,524],{},[497,2437,2438],{},"createLogger({ jobId: 'sync-001' })",[1128,2440,2441,2384,2443,839,2445,839,2448,839,2451,2454],{},[522,2442,546],{},[497,2444,554],{},[497,2446,2447],{},"log.info()",[497,2449,2450],{},"log.warn()",[497,2452,2453],{},"log.error()"," over the operation",[1128,2456,2457,2459,2460,2462],{},[522,2458,570],{},": Manual ",[497,2461,579],{}," call",[1128,2464,2465,2467,2468],{},[522,2466,589],{},": Head sampling applies based on computed level. Tail sampling via ",[497,2469,2470],{},"initLogger({ sampling: { keep: [...] } })",[1128,2472,2473,2400,2475,2477],{},[522,2474,619],{},[497,2476,2403],{}," was configured, the event is sent",[693,2479,2482],{"className":695,"code":2480,"filename":2481,"language":698,"meta":699,"style":699},"import { initLogger, createLogger } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\ninitLogger({\n  env: { service: 'worker' },\n  drain: createAxiomDrain(),\n  sampling: { rates: { info: 10 } },\n})\n\nconst log = createLogger({ task: 'migrate' })\nlog.set({ records: 500, status: 'complete' })\nlog.emit()\n","scripts\u002Fmigrate.ts",[497,2483,2484,2508,2526,2530,2539,2562,2575,2600,2606,2610,2640,2677],{"__ignoreMap":699},[703,2485,2486,2488,2490,2493,2495,2498,2500,2502,2504,2506],{"class":705,"line":706},[703,2487,907],{"class":709},[703,2489,910],{"class":724},[703,2491,2492],{"class":720}," initLogger",[703,2494,1007],{"class":724},[703,2496,2497],{"class":720}," createLogger",[703,2499,916],{"class":724},[703,2501,919],{"class":709},[703,2503,922],{"class":724},[703,2505,925],{"class":744},[703,2507,928],{"class":724},[703,2509,2510,2512,2514,2516,2518,2520,2522,2524],{"class":705,"line":728},[703,2511,907],{"class":709},[703,2513,910],{"class":724},[703,2515,2099],{"class":720},[703,2517,916],{"class":724},[703,2519,919],{"class":709},[703,2521,922],{"class":724},[703,2523,2108],{"class":744},[703,2525,928],{"class":724},[703,2527,2528],{"class":705,"line":756},[703,2529,934],{"emptyLinePlaceholder":933},[703,2531,2532,2535,2537],{"class":705,"line":767},[703,2533,2534],{"class":716},"initLogger",[703,2536,721],{"class":720},[703,2538,725],{"class":724},[703,2540,2541,2544,2546,2548,2551,2553,2555,2558,2560],{"class":705,"line":788},[703,2542,2543],{"class":731},"  env",[703,2545,735],{"class":724},[703,2547,910],{"class":724},[703,2549,2550],{"class":731}," service",[703,2552,735],{"class":724},[703,2554,922],{"class":724},[703,2556,2557],{"class":744},"worker",[703,2559,741],{"class":724},[703,2561,1516],{"class":724},[703,2563,2564,2567,2569,2571,2573],{"class":705,"line":794},[703,2565,2566],{"class":731},"  drain",[703,2568,735],{"class":724},[703,2570,2099],{"class":716},[703,2572,1977],{"class":720},[703,2574,753],{"class":724},[703,2576,2577,2579,2581,2583,2586,2588,2590,2592,2594,2596,2598],{"class":705,"line":1028},[703,2578,1204],{"class":731},[703,2580,735],{"class":724},[703,2582,910],{"class":724},[703,2584,2585],{"class":731}," rates",[703,2587,735],{"class":724},[703,2589,910],{"class":724},[703,2591,1488],{"class":731},[703,2593,735],{"class":724},[703,2595,1493],{"class":1231},[703,2597,916],{"class":724},[703,2599,1516],{"class":724},[703,2601,2602,2604],{"class":705,"line":1033},[703,2603,797],{"class":724},[703,2605,800],{"class":720},[703,2607,2608],{"class":705,"line":1056},[703,2609,934],{"emptyLinePlaceholder":933},[703,2611,2612,2614,2616,2618,2620,2622,2624,2627,2629,2631,2634,2636,2638],{"class":705,"line":1723},[703,2613,940],{"class":939},[703,2615,943],{"class":720},[703,2617,946],{"class":724},[703,2619,2497],{"class":716},[703,2621,721],{"class":720},[703,2623,985],{"class":724},[703,2625,2626],{"class":731}," task",[703,2628,735],{"class":724},[703,2630,922],{"class":724},[703,2632,2633],{"class":744},"migrate",[703,2635,741],{"class":724},[703,2637,916],{"class":724},[703,2639,800],{"class":720},[703,2641,2642,2644,2646,2648,2650,2652,2655,2657,2660,2662,2664,2666,2668,2671,2673,2675],{"class":705,"line":1767},[703,2643,499],{"class":720},[703,2645,663],{"class":724},[703,2647,641],{"class":716},[703,2649,721],{"class":720},[703,2651,985],{"class":724},[703,2653,2654],{"class":731}," records",[703,2656,735],{"class":724},[703,2658,2659],{"class":1231}," 500",[703,2661,1007],{"class":724},[703,2663,1246],{"class":731},[703,2665,735],{"class":724},[703,2667,922],{"class":724},[703,2669,2670],{"class":744},"complete",[703,2672,741],{"class":724},[703,2674,916],{"class":724},[703,2676,800],{"class":720},[703,2678,2679,2681,2683,2685],{"class":705,"line":1809},[703,2680,499],{"class":720},[703,2682,663],{"class":724},[703,2684,633],{"class":716},[703,2686,2687],{"class":720},"()\n",[477,2689,2691],{"id":2690},"next-steps","Next Steps",[1125,2693,2694,2699,2704,2709],{},[1128,2695,2696,2698],{},[659,2697,46],{"href":47}," - Design effective wide events",[1128,2700,2701,2703],{},[659,2702,61],{"href":62}," - Configure head and tail sampling",[1128,2705,2706,2708],{},[659,2707,90],{"href":95}," - Send events to external platforms",[1128,2710,2711,2713],{},[659,2712,370],{"href":371}," - Add derived context automatically",[2715,2716,2717],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":699,"searchDepth":728,"depth":728,"links":2719},[2720,2721,2735,2736,2737,2738,2739],{"id":479,"depth":728,"text":480},{"id":666,"depth":728,"text":667,"children":2722},[2723,2724,2725,2726,2727,2729,2730,2731,2733],{"id":674,"depth":756,"text":675},{"id":803,"depth":756,"text":804},{"id":889,"depth":756,"text":890},{"id":1119,"depth":756,"text":1120},{"id":1169,"depth":756,"text":2728},"5. Tail Sampling (evlog:emit:keep)",{"id":1444,"depth":756,"text":1445},{"id":1553,"depth":756,"text":1554},{"id":1817,"depth":756,"text":2732},"8. Enrich (evlog:enrich)",{"id":2070,"depth":756,"text":2734},"9. Drain (evlog:drain)",{"id":2177,"depth":728,"text":2178},{"id":2246,"depth":728,"text":2247},{"id":2368,"depth":728,"text":2369},{"id":2421,"depth":728,"text":2422},{"id":2690,"depth":728,"text":2691},"Understand the full lifecycle of an evlog event, from creation to drain. Covers all three modes (simple logging, wide events, request logging), sampling, enrichment, and delivery.","md",[2743,2746],{"label":46,"icon":49,"to":47,"color":2744,"variant":2745},"neutral","subtle",{"label":61,"icon":64,"to":62,"color":2744,"variant":2745},{},{"icon":59},{"title":56,"description":2740},"Yu3uJNclfj3HKmHL5fS-JpUiecOufCrl18HGVzijylE",[2752,2754],{"title":51,"path":52,"stem":53,"description":2753,"icon":54,"children":-1},"Create errors that explain why they occurred and how to fix them. Add actionable context with why, fix, and link fields for humans and AI agents.",{"title":61,"path":62,"stem":63,"description":2755,"icon":64,"children":-1},"Control log volume with two-tier sampling. Head sampling drops noise by level, tail sampling rescues critical events based on outcome. Never miss errors, slow requests, or critical paths.",1784204021498]