[{"data":1,"prerenderedAt":1903},["ShallowReactive",2],{"navigation_docs":3,"-extend-plugins":434,"-extend-plugins-surround":1898},[4,30,80,240,348,403],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"Integrate","\u002Fintegrate","3.integrate",[85,89,152],{"title":36,"path":86,"stem":87,"icon":88},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":90,"path":91,"stem":92,"children":93,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[94,97,137],{"title":36,"path":95,"stem":96,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":98,"path":99,"stem":100,"children":101,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[102,107,112,117,122,127,132],{"title":103,"path":104,"stem":105,"icon":106},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":108,"path":109,"stem":110,"icon":111},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":113,"path":114,"stem":115,"icon":116},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":118,"path":119,"stem":120,"icon":121},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":123,"path":124,"stem":125,"icon":126},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":128,"path":129,"stem":130,"icon":131},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":133,"path":134,"stem":135,"icon":136},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[142,147],{"title":143,"path":144,"stem":145,"icon":146},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":148,"path":149,"stem":150,"icon":151},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":153,"path":154,"stem":155,"children":156,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[157,161,166,171,176,181,186,191,196,201,206,211,216,221,225,230,235],{"title":36,"path":158,"stem":159,"icon":160},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":162,"path":163,"stem":164,"icon":165},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":167,"path":168,"stem":169,"icon":170},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":172,"path":173,"stem":174,"icon":175},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":177,"path":178,"stem":179,"icon":180},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":182,"path":183,"stem":184,"icon":185},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":187,"path":188,"stem":189,"icon":190},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":192,"path":193,"stem":194,"icon":195},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":197,"path":198,"stem":199,"icon":200},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":202,"path":203,"stem":204,"icon":205},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":207,"path":208,"stem":209,"icon":210},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":212,"path":213,"stem":214,"icon":215},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":217,"path":218,"stem":219,"icon":220},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":222,"path":223,"stem":224,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":226,"path":227,"stem":228,"icon":229},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":231,"path":232,"stem":233,"icon":234},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":236,"path":237,"stem":238,"icon":239},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":241,"path":242,"stem":243,"children":244,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[245,249,254,283,311,343],{"title":36,"path":246,"stem":247,"icon":248},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":250,"path":251,"stem":252,"icon":253},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":255,"icon":256,"path":257,"stem":258,"children":259,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[260,263,268,273,278],{"title":36,"path":261,"stem":262,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":264,"path":265,"stem":266,"icon":267},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":269,"path":270,"stem":271,"icon":272},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":274,"path":275,"stem":276,"icon":277},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":279,"path":280,"stem":281,"icon":282},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":284,"icon":285,"path":286,"stem":287,"children":288,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[289,292,297,302,306],{"title":36,"path":290,"stem":291,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":293,"path":294,"stem":295,"icon":296},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":298,"path":299,"stem":300,"icon":301},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":303,"path":304,"stem":305,"icon":253},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":307,"path":308,"stem":309,"icon":310},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":312,"icon":313,"path":314,"stem":315,"children":316,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[317,320,325,330,335,339],{"title":36,"path":318,"stem":319,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":321,"path":322,"stem":323,"icon":324},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":326,"path":327,"stem":328,"icon":329},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":331,"path":332,"stem":333,"icon":334},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":336,"path":337,"stem":338,"icon":313},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":340,"path":341,"stem":342,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":344,"path":345,"stem":346,"icon":347},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":349,"path":350,"stem":351,"children":352,"page":29},"Extend","\u002Fextend","5.extend",[353,357,362,367,372,376,380,384,388,393,398],{"title":36,"path":354,"stem":355,"icon":356},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":358,"path":359,"stem":360,"icon":361},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":363,"path":364,"stem":365,"icon":366},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":368,"path":369,"stem":370,"icon":371},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":340,"path":373,"stem":374,"icon":375},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":377,"path":378,"stem":379,"icon":356},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":381,"path":382,"stem":383,"icon":347},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":385,"path":386,"stem":387,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":389,"path":390,"stem":391,"icon":392},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":394,"path":395,"stem":396,"icon":397},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":399,"path":400,"stem":401,"icon":402},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":404,"path":405,"stem":406,"children":407,"page":29},"Reference","\u002Freference","6.reference",[408,413,416,421,425,430],{"title":409,"path":410,"stem":411,"icon":412},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":307,"path":414,"stem":415,"icon":310},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":417,"path":418,"stem":419,"icon":420},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":422,"path":423,"stem":424,"icon":313},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":426,"path":427,"stem":428,"icon":429},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":431,"path":432,"stem":433,"icon":347},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":435,"title":377,"body":436,"description":1886,"extension":1887,"links":1888,"meta":1894,"navigation":1895,"path":378,"seo":1896,"stem":379,"__hash__":1897},"docs\u002F5.extend\u002F4.plugins.md",{"type":437,"value":438,"toc":1878},"minimark",[439,442,455,475,562,567,826,829,1061,1064,1206,1220,1224,1239,1672,1676,1685,1776,1783,1787,1844,1848,1874],[440,441],"lifecycle-flow",{},[443,444,445,449,450,454],"p",{},[446,447,448],"code",{},"definePlugin()"," is the ",[451,452,453],"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).",[443,456,457,458,464,465,470,471,474],{},"When the extension only does one thing, prefer the single-purpose ",[459,460,461],"a",{"href":382},[446,462,463],{},"enricherPlugin()"," \u002F ",[459,466,467],{"href":395},[446,468,469],{},"drainPlugin()"," wrappers. Reach for ",[446,472,473],{},"definePlugin"," when several hooks share state.",[476,477,480,483,554],"prompt",{":actions":478,"description":479,"icon":356},"[\"copy\",\"cursor\",\"windsurf\"]","Build a multi-hook evlog plugin",[443,481,482],{},"Build an evlog plugin that hooks into more than one lifecycle stage.",[484,485,486,520,526,529,543],"ul",{},[487,488,489,490,492,493,496,497,500,501,500,504,500,507,500,510,500,513,500,516,519],"li",{},"Import ",[446,491,473],{}," from ",[446,494,495],{},"evlog"," and pick the hooks I need (",[446,498,499],{},"onRequestStart",", ",[446,502,503],{},"enrich",[446,505,506],{},"drain",[446,508,509],{},"extendLogger",[446,511,512],{},"keep",[446,514,515],{},"onClientLog",[446,517,518],{},"onRequestFinish",")",[487,521,522,523,525],{},"Keep ",[446,524,503],{}," pure (no I\u002FO, no throwing — use try\u002Fcatch internally)",[487,527,528],{},"For drains, batch and ship to the destination; respect backpressure if the sink is slow",[487,530,531,532,535,536,539,540,519],{},"Register the plugin via the framework config: Next\u002Fstandalone ",[446,533,534],{},"initLogger({ plugins: [myPlugin] })",", Hono\u002FExpress\u002FFastify\u002FElysia middleware option ",[446,537,538],{},"{ plugins: [myPlugin] }",". For Nitro, register the individual hooks directly (",[446,541,542],{},"nitroApp.hooks.hook('evlog:enrich' | 'evlog:drain' | …)",[487,544,545,546,464,548,550,551,553],{},"Prefer single-purpose ",[446,547,463],{},[446,549,469],{}," wrappers for simple extensions; use ",[446,552,473],{}," only when several hooks are needed",[443,555,556,557],{},"Docs: ",[459,558,559],{"href":559,"rel":560},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fplugins",[561],"nofollow",[563,564,566],"h2",{"id":565},"minimal-example","Minimal example",[568,569,574],"pre",{"className":570,"code":571,"language":572,"meta":573,"style":573},"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","",[446,575,576,608,615,640,661,686,716,766,772,787,813,818],{"__ignoreMap":573},[577,578,581,585,589,593,596,599,602,605],"span",{"class":579,"line":580},"line",1,[577,582,584],{"class":583},"s7zQu","import",[577,586,588],{"class":587},"sMK4o"," {",[577,590,592],{"class":591},"sTEyZ"," definePlugin",[577,594,595],{"class":587}," }",[577,597,598],{"class":583}," from",[577,600,601],{"class":587}," '",[577,603,495],{"class":604},"sfazB",[577,606,607],{"class":587},"'\n",[577,609,611],{"class":579,"line":610},2,[577,612,614],{"emptyLinePlaceholder":613},true,"\n",[577,616,618,621,625,628,631,634,637],{"class":579,"line":617},3,[577,619,620],{"class":583},"export",[577,622,624],{"class":623},"spNyl"," const",[577,626,627],{"class":591}," tenantPlugin ",[577,629,630],{"class":587},"=",[577,632,592],{"class":633},"s2Zo4",[577,635,636],{"class":591},"(",[577,638,639],{"class":587},"{\n",[577,641,643,647,650,652,655,658],{"class":579,"line":642},4,[577,644,646],{"class":645},"swJcz","  name",[577,648,649],{"class":587},":",[577,651,601],{"class":587},[577,653,654],{"class":604},"tenant",[577,656,657],{"class":587},"'",[577,659,660],{"class":587},",\n",[577,662,664,667,670,674,677,680,683],{"class":579,"line":663},5,[577,665,666],{"class":645},"  onRequestStart",[577,668,669],{"class":587},"({",[577,671,673],{"class":672},"sHdIc"," logger",[577,675,676],{"class":587},",",[577,678,679],{"class":672}," headers",[577,681,682],{"class":587}," })",[577,684,685],{"class":587}," {\n",[577,687,689,692,695,698,700,703,706,708,711,713],{"class":579,"line":688},6,[577,690,691],{"class":623},"    const",[577,693,694],{"class":591}," tenantId",[577,696,697],{"class":587}," =",[577,699,679],{"class":591},[577,701,702],{"class":587},"?.",[577,704,705],{"class":645},"[",[577,707,657],{"class":587},[577,709,710],{"class":604},"x-tenant-id",[577,712,657],{"class":587},[577,714,715],{"class":645},"]\n",[577,717,719,722,725,728,731,734,737,740,742,745,748,750,752,755,757,759,761,763],{"class":579,"line":718},7,[577,720,721],{"class":583},"    if",[577,723,724],{"class":645}," (",[577,726,727],{"class":591},"tenantId",[577,729,730],{"class":645},") ",[577,732,733],{"class":591},"logger",[577,735,736],{"class":587},".",[577,738,739],{"class":633},"set",[577,741,636],{"class":645},[577,743,744],{"class":587},"{",[577,746,747],{"class":645}," tenant",[577,749,649],{"class":587},[577,751,588],{"class":587},[577,753,754],{"class":645}," id",[577,756,649],{"class":587},[577,758,694],{"class":591},[577,760,595],{"class":587},[577,762,595],{"class":587},[577,764,765],{"class":645},")\n",[577,767,769],{"class":579,"line":768},8,[577,770,771],{"class":587},"  },\n",[577,773,775,778,780,783,785],{"class":579,"line":774},9,[577,776,777],{"class":645},"  enrich",[577,779,669],{"class":587},[577,781,782],{"class":672}," event",[577,784,682],{"class":587},[577,786,685],{"class":587},[577,788,790,793,795,798,800,803,805,808,810],{"class":579,"line":789},10,[577,791,792],{"class":591},"    event",[577,794,736],{"class":587},[577,796,797],{"class":591},"region",[577,799,697],{"class":587},[577,801,802],{"class":591}," process",[577,804,736],{"class":587},[577,806,807],{"class":591},"env",[577,809,736],{"class":587},[577,811,812],{"class":591},"REGION\n",[577,814,816],{"class":579,"line":815},11,[577,817,771],{"class":587},[577,819,821,824],{"class":579,"line":820},12,[577,822,823],{"class":587},"}",[577,825,765],{"class":591},[443,827,828],{},"Register the plugin where you bootstrap evlog. The shape depends on your runtime:",[830,831,832,902,980],"code-group",{},[568,833,836],{"className":570,"code":834,"filename":835,"language":572,"meta":573,"style":573},"import { initLogger } from 'evlog'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\ninitLogger({ plugins: [tenantPlugin] })\n","Next.js \u002F standalone",[446,837,838,857,877,881],{"__ignoreMap":573},[577,839,840,842,844,847,849,851,853,855],{"class":579,"line":580},[577,841,584],{"class":583},[577,843,588],{"class":587},[577,845,846],{"class":591}," initLogger",[577,848,595],{"class":587},[577,850,598],{"class":583},[577,852,601],{"class":587},[577,854,495],{"class":604},[577,856,607],{"class":587},[577,858,859,861,863,866,868,870,872,875],{"class":579,"line":610},[577,860,584],{"class":583},[577,862,588],{"class":587},[577,864,865],{"class":591}," tenantPlugin",[577,867,595],{"class":587},[577,869,598],{"class":583},[577,871,601],{"class":587},[577,873,874],{"class":604},".\u002Fplugins\u002Ftenant",[577,876,607],{"class":587},[577,878,879],{"class":579,"line":617},[577,880,614],{"emptyLinePlaceholder":613},[577,882,883,886,888,890,893,895,898,900],{"class":579,"line":642},[577,884,885],{"class":633},"initLogger",[577,887,636],{"class":591},[577,889,744],{"class":587},[577,891,892],{"class":645}," plugins",[577,894,649],{"class":587},[577,896,897],{"class":591}," [tenantPlugin] ",[577,899,823],{"class":587},[577,901,765],{"class":591},[568,903,906],{"className":570,"code":904,"filename":905,"language":572,"meta":573,"style":573},"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",[446,907,908,928,946,950],{"__ignoreMap":573},[577,909,910,912,914,917,919,921,923,926],{"class":579,"line":580},[577,911,584],{"class":583},[577,913,588],{"class":587},[577,915,916],{"class":591}," evlogMiddleware",[577,918,595],{"class":587},[577,920,598],{"class":583},[577,922,601],{"class":587},[577,924,925],{"class":604},"evlog\u002F\u003Cframework>",[577,927,607],{"class":587},[577,929,930,932,934,936,938,940,942,944],{"class":579,"line":610},[577,931,584],{"class":583},[577,933,588],{"class":587},[577,935,865],{"class":591},[577,937,595],{"class":587},[577,939,598],{"class":583},[577,941,601],{"class":587},[577,943,874],{"class":604},[577,945,607],{"class":587},[577,947,948],{"class":579,"line":617},[577,949,614],{"emptyLinePlaceholder":613},[577,951,952,955,957,960,962,965,967,969,971,973,975,977],{"class":579,"line":642},[577,953,954],{"class":591},"app",[577,956,736],{"class":587},[577,958,959],{"class":633},"use",[577,961,636],{"class":591},[577,963,964],{"class":633},"evlogMiddleware",[577,966,636],{"class":591},[577,968,744],{"class":587},[577,970,892],{"class":645},[577,972,649],{"class":587},[577,974,897],{"class":591},[577,976,823],{"class":587},[577,978,979],{"class":591},"))\n",[568,981,983],{"className":570,"code":982,"filename":177,"language":572,"meta":573,"style":573},"\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",[446,984,985,991,1028],{"__ignoreMap":573},[577,986,987],{"class":579,"line":580},[577,988,990],{"class":989},"sHwdD","\u002F\u002F Register the hooks you actually use directly:\n",[577,992,993,996,998,1001,1003,1006,1008,1010,1013,1015,1017,1019,1021,1023,1026],{"class":579,"line":610},[577,994,995],{"class":591},"nitroApp",[577,997,736],{"class":587},[577,999,1000],{"class":591},"hooks",[577,1002,736],{"class":587},[577,1004,1005],{"class":633},"hook",[577,1007,636],{"class":591},[577,1009,657],{"class":587},[577,1011,1012],{"class":604},"evlog:enrich",[577,1014,657],{"class":587},[577,1016,676],{"class":587},[577,1018,865],{"class":591},[577,1020,736],{"class":587},[577,1022,503],{"class":591},[577,1024,1025],{"class":587},"!",[577,1027,765],{"class":591},[577,1029,1030,1032,1034,1036,1038,1040,1042,1044,1047,1049,1051,1053,1055,1057,1059],{"class":579,"line":617},[577,1031,995],{"class":591},[577,1033,736],{"class":587},[577,1035,1000],{"class":591},[577,1037,736],{"class":587},[577,1039,1005],{"class":633},[577,1041,636],{"class":591},[577,1043,657],{"class":587},[577,1045,1046],{"class":604},"evlog:request:start",[577,1048,657],{"class":587},[577,1050,676],{"class":587},[577,1052,865],{"class":591},[577,1054,736],{"class":587},[577,1056,499],{"class":591},[577,1058,1025],{"class":587},[577,1060,765],{"class":591},[563,1062,1063],{"id":1000},"Hooks",[1065,1066,1067,1083],"table",{},[1068,1069,1070],"thead",{},[1071,1072,1073,1077,1080],"tr",{},[1074,1075,1076],"th",{},"Hook",[1074,1078,1079],{},"When",[1074,1081,1082],{},"Use it for",[1084,1085,1086,1103,1118,1131,1151,1164,1177,1190],"tbody",{},[1071,1087,1088,1094,1097],{},[1089,1090,1091],"td",{},[446,1092,1093],{},"setup(ctx)",[1089,1095,1096],{},"Once when registered",[1089,1098,1099,1100,1102],{},"Read ",[446,1101,807],{},", set up shared state",[1071,1104,1105,1110,1113],{},[1089,1106,1107],{},[446,1108,1109],{},"onRequestStart(ctx)",[1089,1111,1112],{},"Each request, before any handler runs",[1089,1114,1115,1116],{},"Pull values from headers into ",[446,1117,733],{},[1071,1119,1120,1125,1128],{},[1089,1121,1122],{},[446,1123,1124],{},"enrich(ctx)",[1089,1126,1127],{},"Every event, before drain",[1089,1129,1130],{},"Add derived fields (geo, deploy id…)",[1071,1132,1133,1138,1141],{},[1089,1134,1135],{},[446,1136,1137],{},"keep(ctx)",[1089,1139,1140],{},"Tail sampling decision",[1089,1142,1143,1144,500,1147,1150],{},"Force-keep based on outcome (",[446,1145,1146],{},"status >= 400",[446,1148,1149],{},"duration > 500",", …)",[1071,1152,1153,1158,1161],{},[1089,1154,1155],{},[446,1156,1157],{},"drain(ctx)",[1089,1159,1160],{},"Every emitted event",[1089,1162,1163],{},"Side-effect: alert, mirror to a queue, etc.",[1071,1165,1166,1171,1174],{},[1089,1167,1168],{},[446,1169,1170],{},"onRequestFinish(ctx)",[1089,1172,1173],{},"After response",[1089,1175,1176],{},"Per-request post-processing",[1071,1178,1179,1184,1187],{},[1089,1180,1181],{},[446,1182,1183],{},"onClientLog(ctx)",[1089,1185,1186],{},"Browser-submitted event hits the ingest endpoint",[1089,1188,1189],{},"Observe \u002F reject client traffic",[1071,1191,1192,1197,1200],{},[1089,1193,1194],{},[446,1195,1196],{},"extendLogger(logger)",[1089,1198,1199],{},"Each request",[1089,1201,1202,1203,519],{},"Add custom methods (e.g. ",[446,1204,1205],{},"logger.audit.refund()",[443,1207,1208,1209,1212,1213,736],{},"Every hook is ",[451,1210,1211],{},"optional",". A plugin can implement any subset. The full type lives in ",[459,1214,1217],{"href":1215,"rel":1216},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[561],[446,1218,1219],{},"packages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[563,1221,1223],{"id":1222},"a-multi-hook-example","A multi-hook example",[443,1225,1226,1227,1230,1231,500,1234,1236,1237,649],{},"Plugins shine when several concerns share state. Here, a single ",[446,1228,1229],{},"request-metrics"," plugin tracks per-request timing through ",[446,1232,1233],{},"setup",[446,1235,499],{},", and ",[446,1238,506],{},[568,1240,1242],{"className":570,"code":1241,"language":572,"meta":573,"style":573},"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",[446,1243,1244,1263,1267,1284,1298,1302,1316,1346,1350,1354,1366,1420,1424,1429,1443,1502,1507,1512,1530,1573,1578,1583,1602,1648,1654,1660,1665],{"__ignoreMap":573},[577,1245,1246,1248,1250,1252,1254,1256,1258,1261],{"class":579,"line":580},[577,1247,584],{"class":583},[577,1249,588],{"class":587},[577,1251,592],{"class":591},[577,1253,595],{"class":587},[577,1255,598],{"class":583},[577,1257,601],{"class":587},[577,1259,1260],{"class":604},"evlog\u002Ftoolkit",[577,1262,607],{"class":587},[577,1264,1265],{"class":579,"line":610},[577,1266,614],{"emptyLinePlaceholder":613},[577,1268,1269,1271,1273,1276,1278,1280,1282],{"class":579,"line":617},[577,1270,620],{"class":583},[577,1272,624],{"class":623},[577,1274,1275],{"class":591}," requestMetricsPlugin ",[577,1277,630],{"class":587},[577,1279,592],{"class":633},[577,1281,636],{"class":591},[577,1283,639],{"class":587},[577,1285,1286,1288,1290,1292,1294,1296],{"class":579,"line":642},[577,1287,646],{"class":645},[577,1289,649],{"class":587},[577,1291,601],{"class":587},[577,1293,1229],{"class":604},[577,1295,657],{"class":587},[577,1297,660],{"class":587},[577,1299,1300],{"class":579,"line":663},[577,1301,614],{"emptyLinePlaceholder":613},[577,1303,1304,1307,1309,1312,1314],{"class":579,"line":688},[577,1305,1306],{"class":645},"  setup",[577,1308,669],{"class":587},[577,1310,1311],{"class":672}," env",[577,1313,682],{"class":587},[577,1315,685],{"class":587},[577,1317,1318,1321,1323,1326,1328,1330,1333,1335,1337,1339,1342,1344],{"class":579,"line":718},[577,1319,1320],{"class":591},"    statsd",[577,1322,736],{"class":587},[577,1324,1325],{"class":633},"init",[577,1327,636],{"class":645},[577,1329,744],{"class":587},[577,1331,1332],{"class":645}," service",[577,1334,649],{"class":587},[577,1336,1311],{"class":591},[577,1338,736],{"class":587},[577,1340,1341],{"class":591},"service",[577,1343,595],{"class":587},[577,1345,765],{"class":645},[577,1347,1348],{"class":579,"line":768},[577,1349,771],{"class":587},[577,1351,1352],{"class":579,"line":774},[577,1353,614],{"emptyLinePlaceholder":613},[577,1355,1356,1358,1360,1362,1364],{"class":579,"line":789},[577,1357,777],{"class":645},[577,1359,669],{"class":587},[577,1361,782],{"class":672},[577,1363,682],{"class":587},[577,1365,685],{"class":587},[577,1367,1368,1370,1372,1375,1377,1379,1381,1384,1387,1389,1391,1393,1396,1400,1403,1405,1408,1410,1413,1415,1418],{"class":579,"line":815},[577,1369,792],{"class":591},[577,1371,736],{"class":587},[577,1373,1374],{"class":591},"tier",[577,1376,697],{"class":587},[577,1378,782],{"class":591},[577,1380,736],{"class":587},[577,1382,1383],{"class":591},"duration",[577,1385,1386],{"class":587}," &&",[577,1388,782],{"class":591},[577,1390,736],{"class":587},[577,1392,1383],{"class":591},[577,1394,1395],{"class":587}," >",[577,1397,1399],{"class":1398},"sbssI"," 1000",[577,1401,1402],{"class":587}," ?",[577,1404,601],{"class":587},[577,1406,1407],{"class":604},"slow",[577,1409,657],{"class":587},[577,1411,1412],{"class":587}," :",[577,1414,601],{"class":587},[577,1416,1417],{"class":604},"fast",[577,1419,607],{"class":587},[577,1421,1422],{"class":579,"line":820},[577,1423,771],{"class":587},[577,1425,1427],{"class":579,"line":1426},13,[577,1428,614],{"emptyLinePlaceholder":613},[577,1430,1432,1435,1437,1439,1441],{"class":579,"line":1431},14,[577,1433,1434],{"class":645},"  drain",[577,1436,669],{"class":587},[577,1438,782],{"class":672},[577,1440,682],{"class":587},[577,1442,685],{"class":587},[577,1444,1446,1448,1450,1453,1455,1457,1460,1462,1464,1466,1468,1470,1473,1477,1479,1481,1484,1486,1488,1490,1493,1495,1498,1500],{"class":579,"line":1445},15,[577,1447,1320],{"class":591},[577,1449,736],{"class":587},[577,1451,1452],{"class":633},"timing",[577,1454,636],{"class":645},[577,1456,657],{"class":587},[577,1458,1459],{"class":604},"http.request",[577,1461,657],{"class":587},[577,1463,676],{"class":587},[577,1465,782],{"class":591},[577,1467,736],{"class":587},[577,1469,1383],{"class":591},[577,1471,1472],{"class":583}," as",[577,1474,1476],{"class":1475},"sBMFI"," number",[577,1478,676],{"class":587},[577,1480,588],{"class":587},[577,1482,1483],{"class":645}," path",[577,1485,649],{"class":587},[577,1487,782],{"class":591},[577,1489,736],{"class":587},[577,1491,1492],{"class":591},"path",[577,1494,1472],{"class":583},[577,1496,1497],{"class":1475}," string",[577,1499,595],{"class":587},[577,1501,765],{"class":645},[577,1503,1505],{"class":579,"line":1504},16,[577,1506,771],{"class":587},[577,1508,1510],{"class":579,"line":1509},17,[577,1511,614],{"emptyLinePlaceholder":613},[577,1513,1515,1517,1519,1521,1523,1526,1528],{"class":579,"line":1514},18,[577,1516,666],{"class":645},[577,1518,669],{"class":587},[577,1520,673],{"class":672},[577,1522,676],{"class":587},[577,1524,1525],{"class":672}," request",[577,1527,682],{"class":587},[577,1529,685],{"class":587},[577,1531,1533,1536,1538,1540,1542,1544,1547,1549,1551,1554,1556,1559,1561,1564,1567,1569,1571],{"class":579,"line":1532},19,[577,1534,1535],{"class":591},"    logger",[577,1537,736],{"class":587},[577,1539,739],{"class":633},[577,1541,636],{"class":645},[577,1543,744],{"class":587},[577,1545,1546],{"class":645}," trace",[577,1548,649],{"class":587},[577,1550,588],{"class":587},[577,1552,1553],{"class":645}," startedAt",[577,1555,649],{"class":587},[577,1557,1558],{"class":591}," Date",[577,1560,736],{"class":587},[577,1562,1563],{"class":633},"now",[577,1565,1566],{"class":645},"() ",[577,1568,823],{"class":587},[577,1570,595],{"class":587},[577,1572,765],{"class":645},[577,1574,1576],{"class":579,"line":1575},20,[577,1577,771],{"class":587},[577,1579,1581],{"class":579,"line":1580},21,[577,1582,614],{"emptyLinePlaceholder":613},[577,1584,1586,1589,1591,1593,1595,1598,1600],{"class":579,"line":1585},22,[577,1587,1588],{"class":645},"  onRequestFinish",[577,1590,669],{"class":587},[577,1592,782],{"class":672},[577,1594,676],{"class":587},[577,1596,1597],{"class":672}," durationMs",[577,1599,682],{"class":587},[577,1601,685],{"class":587},[577,1603,1605,1607,1609,1612,1614,1616,1618,1620,1623,1626,1628,1631,1633,1636,1638,1640,1643,1646],{"class":579,"line":1604},23,[577,1606,721],{"class":583},[577,1608,724],{"class":645},[577,1610,1611],{"class":591},"event",[577,1613,1386],{"class":587},[577,1615,724],{"class":645},[577,1617,1611],{"class":591},[577,1619,736],{"class":587},[577,1621,1622],{"class":591},"level",[577,1624,1625],{"class":587}," ===",[577,1627,601],{"class":587},[577,1629,1630],{"class":604},"error",[577,1632,657],{"class":587},[577,1634,1635],{"class":587}," ||",[577,1637,1597],{"class":591},[577,1639,1395],{"class":587},[577,1641,1642],{"class":1398}," 5000",[577,1644,1645],{"class":645},")) ",[577,1647,639],{"class":587},[577,1649,1651],{"class":579,"line":1650},24,[577,1652,1653],{"class":989},"      \u002F\u002F alert \u002F forward \u002F etc.\n",[577,1655,1657],{"class":579,"line":1656},25,[577,1658,1659],{"class":587},"    }\n",[577,1661,1663],{"class":579,"line":1662},26,[577,1664,771],{"class":587},[577,1666,1668,1670],{"class":579,"line":1667},27,[577,1669,823],{"class":587},[577,1671,765],{"class":591},[563,1673,1675],{"id":1674},"sugar-plugins","Sugar plugins",[443,1677,1678,1679,1681,1682,1684],{},"For single-hook extensions, the toolkit offers ",[446,1680,469],{}," and ",[446,1683,463],{}," wrappers:",[568,1686,1690],{"className":1687,"code":1688,"language":1689,"meta":573,"style":573},"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",[446,1691,1692,1716,1720,1749],{"__ignoreMap":573},[577,1693,1694,1696,1698,1701,1703,1706,1708,1710,1712,1714],{"class":579,"line":580},[577,1695,584],{"class":583},[577,1697,588],{"class":587},[577,1699,1700],{"class":591}," drainPlugin",[577,1702,676],{"class":587},[577,1704,1705],{"class":591}," enricherPlugin",[577,1707,595],{"class":587},[577,1709,598],{"class":583},[577,1711,601],{"class":587},[577,1713,1260],{"class":604},[577,1715,607],{"class":587},[577,1717,1718],{"class":579,"line":610},[577,1719,614],{"emptyLinePlaceholder":613},[577,1721,1722,1725,1728,1730,1732,1734,1736,1739,1741,1743,1746],{"class":579,"line":617},[577,1723,1724],{"class":623},"const",[577,1726,1727],{"class":591}," drainOnly ",[577,1729,630],{"class":587},[577,1731,1700],{"class":633},[577,1733,636],{"class":591},[577,1735,657],{"class":587},[577,1737,1738],{"class":604},"axiom",[577,1740,657],{"class":587},[577,1742,676],{"class":587},[577,1744,1745],{"class":633}," createAxiomDrain",[577,1747,1748],{"class":591},"())\n",[577,1750,1751,1753,1756,1758,1760,1762,1764,1767,1769,1771,1774],{"class":579,"line":642},[577,1752,1724],{"class":623},[577,1754,1755],{"class":591}," enricherOnly ",[577,1757,630],{"class":587},[577,1759,1705],{"class":633},[577,1761,636],{"class":591},[577,1763,657],{"class":587},[577,1765,1766],{"class":604},"user-agent",[577,1768,657],{"class":587},[577,1770,676],{"class":587},[577,1772,1773],{"class":633}," createUserAgentEnricher",[577,1775,1748],{"class":591},[443,1777,1778,1779,1782],{},"These are equivalent to a ",[446,1780,1781],{},"definePlugin({ name, drain | enrich })"," shape but read more clearly when intent is obvious.",[563,1784,1786],{"id":1785},"common-pitfalls","Common pitfalls",[484,1788,1789,1798,1809,1832],{},[487,1790,1791,1794,1795,1797],{},[451,1792,1793],{},"Don't throw from a hook."," The plugin runner catches and logs errors with the plugin name, but a thrown error from ",[446,1796,503],{}," won't propagate the event downstream. Keep hooks defensive.",[487,1799,1800,1805,1806,1808],{},[451,1801,1802,1804],{},[446,1803,506],{}," runs for every event"," — not just per-request. If you only care about per-request lifecycle, use ",[446,1807,518],{}," instead.",[487,1810,1811,1816,1817,1820,1821,1824,1825,1828,1829,736],{},[451,1812,1813,1815],{},[446,1814,509],{}," mutates the logger object"," — augment ",[446,1818,1819],{},"RequestLogger"," in a ",[446,1822,1823],{},".d.ts"," so ",[446,1826,1827],{},"useLogger(event)"," exposes the new methods to TypeScript. See ",[459,1830,1831],{"href":72},"typed fields",[487,1833,1834,1840,1841,1843],{},[451,1835,1836,1837],{},"Plugins are de-duplicated by ",[446,1838,1839],{},"name",". Re-registering with the same ",[446,1842,1839],{}," replaces the previous version (last registration wins).",[563,1845,1847],{"id":1846},"next-steps","Next steps",[484,1849,1850,1856,1862,1868],{},[487,1851,1852,1855],{},[459,1853,1854],{"href":382},"Custom Enrichers"," — single-hook enrichment",[487,1857,1858,1861],{},[459,1859,1860],{"href":395},"Custom Drains"," — single-destination output",[487,1863,1864,1867],{},[459,1865,1866],{"href":386},"Tail Sampling"," — outcome-aware keep decisions",[487,1869,1870,1873],{},[459,1871,1872],{"href":390},"Identity Headers"," — tag every drain request",[1875,1876,1877],"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":573,"searchDepth":610,"depth":610,"links":1879},[1880,1881,1882,1883,1884,1885],{"id":565,"depth":610,"text":566},{"id":1000,"depth":610,"text":1063},{"id":1222,"depth":610,"text":1223},{"id":1674,"depth":610,"text":1675},{"id":1785,"depth":610,"text":1786},{"id":1846,"depth":610,"text":1847},"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",[1889,1892,1893],{"label":1854,"icon":347,"to":382,"color":1890,"variant":1891},"neutral","subtle",{"label":1860,"icon":397,"to":395,"color":1890,"variant":1891},{"label":1866,"icon":64,"to":386,"color":1890,"variant":1891},{},{"title":377,"icon":356},{"title":377,"description":1886},"V3Y6XFn7kEOgKHMLccUovjvoyQKjlGwzZq4KTU0kfxo",[1899,1901],{"title":340,"path":373,"stem":374,"description":1900,"icon":375,"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":381,"path":382,"stem":383,"description":1902,"icon":347,"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.",1778444364386]