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