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