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