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