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