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