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