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