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