[{"data":1,"prerenderedAt":1933},["ShallowReactive",2],{"navigation_docs":3,"-extend-plugins":464,"-extend-plugins-surround":1928},[4,30,80,245,379,434],{"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,369,374],{"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":284,"icon":315,"path":349,"stem":350,"children":351,"page":29},"\u002Fuse-cases\u002Ftelemetry","4.use-cases\u002F4.telemetry",[352,355,360,365],{"title":36,"path":353,"stem":354,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","4.use-cases\u002F4.telemetry\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","4.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":361,"path":362,"stem":363,"icon":364},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","4.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":366,"path":367,"stem":368,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","4.use-cases\u002F4.telemetry\u002F04.reference",{"title":370,"path":371,"stem":372,"icon":373},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":375,"path":376,"stem":377,"icon":378},"eve","\u002Fuse-cases\u002Feve","4.use-cases\u002F5.eve","i-custom-eve",{"title":380,"path":381,"stem":382,"children":383,"page":29},"Extend","\u002Fextend","5.extend",[384,388,393,398,403,407,411,415,419,424,429],{"title":36,"path":385,"stem":386,"icon":387},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":389,"path":390,"stem":391,"icon":392},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":394,"path":395,"stem":396,"icon":397},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":399,"path":400,"stem":401,"icon":402},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":404,"stem":405,"icon":406},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":408,"path":409,"stem":410,"icon":387},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":412,"path":413,"stem":414,"icon":373},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":416,"path":417,"stem":418,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":420,"path":421,"stem":422,"icon":423},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":425,"path":426,"stem":427,"icon":428},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":430,"path":431,"stem":432,"icon":433},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":366,"path":435,"stem":436,"children":437,"page":29},"\u002Freference","6.reference",[438,443,446,451,455,460],{"title":439,"path":440,"stem":441,"icon":442},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":444,"stem":445,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":447,"path":448,"stem":449,"icon":450},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":452,"path":453,"stem":454,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":456,"path":457,"stem":458,"icon":459},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":461,"path":462,"stem":463,"icon":373},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":465,"title":408,"body":466,"description":1916,"extension":1917,"links":1918,"meta":1924,"navigation":1925,"path":409,"seo":1926,"stem":410,"__hash__":1927},"docs\u002F5.extend\u002F4.plugins.md",{"type":467,"value":468,"toc":1908},"minimark",[469,472,485,505,592,597,856,859,1091,1094,1236,1250,1254,1269,1702,1706,1715,1806,1813,1817,1874,1878,1904],[470,471],"lifecycle-flow",{},[473,474,475,479,480,484],"p",{},[476,477,478],"code",{},"definePlugin()"," is the ",[481,482,483],"strong",{},"canonical extension point"," for evlog. Drains and enrichers are special cases of plugins, but a single plugin can opt into multiple hooks at once — the right shape for any non-trivial extension that mixes several concerns (e.g. enrich on every event + side-effect on drain + keep decision on tail sampling, all reading the same shared state).",[473,486,487,488,494,495,500,501,504],{},"When the extension only does one thing, prefer the single-purpose ",[489,490,491],"a",{"href":413},[476,492,493],{},"enricherPlugin()"," \u002F ",[489,496,497],{"href":426},[476,498,499],{},"drainPlugin()"," wrappers. Reach for ",[476,502,503],{},"definePlugin"," when several hooks share state.",[506,507,510,513,584],"prompt",{":actions":508,"description":509,"icon":387},"[\"copy\",\"cursor\",\"claude\"]","Build a multi-hook evlog plugin",[473,511,512],{},"Build an evlog plugin that hooks into more than one lifecycle stage.",[514,515,516,550,556,559,573],"ul",{},[517,518,519,520,522,523,526,527,530,531,530,534,530,537,530,540,530,543,530,546,549],"li",{},"Import ",[476,521,503],{}," from ",[476,524,525],{},"evlog"," and pick the hooks I need (",[476,528,529],{},"onRequestStart",", ",[476,532,533],{},"enrich",[476,535,536],{},"drain",[476,538,539],{},"extendLogger",[476,541,542],{},"keep",[476,544,545],{},"onClientLog",[476,547,548],{},"onRequestFinish",")",[517,551,552,553,555],{},"Keep ",[476,554,533],{}," pure (no I\u002FO, no throwing — use try\u002Fcatch internally)",[517,557,558],{},"For drains, batch and ship to the destination; respect backpressure if the sink is slow",[517,560,561,562,565,566,569,570,549],{},"Register the plugin via the framework config: Next\u002Fstandalone ",[476,563,564],{},"initLogger({ plugins: [myPlugin] })",", Hono\u002FExpress\u002FFastify\u002FElysia middleware option ",[476,567,568],{},"{ plugins: [myPlugin] }",". For Nitro, register the individual hooks directly (",[476,571,572],{},"nitroApp.hooks.hook('evlog:enrich' | 'evlog:drain' | …)",[517,574,575,576,494,578,580,581,583],{},"Prefer single-purpose ",[476,577,493],{},[476,579,499],{}," wrappers for simple extensions; use ",[476,582,503],{}," only when several hooks are needed",[473,585,586,587],{},"Docs: ",[489,588,589],{"href":589,"rel":590},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fplugins",[591],"nofollow",[593,594,596],"h2",{"id":595},"minimal-example","Minimal example",[598,599,604],"pre",{"className":600,"code":601,"language":602,"meta":603,"style":603},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { definePlugin } from 'evlog'\n\nexport const tenantPlugin = definePlugin({\n  name: 'tenant',\n  onRequestStart({ logger, headers }) {\n    const tenantId = headers?.['x-tenant-id']\n    if (tenantId) logger.set({ tenant: { id: tenantId } })\n  },\n  enrich({ event }) {\n    event.region = process.env.REGION\n  },\n})\n","ts","",[476,605,606,638,645,670,691,716,746,796,802,817,843,848],{"__ignoreMap":603},[607,608,611,615,619,623,626,629,632,635],"span",{"class":609,"line":610},"line",1,[607,612,614],{"class":613},"s7zQu","import",[607,616,618],{"class":617},"sMK4o"," {",[607,620,622],{"class":621},"sTEyZ"," definePlugin",[607,624,625],{"class":617}," }",[607,627,628],{"class":613}," from",[607,630,631],{"class":617}," '",[607,633,525],{"class":634},"sfazB",[607,636,637],{"class":617},"'\n",[607,639,641],{"class":609,"line":640},2,[607,642,644],{"emptyLinePlaceholder":643},true,"\n",[607,646,648,651,655,658,661,664,667],{"class":609,"line":647},3,[607,649,650],{"class":613},"export",[607,652,654],{"class":653},"spNyl"," const",[607,656,657],{"class":621}," tenantPlugin ",[607,659,660],{"class":617},"=",[607,662,622],{"class":663},"s2Zo4",[607,665,666],{"class":621},"(",[607,668,669],{"class":617},"{\n",[607,671,673,677,680,682,685,688],{"class":609,"line":672},4,[607,674,676],{"class":675},"swJcz","  name",[607,678,679],{"class":617},":",[607,681,631],{"class":617},[607,683,684],{"class":634},"tenant",[607,686,687],{"class":617},"'",[607,689,690],{"class":617},",\n",[607,692,694,697,700,704,707,710,713],{"class":609,"line":693},5,[607,695,696],{"class":675},"  onRequestStart",[607,698,699],{"class":617},"({",[607,701,703],{"class":702},"sHdIc"," logger",[607,705,706],{"class":617},",",[607,708,709],{"class":702}," headers",[607,711,712],{"class":617}," })",[607,714,715],{"class":617}," {\n",[607,717,719,722,725,728,730,733,736,738,741,743],{"class":609,"line":718},6,[607,720,721],{"class":653},"    const",[607,723,724],{"class":621}," tenantId",[607,726,727],{"class":617}," =",[607,729,709],{"class":621},[607,731,732],{"class":617},"?.",[607,734,735],{"class":675},"[",[607,737,687],{"class":617},[607,739,740],{"class":634},"x-tenant-id",[607,742,687],{"class":617},[607,744,745],{"class":675},"]\n",[607,747,749,752,755,758,761,764,767,770,772,775,778,780,782,785,787,789,791,793],{"class":609,"line":748},7,[607,750,751],{"class":613},"    if",[607,753,754],{"class":675}," (",[607,756,757],{"class":621},"tenantId",[607,759,760],{"class":675},") ",[607,762,763],{"class":621},"logger",[607,765,766],{"class":617},".",[607,768,769],{"class":663},"set",[607,771,666],{"class":675},[607,773,774],{"class":617},"{",[607,776,777],{"class":675}," tenant",[607,779,679],{"class":617},[607,781,618],{"class":617},[607,783,784],{"class":675}," id",[607,786,679],{"class":617},[607,788,724],{"class":621},[607,790,625],{"class":617},[607,792,625],{"class":617},[607,794,795],{"class":675},")\n",[607,797,799],{"class":609,"line":798},8,[607,800,801],{"class":617},"  },\n",[607,803,805,808,810,813,815],{"class":609,"line":804},9,[607,806,807],{"class":675},"  enrich",[607,809,699],{"class":617},[607,811,812],{"class":702}," event",[607,814,712],{"class":617},[607,816,715],{"class":617},[607,818,820,823,825,828,830,833,835,838,840],{"class":609,"line":819},10,[607,821,822],{"class":621},"    event",[607,824,766],{"class":617},[607,826,827],{"class":621},"region",[607,829,727],{"class":617},[607,831,832],{"class":621}," process",[607,834,766],{"class":617},[607,836,837],{"class":621},"env",[607,839,766],{"class":617},[607,841,842],{"class":621},"REGION\n",[607,844,846],{"class":609,"line":845},11,[607,847,801],{"class":617},[607,849,851,854],{"class":609,"line":850},12,[607,852,853],{"class":617},"}",[607,855,795],{"class":621},[473,857,858],{},"Register the plugin where you bootstrap evlog. The shape depends on your runtime:",[860,861,862,932,1010],"code-group",{},[598,863,866],{"className":600,"code":864,"filename":865,"language":602,"meta":603,"style":603},"import { initLogger } from 'evlog'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\ninitLogger({ plugins: [tenantPlugin] })\n","Next.js \u002F standalone",[476,867,868,887,907,911],{"__ignoreMap":603},[607,869,870,872,874,877,879,881,883,885],{"class":609,"line":610},[607,871,614],{"class":613},[607,873,618],{"class":617},[607,875,876],{"class":621}," initLogger",[607,878,625],{"class":617},[607,880,628],{"class":613},[607,882,631],{"class":617},[607,884,525],{"class":634},[607,886,637],{"class":617},[607,888,889,891,893,896,898,900,902,905],{"class":609,"line":640},[607,890,614],{"class":613},[607,892,618],{"class":617},[607,894,895],{"class":621}," tenantPlugin",[607,897,625],{"class":617},[607,899,628],{"class":613},[607,901,631],{"class":617},[607,903,904],{"class":634},".\u002Fplugins\u002Ftenant",[607,906,637],{"class":617},[607,908,909],{"class":609,"line":647},[607,910,644],{"emptyLinePlaceholder":643},[607,912,913,916,918,920,923,925,928,930],{"class":609,"line":672},[607,914,915],{"class":663},"initLogger",[607,917,666],{"class":621},[607,919,774],{"class":617},[607,921,922],{"class":675}," plugins",[607,924,679],{"class":617},[607,926,927],{"class":621}," [tenantPlugin] ",[607,929,853],{"class":617},[607,931,795],{"class":621},[598,933,936],{"className":600,"code":934,"filename":935,"language":602,"meta":603,"style":603},"import { evlogMiddleware } from 'evlog\u002F\u003Cframework>'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\napp.use(evlogMiddleware({ plugins: [tenantPlugin] }))\n","Hono \u002F Express \u002F Fastify \u002F Elysia",[476,937,938,958,976,980],{"__ignoreMap":603},[607,939,940,942,944,947,949,951,953,956],{"class":609,"line":610},[607,941,614],{"class":613},[607,943,618],{"class":617},[607,945,946],{"class":621}," evlogMiddleware",[607,948,625],{"class":617},[607,950,628],{"class":613},[607,952,631],{"class":617},[607,954,955],{"class":634},"evlog\u002F\u003Cframework>",[607,957,637],{"class":617},[607,959,960,962,964,966,968,970,972,974],{"class":609,"line":640},[607,961,614],{"class":613},[607,963,618],{"class":617},[607,965,895],{"class":621},[607,967,625],{"class":617},[607,969,628],{"class":613},[607,971,631],{"class":617},[607,973,904],{"class":634},[607,975,637],{"class":617},[607,977,978],{"class":609,"line":647},[607,979,644],{"emptyLinePlaceholder":643},[607,981,982,985,987,990,992,995,997,999,1001,1003,1005,1007],{"class":609,"line":672},[607,983,984],{"class":621},"app",[607,986,766],{"class":617},[607,988,989],{"class":663},"use",[607,991,666],{"class":621},[607,993,994],{"class":663},"evlogMiddleware",[607,996,666],{"class":621},[607,998,774],{"class":617},[607,1000,922],{"class":675},[607,1002,679],{"class":617},[607,1004,927],{"class":621},[607,1006,853],{"class":617},[607,1008,1009],{"class":621},"))\n",[598,1011,1013],{"className":600,"code":1012,"filename":182,"language":602,"meta":603,"style":603},"\u002F\u002F Register the hooks you actually use directly:\nnitroApp.hooks.hook('evlog:enrich', tenantPlugin.enrich!)\nnitroApp.hooks.hook('evlog:request:start', tenantPlugin.onRequestStart!)\n",[476,1014,1015,1021,1058],{"__ignoreMap":603},[607,1016,1017],{"class":609,"line":610},[607,1018,1020],{"class":1019},"sHwdD","\u002F\u002F Register the hooks you actually use directly:\n",[607,1022,1023,1026,1028,1031,1033,1036,1038,1040,1043,1045,1047,1049,1051,1053,1056],{"class":609,"line":640},[607,1024,1025],{"class":621},"nitroApp",[607,1027,766],{"class":617},[607,1029,1030],{"class":621},"hooks",[607,1032,766],{"class":617},[607,1034,1035],{"class":663},"hook",[607,1037,666],{"class":621},[607,1039,687],{"class":617},[607,1041,1042],{"class":634},"evlog:enrich",[607,1044,687],{"class":617},[607,1046,706],{"class":617},[607,1048,895],{"class":621},[607,1050,766],{"class":617},[607,1052,533],{"class":621},[607,1054,1055],{"class":617},"!",[607,1057,795],{"class":621},[607,1059,1060,1062,1064,1066,1068,1070,1072,1074,1077,1079,1081,1083,1085,1087,1089],{"class":609,"line":647},[607,1061,1025],{"class":621},[607,1063,766],{"class":617},[607,1065,1030],{"class":621},[607,1067,766],{"class":617},[607,1069,1035],{"class":663},[607,1071,666],{"class":621},[607,1073,687],{"class":617},[607,1075,1076],{"class":634},"evlog:request:start",[607,1078,687],{"class":617},[607,1080,706],{"class":617},[607,1082,895],{"class":621},[607,1084,766],{"class":617},[607,1086,529],{"class":621},[607,1088,1055],{"class":617},[607,1090,795],{"class":621},[593,1092,1093],{"id":1030},"Hooks",[1095,1096,1097,1113],"table",{},[1098,1099,1100],"thead",{},[1101,1102,1103,1107,1110],"tr",{},[1104,1105,1106],"th",{},"Hook",[1104,1108,1109],{},"When",[1104,1111,1112],{},"Use it for",[1114,1115,1116,1133,1148,1161,1181,1194,1207,1220],"tbody",{},[1101,1117,1118,1124,1127],{},[1119,1120,1121],"td",{},[476,1122,1123],{},"setup(ctx)",[1119,1125,1126],{},"Once when registered",[1119,1128,1129,1130,1132],{},"Read ",[476,1131,837],{},", set up shared state",[1101,1134,1135,1140,1143],{},[1119,1136,1137],{},[476,1138,1139],{},"onRequestStart(ctx)",[1119,1141,1142],{},"Each request, before any handler runs",[1119,1144,1145,1146],{},"Pull values from headers into ",[476,1147,763],{},[1101,1149,1150,1155,1158],{},[1119,1151,1152],{},[476,1153,1154],{},"enrich(ctx)",[1119,1156,1157],{},"Every event, before drain",[1119,1159,1160],{},"Add derived fields (geo, deploy id…)",[1101,1162,1163,1168,1171],{},[1119,1164,1165],{},[476,1166,1167],{},"keep(ctx)",[1119,1169,1170],{},"Tail sampling decision",[1119,1172,1173,1174,530,1177,1180],{},"Force-keep based on outcome (",[476,1175,1176],{},"status >= 400",[476,1178,1179],{},"duration > 500",", …)",[1101,1182,1183,1188,1191],{},[1119,1184,1185],{},[476,1186,1187],{},"drain(ctx)",[1119,1189,1190],{},"Every emitted event",[1119,1192,1193],{},"Side-effect: alert, mirror to a queue, etc.",[1101,1195,1196,1201,1204],{},[1119,1197,1198],{},[476,1199,1200],{},"onRequestFinish(ctx)",[1119,1202,1203],{},"After response",[1119,1205,1206],{},"Per-request post-processing",[1101,1208,1209,1214,1217],{},[1119,1210,1211],{},[476,1212,1213],{},"onClientLog(ctx)",[1119,1215,1216],{},"Browser-submitted event hits the ingest endpoint",[1119,1218,1219],{},"Observe \u002F reject client traffic",[1101,1221,1222,1227,1230],{},[1119,1223,1224],{},[476,1225,1226],{},"extendLogger(logger)",[1119,1228,1229],{},"Each request",[1119,1231,1232,1233,549],{},"Add custom methods (e.g. ",[476,1234,1235],{},"logger.audit.refund()",[473,1237,1238,1239,1242,1243,766],{},"Every hook is ",[481,1240,1241],{},"optional",". A plugin can implement any subset. The full type lives in ",[489,1244,1247],{"href":1245,"rel":1246},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[591],[476,1248,1249],{},"packages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[593,1251,1253],{"id":1252},"a-multi-hook-example","A multi-hook example",[473,1255,1256,1257,1260,1261,530,1264,1266,1267,679],{},"Plugins shine when several concerns share state. Here, a single ",[476,1258,1259],{},"request-metrics"," plugin tracks per-request timing through ",[476,1262,1263],{},"setup",[476,1265,529],{},", and ",[476,1268,536],{},[598,1270,1272],{"className":600,"code":1271,"language":602,"meta":603,"style":603},"import { definePlugin } from 'evlog\u002Ftoolkit'\n\nexport const requestMetricsPlugin = definePlugin({\n  name: 'request-metrics',\n\n  setup({ env }) {\n    statsd.init({ service: env.service })\n  },\n\n  enrich({ event }) {\n    event.tier = event.duration && event.duration > 1000 ? 'slow' : 'fast'\n  },\n\n  drain({ event }) {\n    statsd.timing('http.request', event.duration as number, { path: event.path as string })\n  },\n\n  onRequestStart({ logger, request }) {\n    logger.set({ trace: { startedAt: Date.now() } })\n  },\n\n  onRequestFinish({ event, durationMs }) {\n    if (event && (event.level === 'error' || durationMs > 5000)) {\n      \u002F\u002F alert \u002F forward \u002F etc.\n    }\n  },\n})\n",[476,1273,1274,1293,1297,1314,1328,1332,1346,1376,1380,1384,1396,1450,1454,1459,1473,1532,1537,1542,1560,1603,1608,1613,1632,1678,1684,1690,1695],{"__ignoreMap":603},[607,1275,1276,1278,1280,1282,1284,1286,1288,1291],{"class":609,"line":610},[607,1277,614],{"class":613},[607,1279,618],{"class":617},[607,1281,622],{"class":621},[607,1283,625],{"class":617},[607,1285,628],{"class":613},[607,1287,631],{"class":617},[607,1289,1290],{"class":634},"evlog\u002Ftoolkit",[607,1292,637],{"class":617},[607,1294,1295],{"class":609,"line":640},[607,1296,644],{"emptyLinePlaceholder":643},[607,1298,1299,1301,1303,1306,1308,1310,1312],{"class":609,"line":647},[607,1300,650],{"class":613},[607,1302,654],{"class":653},[607,1304,1305],{"class":621}," requestMetricsPlugin ",[607,1307,660],{"class":617},[607,1309,622],{"class":663},[607,1311,666],{"class":621},[607,1313,669],{"class":617},[607,1315,1316,1318,1320,1322,1324,1326],{"class":609,"line":672},[607,1317,676],{"class":675},[607,1319,679],{"class":617},[607,1321,631],{"class":617},[607,1323,1259],{"class":634},[607,1325,687],{"class":617},[607,1327,690],{"class":617},[607,1329,1330],{"class":609,"line":693},[607,1331,644],{"emptyLinePlaceholder":643},[607,1333,1334,1337,1339,1342,1344],{"class":609,"line":718},[607,1335,1336],{"class":675},"  setup",[607,1338,699],{"class":617},[607,1340,1341],{"class":702}," env",[607,1343,712],{"class":617},[607,1345,715],{"class":617},[607,1347,1348,1351,1353,1356,1358,1360,1363,1365,1367,1369,1372,1374],{"class":609,"line":748},[607,1349,1350],{"class":621},"    statsd",[607,1352,766],{"class":617},[607,1354,1355],{"class":663},"init",[607,1357,666],{"class":675},[607,1359,774],{"class":617},[607,1361,1362],{"class":675}," service",[607,1364,679],{"class":617},[607,1366,1341],{"class":621},[607,1368,766],{"class":617},[607,1370,1371],{"class":621},"service",[607,1373,625],{"class":617},[607,1375,795],{"class":675},[607,1377,1378],{"class":609,"line":798},[607,1379,801],{"class":617},[607,1381,1382],{"class":609,"line":804},[607,1383,644],{"emptyLinePlaceholder":643},[607,1385,1386,1388,1390,1392,1394],{"class":609,"line":819},[607,1387,807],{"class":675},[607,1389,699],{"class":617},[607,1391,812],{"class":702},[607,1393,712],{"class":617},[607,1395,715],{"class":617},[607,1397,1398,1400,1402,1405,1407,1409,1411,1414,1417,1419,1421,1423,1426,1430,1433,1435,1438,1440,1443,1445,1448],{"class":609,"line":845},[607,1399,822],{"class":621},[607,1401,766],{"class":617},[607,1403,1404],{"class":621},"tier",[607,1406,727],{"class":617},[607,1408,812],{"class":621},[607,1410,766],{"class":617},[607,1412,1413],{"class":621},"duration",[607,1415,1416],{"class":617}," &&",[607,1418,812],{"class":621},[607,1420,766],{"class":617},[607,1422,1413],{"class":621},[607,1424,1425],{"class":617}," >",[607,1427,1429],{"class":1428},"sbssI"," 1000",[607,1431,1432],{"class":617}," ?",[607,1434,631],{"class":617},[607,1436,1437],{"class":634},"slow",[607,1439,687],{"class":617},[607,1441,1442],{"class":617}," :",[607,1444,631],{"class":617},[607,1446,1447],{"class":634},"fast",[607,1449,637],{"class":617},[607,1451,1452],{"class":609,"line":850},[607,1453,801],{"class":617},[607,1455,1457],{"class":609,"line":1456},13,[607,1458,644],{"emptyLinePlaceholder":643},[607,1460,1462,1465,1467,1469,1471],{"class":609,"line":1461},14,[607,1463,1464],{"class":675},"  drain",[607,1466,699],{"class":617},[607,1468,812],{"class":702},[607,1470,712],{"class":617},[607,1472,715],{"class":617},[607,1474,1476,1478,1480,1483,1485,1487,1490,1492,1494,1496,1498,1500,1503,1507,1509,1511,1514,1516,1518,1520,1523,1525,1528,1530],{"class":609,"line":1475},15,[607,1477,1350],{"class":621},[607,1479,766],{"class":617},[607,1481,1482],{"class":663},"timing",[607,1484,666],{"class":675},[607,1486,687],{"class":617},[607,1488,1489],{"class":634},"http.request",[607,1491,687],{"class":617},[607,1493,706],{"class":617},[607,1495,812],{"class":621},[607,1497,766],{"class":617},[607,1499,1413],{"class":621},[607,1501,1502],{"class":613}," as",[607,1504,1506],{"class":1505},"sBMFI"," number",[607,1508,706],{"class":617},[607,1510,618],{"class":617},[607,1512,1513],{"class":675}," path",[607,1515,679],{"class":617},[607,1517,812],{"class":621},[607,1519,766],{"class":617},[607,1521,1522],{"class":621},"path",[607,1524,1502],{"class":613},[607,1526,1527],{"class":1505}," string",[607,1529,625],{"class":617},[607,1531,795],{"class":675},[607,1533,1535],{"class":609,"line":1534},16,[607,1536,801],{"class":617},[607,1538,1540],{"class":609,"line":1539},17,[607,1541,644],{"emptyLinePlaceholder":643},[607,1543,1545,1547,1549,1551,1553,1556,1558],{"class":609,"line":1544},18,[607,1546,696],{"class":675},[607,1548,699],{"class":617},[607,1550,703],{"class":702},[607,1552,706],{"class":617},[607,1554,1555],{"class":702}," request",[607,1557,712],{"class":617},[607,1559,715],{"class":617},[607,1561,1563,1566,1568,1570,1572,1574,1577,1579,1581,1584,1586,1589,1591,1594,1597,1599,1601],{"class":609,"line":1562},19,[607,1564,1565],{"class":621},"    logger",[607,1567,766],{"class":617},[607,1569,769],{"class":663},[607,1571,666],{"class":675},[607,1573,774],{"class":617},[607,1575,1576],{"class":675}," trace",[607,1578,679],{"class":617},[607,1580,618],{"class":617},[607,1582,1583],{"class":675}," startedAt",[607,1585,679],{"class":617},[607,1587,1588],{"class":621}," Date",[607,1590,766],{"class":617},[607,1592,1593],{"class":663},"now",[607,1595,1596],{"class":675},"() ",[607,1598,853],{"class":617},[607,1600,625],{"class":617},[607,1602,795],{"class":675},[607,1604,1606],{"class":609,"line":1605},20,[607,1607,801],{"class":617},[607,1609,1611],{"class":609,"line":1610},21,[607,1612,644],{"emptyLinePlaceholder":643},[607,1614,1616,1619,1621,1623,1625,1628,1630],{"class":609,"line":1615},22,[607,1617,1618],{"class":675},"  onRequestFinish",[607,1620,699],{"class":617},[607,1622,812],{"class":702},[607,1624,706],{"class":617},[607,1626,1627],{"class":702}," durationMs",[607,1629,712],{"class":617},[607,1631,715],{"class":617},[607,1633,1635,1637,1639,1642,1644,1646,1648,1650,1653,1656,1658,1661,1663,1666,1668,1670,1673,1676],{"class":609,"line":1634},23,[607,1636,751],{"class":613},[607,1638,754],{"class":675},[607,1640,1641],{"class":621},"event",[607,1643,1416],{"class":617},[607,1645,754],{"class":675},[607,1647,1641],{"class":621},[607,1649,766],{"class":617},[607,1651,1652],{"class":621},"level",[607,1654,1655],{"class":617}," ===",[607,1657,631],{"class":617},[607,1659,1660],{"class":634},"error",[607,1662,687],{"class":617},[607,1664,1665],{"class":617}," ||",[607,1667,1627],{"class":621},[607,1669,1425],{"class":617},[607,1671,1672],{"class":1428}," 5000",[607,1674,1675],{"class":675},")) ",[607,1677,669],{"class":617},[607,1679,1681],{"class":609,"line":1680},24,[607,1682,1683],{"class":1019},"      \u002F\u002F alert \u002F forward \u002F etc.\n",[607,1685,1687],{"class":609,"line":1686},25,[607,1688,1689],{"class":617},"    }\n",[607,1691,1693],{"class":609,"line":1692},26,[607,1694,801],{"class":617},[607,1696,1698,1700],{"class":609,"line":1697},27,[607,1699,853],{"class":617},[607,1701,795],{"class":621},[593,1703,1705],{"id":1704},"sugar-plugins","Sugar plugins",[473,1707,1708,1709,1711,1712,1714],{},"For single-hook extensions, the toolkit offers ",[476,1710,499],{}," and ",[476,1713,493],{}," wrappers:",[598,1716,1720],{"className":1717,"code":1718,"language":1719,"meta":603,"style":603},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { drainPlugin, enricherPlugin } from 'evlog\u002Ftoolkit'\n\nconst drainOnly = drainPlugin('axiom', createAxiomDrain())\nconst enricherOnly = enricherPlugin('user-agent', createUserAgentEnricher())\n","typescript",[476,1721,1722,1746,1750,1779],{"__ignoreMap":603},[607,1723,1724,1726,1728,1731,1733,1736,1738,1740,1742,1744],{"class":609,"line":610},[607,1725,614],{"class":613},[607,1727,618],{"class":617},[607,1729,1730],{"class":621}," drainPlugin",[607,1732,706],{"class":617},[607,1734,1735],{"class":621}," enricherPlugin",[607,1737,625],{"class":617},[607,1739,628],{"class":613},[607,1741,631],{"class":617},[607,1743,1290],{"class":634},[607,1745,637],{"class":617},[607,1747,1748],{"class":609,"line":640},[607,1749,644],{"emptyLinePlaceholder":643},[607,1751,1752,1755,1758,1760,1762,1764,1766,1769,1771,1773,1776],{"class":609,"line":647},[607,1753,1754],{"class":653},"const",[607,1756,1757],{"class":621}," drainOnly ",[607,1759,660],{"class":617},[607,1761,1730],{"class":663},[607,1763,666],{"class":621},[607,1765,687],{"class":617},[607,1767,1768],{"class":634},"axiom",[607,1770,687],{"class":617},[607,1772,706],{"class":617},[607,1774,1775],{"class":663}," createAxiomDrain",[607,1777,1778],{"class":621},"())\n",[607,1780,1781,1783,1786,1788,1790,1792,1794,1797,1799,1801,1804],{"class":609,"line":672},[607,1782,1754],{"class":653},[607,1784,1785],{"class":621}," enricherOnly ",[607,1787,660],{"class":617},[607,1789,1735],{"class":663},[607,1791,666],{"class":621},[607,1793,687],{"class":617},[607,1795,1796],{"class":634},"user-agent",[607,1798,687],{"class":617},[607,1800,706],{"class":617},[607,1802,1803],{"class":663}," createUserAgentEnricher",[607,1805,1778],{"class":621},[473,1807,1808,1809,1812],{},"These are equivalent to a ",[476,1810,1811],{},"definePlugin({ name, drain | enrich })"," shape but read more clearly when intent is obvious.",[593,1814,1816],{"id":1815},"common-pitfalls","Common pitfalls",[514,1818,1819,1828,1839,1862],{},[517,1820,1821,1824,1825,1827],{},[481,1822,1823],{},"Don't throw from a hook."," The plugin runner catches and logs errors with the plugin name, but a thrown error from ",[476,1826,533],{}," won't propagate the event downstream. Keep hooks defensive.",[517,1829,1830,1835,1836,1838],{},[481,1831,1832,1834],{},[476,1833,536],{}," runs for every event"," — not just per-request. If you only care about per-request lifecycle, use ",[476,1837,548],{}," instead.",[517,1840,1841,1846,1847,1850,1851,1854,1855,1858,1859,766],{},[481,1842,1843,1845],{},[476,1844,539],{}," mutates the logger object"," — augment ",[476,1848,1849],{},"RequestLogger"," in a ",[476,1852,1853],{},".d.ts"," so ",[476,1856,1857],{},"useLogger(event)"," exposes the new methods to TypeScript. See ",[489,1860,1861],{"href":72},"typed fields",[517,1863,1864,1870,1871,1873],{},[481,1865,1866,1867],{},"Plugins are de-duplicated by ",[476,1868,1869],{},"name",". Re-registering with the same ",[476,1872,1869],{}," replaces the previous version (last registration wins).",[593,1875,1877],{"id":1876},"next-steps","Next steps",[514,1879,1880,1886,1892,1898],{},[517,1881,1882,1885],{},[489,1883,1884],{"href":413},"Custom Enrichers"," — single-hook enrichment",[517,1887,1888,1891],{},[489,1889,1890],{"href":426},"Custom Drains"," — single-destination output",[517,1893,1894,1897],{},[489,1895,1896],{"href":417},"Tail Sampling"," — outcome-aware keep decisions",[517,1899,1900,1903],{},[489,1901,1902],{"href":421},"Identity Headers"," — tag every drain request",[1905,1906,1907],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":603,"searchDepth":640,"depth":640,"links":1909},[1910,1911,1912,1913,1914,1915],{"id":595,"depth":640,"text":596},{"id":1030,"depth":640,"text":1093},{"id":1252,"depth":640,"text":1253},{"id":1704,"depth":640,"text":1705},{"id":1815,"depth":640,"text":1816},{"id":1876,"depth":640,"text":1877},"definePlugin is the canonical extension point for evlog — opt into any subset of setup, onRequestStart, enrich, keep, drain, onRequestFinish, onClientLog, extendLogger from a single cohesive object.","md",[1919,1922,1923],{"label":1884,"icon":373,"to":413,"color":1920,"variant":1921},"neutral","subtle",{"label":1890,"icon":428,"to":426,"color":1920,"variant":1921},{"label":1896,"icon":64,"to":417,"color":1920,"variant":1921},{},{"title":408,"icon":387},{"title":408,"description":1916},"2C4tyVwDDGJiymeMJBdMDZND3vda7wumsu2RNCEwWxI",[1929,1931],{"title":345,"path":404,"stem":405,"description":1930,"icon":406,"children":-1},"Concrete copy-paste recipes — build your own minimal devtool, pipe to curl + jq, replay history then go live, and aggregate on the consumer side.",{"title":412,"path":413,"stem":414,"description":1932,"icon":373,"children":-1},"Write custom enrichers to add derived context to your wide events. Add deployment metadata, tenant IDs, feature flags, geo, or any computed data — the toolkit handles error isolation, undefined skipping, and the merge step.",1784211312929]