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