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