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