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