[{"data":1,"prerenderedAt":3079},["ShallowReactive",2],{"navigation_docs":3,"-extend-plugins":612,"-extend-plugins-surround":3074},[4,35,85,148,328,489,548,587],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"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",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133,138,143],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"logs","\u002Fcli\u002Flogs","3.cli\u002F10.logs","i-lucide-scroll-text",{"title":104,"path":105,"stem":106,"icon":107},"config","\u002Fcli\u002Fconfig","3.cli\u002F11.config","i-lucide-settings-2",{"title":109,"path":110,"stem":111,"icon":112},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":114,"path":115,"stem":116,"icon":117},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":119,"path":120,"stem":121,"icon":122},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":124,"path":125,"stem":126,"icon":127},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":129,"path":130,"stem":131,"icon":132},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":134,"path":135,"stem":136,"icon":137},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":139,"path":140,"stem":141,"icon":142},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":144,"path":145,"stem":146,"icon":147},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":149,"path":150,"stem":151,"children":152,"page":34},"Integrate","\u002Fintegrate","4.integrate",[153,157,240],{"title":41,"path":154,"stem":155,"icon":156},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":158,"path":159,"stem":160,"children":161,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[162,165,195,220],{"title":41,"path":163,"stem":164,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":166,"path":167,"stem":168,"children":169,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[170,175,180,185,190],{"title":171,"path":172,"stem":173,"icon":174},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":176,"path":177,"stem":178,"icon":179},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":181,"path":182,"stem":183,"icon":184},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":186,"path":187,"stem":188,"icon":189},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":191,"path":192,"stem":193,"icon":194},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":196,"path":197,"stem":198,"children":199,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[200,205,210,215],{"title":201,"path":202,"stem":203,"icon":204},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":206,"path":207,"stem":208,"icon":209},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":211,"path":212,"stem":213,"icon":214},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":216,"path":217,"stem":218,"icon":219},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":221,"path":222,"stem":223,"children":224,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[225,230,235],{"title":226,"path":227,"stem":228,"icon":229},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":231,"path":232,"stem":233,"icon":234},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":236,"path":237,"stem":238,"icon":239},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":241,"path":242,"stem":243,"children":244,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[245,249,254,259,264,269,274,279,284,289,294,299,304,309,313,318,323],{"title":41,"path":246,"stem":247,"icon":248},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":250,"path":251,"stem":252,"icon":253},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":255,"path":256,"stem":257,"icon":258},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":260,"path":261,"stem":262,"icon":263},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":265,"path":266,"stem":267,"icon":268},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":270,"path":271,"stem":272,"icon":273},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":275,"path":276,"stem":277,"icon":278},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":280,"path":281,"stem":282,"icon":283},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":285,"path":286,"stem":287,"icon":288},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":290,"path":291,"stem":292,"icon":293},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":295,"path":296,"stem":297,"icon":298},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":300,"path":301,"stem":302,"icon":303},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":305,"path":306,"stem":307,"icon":308},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":310,"path":311,"stem":312,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":314,"path":315,"stem":316,"icon":317},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":319,"path":320,"stem":321,"icon":322},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":324,"path":325,"stem":326,"icon":327},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":329,"path":330,"stem":331,"children":332,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[333,336,341,369,396,428,449,454,459,463],{"title":41,"path":334,"stem":335,"icon":117},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":337,"path":338,"stem":339,"icon":340},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":342,"icon":343,"path":344,"stem":345,"children":346,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[347,350,355,360,365],{"title":41,"path":348,"stem":349,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":351,"path":352,"stem":353,"icon":354},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":356,"path":357,"stem":358,"icon":359},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":361,"path":362,"stem":363,"icon":364},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":366,"path":367,"stem":368,"icon":147},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":370,"icon":371,"path":372,"stem":373,"children":374,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[375,378,383,388,392],{"title":41,"path":376,"stem":377,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":379,"path":380,"stem":381,"icon":382},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":384,"path":385,"stem":386,"icon":387},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":389,"path":390,"stem":391,"icon":340},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":393,"path":394,"stem":395,"icon":122},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":397,"icon":398,"path":399,"stem":400,"children":401,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[402,405,410,415,420,424],{"title":41,"path":403,"stem":404,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":406,"path":407,"stem":408,"icon":409},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":411,"path":412,"stem":413,"icon":414},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":416,"path":417,"stem":418,"icon":419},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":421,"path":422,"stem":423,"icon":398},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":425,"path":426,"stem":427,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":366,"icon":122,"path":429,"stem":430,"children":431,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[432,435,440,445],{"title":41,"path":433,"stem":434,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":436,"path":437,"stem":438,"icon":439},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":441,"path":442,"stem":443,"icon":444},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":446,"path":447,"stem":448,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":450,"path":451,"stem":452,"icon":453},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":455,"path":456,"stem":457,"icon":458},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":460,"path":461,"stem":462,"icon":444},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":464,"icon":465,"path":466,"stem":467,"children":468,"page":34},"Signals","i-lucide-scan-search","\u002Fuse-cases\u002Fsignals","5.use-cases\u002F7.signals",[469,472,477,482,485],{"title":41,"path":470,"stem":471,"icon":44},"\u002Fuse-cases\u002Fsignals\u002Foverview","5.use-cases\u002F7.signals\u002F01.overview",{"title":473,"path":474,"stem":475,"icon":476},"What You Can Ask","\u002Fuse-cases\u002Fsignals\u002Fask","5.use-cases\u002F7.signals\u002F02.ask","i-lucide-message-circle-question",{"title":478,"path":479,"stem":480,"icon":481},"What It Costs","\u002Fuse-cases\u002Fsignals\u002Fcost","5.use-cases\u002F7.signals\u002F03.cost","i-lucide-coins",{"title":446,"path":483,"stem":484,"icon":84},"\u002Fuse-cases\u002Fsignals\u002Freference","5.use-cases\u002F7.signals\u002F04.reference",{"title":425,"path":486,"stem":487,"icon":488},"\u002Fuse-cases\u002Fsignals\u002Frecipes","5.use-cases\u002F7.signals\u002F05.recipes","i-lucide-lightbulb",{"title":490,"path":491,"stem":492,"children":493,"page":34},"Extend","\u002Fextend","6.extend",[494,498,503,508,512,517,521,525,529,533,538,543],{"title":41,"path":495,"stem":496,"icon":497},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":499,"path":500,"stem":501,"icon":502},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":504,"path":505,"stem":506,"icon":507},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":509,"path":510,"stem":511,"icon":502},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":513,"path":514,"stem":515,"icon":516},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":425,"path":518,"stem":519,"icon":520},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":522,"path":523,"stem":524,"icon":497},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":526,"path":527,"stem":528,"icon":453},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":530,"path":531,"stem":532,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":534,"path":535,"stem":536,"icon":537},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":539,"path":540,"stem":541,"icon":542},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":544,"path":545,"stem":546,"icon":547},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":446,"path":549,"stem":550,"children":551,"page":34},"\u002Freference","7.reference",[552,556,561,564,569,573,578,582],{"title":41,"path":553,"stem":554,"icon":555},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":557,"path":558,"stem":559,"icon":560},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":393,"path":562,"stem":563,"icon":122},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":565,"path":566,"stem":567,"icon":568},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":570,"path":571,"stem":572,"icon":398},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":574,"path":575,"stem":576,"icon":577},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":579,"path":580,"stem":581,"icon":453},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":583,"path":584,"stem":585,"icon":586},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":588,"path":589,"stem":590,"children":591,"page":34},"Compare","\u002Fcompare","8.compare",[592,596,600,604,608],{"title":593,"path":594,"stem":595,"icon":577},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":597,"path":598,"stem":599,"icon":214},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":601,"path":602,"stem":603,"icon":577},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":605,"path":606,"stem":607,"icon":577},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":609,"path":610,"stem":611,"icon":577},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":613,"title":522,"body":614,"description":3062,"extension":3063,"links":3064,"meta":3070,"navigation":3071,"path":523,"seo":3072,"stem":524,"__hash__":3073},"docs\u002F6.extend\u002F4.plugins.md",{"type":615,"value":616,"toc":3054},"minimark",[617,620,633,653,740,745,1004,1007,2207,2210,2352,2366,2370,2385,2849,2853,2862,2952,2959,2963,3020,3024,3050],[618,619],"lifecycle-flow",{},[621,622,623,627,628,632],"p",{},[624,625,626],"code",{},"definePlugin()"," is the ",[629,630,631],"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).",[621,634,635,636,642,643,648,649,652],{},"When the extension only does one thing, prefer the single-purpose ",[637,638,639],"a",{"href":527},[624,640,641],{},"enricherPlugin()"," \u002F ",[637,644,645],{"href":540},[624,646,647],{},"drainPlugin()"," wrappers. Reach for ",[624,650,651],{},"definePlugin"," when several hooks share state.",[654,655,658,661,732],"prompt",{":actions":656,"description":657,"icon":497},"[\"copy\",\"cursor\",\"claude\"]","Build a multi-hook evlog plugin",[621,659,660],{},"Build an evlog plugin that hooks into more than one lifecycle stage.",[662,663,664,698,704,707,721],"ul",{},[665,666,667,668,670,671,674,675,678,679,678,682,678,685,678,688,678,691,678,694,697],"li",{},"Import ",[624,669,651],{}," from ",[624,672,673],{},"evlog"," and pick the hooks I need (",[624,676,677],{},"onRequestStart",", ",[624,680,681],{},"enrich",[624,683,684],{},"drain",[624,686,687],{},"extendLogger",[624,689,690],{},"keep",[624,692,693],{},"onClientLog",[624,695,696],{},"onRequestFinish",")",[665,699,700,701,703],{},"Keep ",[624,702,681],{}," pure (no I\u002FO, no throwing, use try\u002Fcatch internally)",[665,705,706],{},"For drains, batch and ship to the destination; respect backpressure if the drain is slow",[665,708,709,710,713,714,717,718,697],{},"Register the plugin via the framework config: Next\u002Fstandalone ",[624,711,712],{},"initLogger({ plugins: [myPlugin] })",", Hono\u002FExpress\u002FFastify\u002FElysia middleware option ",[624,715,716],{},"{ plugins: [myPlugin] }",". For Nitro, register the individual hooks directly (",[624,719,720],{},"nitroApp.hooks.hook('evlog:enrich' | 'evlog:drain' | …)",[665,722,723,724,642,726,728,729,731],{},"Prefer single-purpose ",[624,725,641],{},[624,727,647],{}," wrappers for simple extensions; use ",[624,730,651],{}," only when several hooks are needed",[621,733,734,735],{},"Docs: ",[637,736,737],{"href":737,"rel":738},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fplugins",[739],"nofollow",[741,742,744],"h2",{"id":743},"minimal-example","Minimal example",[746,747,752],"pre",{"className":748,"code":749,"language":750,"meta":751,"style":751},"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","",[624,753,754,786,793,818,839,864,894,944,950,965,991,996],{"__ignoreMap":751},[755,756,759,763,767,771,774,777,780,783],"span",{"class":757,"line":758},"line",1,[755,760,762],{"class":761},"s7zQu","import",[755,764,766],{"class":765},"sMK4o"," {",[755,768,770],{"class":769},"sTEyZ"," definePlugin",[755,772,773],{"class":765}," }",[755,775,776],{"class":761}," from",[755,778,779],{"class":765}," '",[755,781,673],{"class":782},"sfazB",[755,784,785],{"class":765},"'\n",[755,787,789],{"class":757,"line":788},2,[755,790,792],{"emptyLinePlaceholder":791},true,"\n",[755,794,796,799,803,806,809,812,815],{"class":757,"line":795},3,[755,797,798],{"class":761},"export",[755,800,802],{"class":801},"spNyl"," const",[755,804,805],{"class":769}," tenantPlugin ",[755,807,808],{"class":765},"=",[755,810,770],{"class":811},"s2Zo4",[755,813,814],{"class":769},"(",[755,816,817],{"class":765},"{\n",[755,819,821,825,828,830,833,836],{"class":757,"line":820},4,[755,822,824],{"class":823},"swJcz","  name",[755,826,827],{"class":765},":",[755,829,779],{"class":765},[755,831,832],{"class":782},"tenant",[755,834,835],{"class":765},"'",[755,837,838],{"class":765},",\n",[755,840,842,845,848,852,855,858,861],{"class":757,"line":841},5,[755,843,844],{"class":823},"  onRequestStart",[755,846,847],{"class":765},"({",[755,849,851],{"class":850},"sHdIc"," logger",[755,853,854],{"class":765},",",[755,856,857],{"class":850}," headers",[755,859,860],{"class":765}," })",[755,862,863],{"class":765}," {\n",[755,865,867,870,873,876,878,881,884,886,889,891],{"class":757,"line":866},6,[755,868,869],{"class":801},"    const",[755,871,872],{"class":769}," tenantId",[755,874,875],{"class":765}," =",[755,877,857],{"class":769},[755,879,880],{"class":765},"?.",[755,882,883],{"class":823},"[",[755,885,835],{"class":765},[755,887,888],{"class":782},"x-tenant-id",[755,890,835],{"class":765},[755,892,893],{"class":823},"]\n",[755,895,897,900,903,906,909,912,915,918,920,923,926,928,930,933,935,937,939,941],{"class":757,"line":896},7,[755,898,899],{"class":761},"    if",[755,901,902],{"class":823}," (",[755,904,905],{"class":769},"tenantId",[755,907,908],{"class":823},") ",[755,910,911],{"class":769},"logger",[755,913,914],{"class":765},".",[755,916,917],{"class":811},"set",[755,919,814],{"class":823},[755,921,922],{"class":765},"{",[755,924,925],{"class":823}," tenant",[755,927,827],{"class":765},[755,929,766],{"class":765},[755,931,932],{"class":823}," id",[755,934,827],{"class":765},[755,936,872],{"class":769},[755,938,773],{"class":765},[755,940,773],{"class":765},[755,942,943],{"class":823},")\n",[755,945,947],{"class":757,"line":946},8,[755,948,949],{"class":765},"  },\n",[755,951,953,956,958,961,963],{"class":757,"line":952},9,[755,954,955],{"class":823},"  enrich",[755,957,847],{"class":765},[755,959,960],{"class":850}," event",[755,962,860],{"class":765},[755,964,863],{"class":765},[755,966,968,971,973,976,978,981,983,986,988],{"class":757,"line":967},10,[755,969,970],{"class":769},"    event",[755,972,914],{"class":765},[755,974,975],{"class":769},"region",[755,977,875],{"class":765},[755,979,980],{"class":769}," process",[755,982,914],{"class":765},[755,984,985],{"class":769},"env",[755,987,914],{"class":765},[755,989,990],{"class":769},"REGION\n",[755,992,994],{"class":757,"line":993},11,[755,995,949],{"class":765},[755,997,999,1002],{"class":757,"line":998},12,[755,1000,1001],{"class":765},"}",[755,1003,943],{"class":769},[621,1005,1006],{},"Register the plugin where you bootstrap evlog. The shape depends on your runtime:",[1008,1009,1010,1107,1211,1329,1415,1517,1618,1694,1766,1842,1914,1986,2070,2142],"framework-tabs",{},[746,1011,1014],{"className":748,"code":1012,"filename":250,"language":750,"meta":1013,"style":751},"import { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:enrich', tenantPlugin.enrich!)\n})\n","server\u002Fplugins\u002Fevlog.ts",[624,1015,1016,1036,1040,1064,1101],{"__ignoreMap":751},[755,1017,1018,1020,1022,1025,1027,1029,1031,1034],{"class":757,"line":758},[755,1019,762],{"class":761},[755,1021,766],{"class":765},[755,1023,1024],{"class":769}," tenantPlugin",[755,1026,773],{"class":765},[755,1028,776],{"class":761},[755,1030,779],{"class":765},[755,1032,1033],{"class":782},".\u002Fplugins\u002Ftenant",[755,1035,785],{"class":765},[755,1037,1038],{"class":757,"line":788},[755,1039,792],{"emptyLinePlaceholder":791},[755,1041,1042,1044,1047,1050,1052,1054,1057,1059,1062],{"class":757,"line":795},[755,1043,798],{"class":761},[755,1045,1046],{"class":761}," default",[755,1048,1049],{"class":811}," defineNitroPlugin",[755,1051,814],{"class":769},[755,1053,814],{"class":765},[755,1055,1056],{"class":850},"nitroApp",[755,1058,697],{"class":765},[755,1060,1061],{"class":801}," =>",[755,1063,863],{"class":765},[755,1065,1066,1069,1071,1074,1076,1079,1081,1083,1086,1088,1090,1092,1094,1096,1099],{"class":757,"line":820},[755,1067,1068],{"class":769},"  nitroApp",[755,1070,914],{"class":765},[755,1072,1073],{"class":769},"hooks",[755,1075,914],{"class":765},[755,1077,1078],{"class":811},"hook",[755,1080,814],{"class":823},[755,1082,835],{"class":765},[755,1084,1085],{"class":782},"evlog:enrich",[755,1087,835],{"class":765},[755,1089,854],{"class":765},[755,1091,1024],{"class":769},[755,1093,914],{"class":765},[755,1095,681],{"class":769},[755,1097,1098],{"class":765},"!",[755,1100,943],{"class":823},[755,1102,1103,1105],{"class":757,"line":841},[755,1104,1001],{"class":765},[755,1106,943],{"class":769},[746,1108,1110],{"className":748,"code":1109,"filename":265,"language":750,"meta":1013,"style":751},"import { definePlugin } from 'nitro'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nexport default definePlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:enrich', tenantPlugin.enrich!)\n})\n",[624,1111,1112,1131,1149,1153,1173,1205],{"__ignoreMap":751},[755,1113,1114,1116,1118,1120,1122,1124,1126,1129],{"class":757,"line":758},[755,1115,762],{"class":761},[755,1117,766],{"class":765},[755,1119,770],{"class":769},[755,1121,773],{"class":765},[755,1123,776],{"class":761},[755,1125,779],{"class":765},[755,1127,1128],{"class":782},"nitro",[755,1130,785],{"class":765},[755,1132,1133,1135,1137,1139,1141,1143,1145,1147],{"class":757,"line":788},[755,1134,762],{"class":761},[755,1136,766],{"class":765},[755,1138,1024],{"class":769},[755,1140,773],{"class":765},[755,1142,776],{"class":761},[755,1144,779],{"class":765},[755,1146,1033],{"class":782},[755,1148,785],{"class":765},[755,1150,1151],{"class":757,"line":795},[755,1152,792],{"emptyLinePlaceholder":791},[755,1154,1155,1157,1159,1161,1163,1165,1167,1169,1171],{"class":757,"line":820},[755,1156,798],{"class":761},[755,1158,1046],{"class":761},[755,1160,770],{"class":811},[755,1162,814],{"class":769},[755,1164,814],{"class":765},[755,1166,1056],{"class":850},[755,1168,697],{"class":765},[755,1170,1061],{"class":801},[755,1172,863],{"class":765},[755,1174,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203],{"class":757,"line":841},[755,1176,1068],{"class":769},[755,1178,914],{"class":765},[755,1180,1073],{"class":769},[755,1182,914],{"class":765},[755,1184,1078],{"class":811},[755,1186,814],{"class":823},[755,1188,835],{"class":765},[755,1190,1085],{"class":782},[755,1192,835],{"class":765},[755,1194,854],{"class":765},[755,1196,1024],{"class":769},[755,1198,914],{"class":765},[755,1200,681],{"class":769},[755,1202,1098],{"class":765},[755,1204,943],{"class":823},[755,1206,1207,1209],{"class":757,"line":866},[755,1208,1001],{"class":765},[755,1210,943],{"class":769},[746,1212,1215],{"className":748,"code":1213,"filename":255,"language":750,"meta":1214,"style":751},"import { createEvlog } from 'evlog\u002Fnext'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  plugins: [tenantPlugin],\n})\n","lib\u002Fevlog.ts",[624,1216,1217,1237,1255,1259,1295,1311,1323],{"__ignoreMap":751},[755,1218,1219,1221,1223,1226,1228,1230,1232,1235],{"class":757,"line":758},[755,1220,762],{"class":761},[755,1222,766],{"class":765},[755,1224,1225],{"class":769}," createEvlog",[755,1227,773],{"class":765},[755,1229,776],{"class":761},[755,1231,779],{"class":765},[755,1233,1234],{"class":782},"evlog\u002Fnext",[755,1236,785],{"class":765},[755,1238,1239,1241,1243,1245,1247,1249,1251,1253],{"class":757,"line":788},[755,1240,762],{"class":761},[755,1242,766],{"class":765},[755,1244,1024],{"class":769},[755,1246,773],{"class":765},[755,1248,776],{"class":761},[755,1250,779],{"class":765},[755,1252,1033],{"class":782},[755,1254,785],{"class":765},[755,1256,1257],{"class":757,"line":795},[755,1258,792],{"emptyLinePlaceholder":791},[755,1260,1261,1263,1265,1267,1270,1272,1275,1277,1280,1282,1285,1287,1289,1291,1293],{"class":757,"line":820},[755,1262,798],{"class":761},[755,1264,802],{"class":801},[755,1266,766],{"class":765},[755,1268,1269],{"class":769}," withEvlog",[755,1271,854],{"class":765},[755,1273,1274],{"class":769}," useLogger",[755,1276,854],{"class":765},[755,1278,1279],{"class":769}," log",[755,1281,854],{"class":765},[755,1283,1284],{"class":769}," createError ",[755,1286,1001],{"class":765},[755,1288,875],{"class":765},[755,1290,1225],{"class":811},[755,1292,814],{"class":769},[755,1294,817],{"class":765},[755,1296,1297,1300,1302,1304,1307,1309],{"class":757,"line":841},[755,1298,1299],{"class":823},"  service",[755,1301,827],{"class":765},[755,1303,779],{"class":765},[755,1305,1306],{"class":782},"my-app",[755,1308,835],{"class":765},[755,1310,838],{"class":765},[755,1312,1313,1316,1318,1321],{"class":757,"line":866},[755,1314,1315],{"class":823},"  plugins",[755,1317,827],{"class":765},[755,1319,1320],{"class":769}," [tenantPlugin]",[755,1322,838],{"class":765},[755,1324,1325,1327],{"class":757,"line":896},[755,1326,1001],{"class":765},[755,1328,943],{"class":769},[746,1330,1333],{"className":748,"code":1331,"filename":260,"language":750,"meta":1332,"style":751},"import { createEvlogHooks } from 'evlog\u002Fsveltekit'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nexport const { handle, handleError } = createEvlogHooks({ plugins: [tenantPlugin] })\n","src\u002Fhooks.server.ts",[624,1334,1335,1355,1373,1377],{"__ignoreMap":751},[755,1336,1337,1339,1341,1344,1346,1348,1350,1353],{"class":757,"line":758},[755,1338,762],{"class":761},[755,1340,766],{"class":765},[755,1342,1343],{"class":769}," createEvlogHooks",[755,1345,773],{"class":765},[755,1347,776],{"class":761},[755,1349,779],{"class":765},[755,1351,1352],{"class":782},"evlog\u002Fsveltekit",[755,1354,785],{"class":765},[755,1356,1357,1359,1361,1363,1365,1367,1369,1371],{"class":757,"line":788},[755,1358,762],{"class":761},[755,1360,766],{"class":765},[755,1362,1024],{"class":769},[755,1364,773],{"class":765},[755,1366,776],{"class":761},[755,1368,779],{"class":765},[755,1370,1033],{"class":782},[755,1372,785],{"class":765},[755,1374,1375],{"class":757,"line":795},[755,1376,792],{"emptyLinePlaceholder":791},[755,1378,1379,1381,1383,1385,1388,1390,1393,1395,1397,1399,1401,1403,1406,1408,1411,1413],{"class":757,"line":820},[755,1380,798],{"class":761},[755,1382,802],{"class":801},[755,1384,766],{"class":765},[755,1386,1387],{"class":769}," handle",[755,1389,854],{"class":765},[755,1391,1392],{"class":769}," handleError ",[755,1394,1001],{"class":765},[755,1396,875],{"class":765},[755,1398,1343],{"class":811},[755,1400,814],{"class":769},[755,1402,922],{"class":765},[755,1404,1405],{"class":823}," plugins",[755,1407,827],{"class":765},[755,1409,1410],{"class":769}," [tenantPlugin] ",[755,1412,1001],{"class":765},[755,1414,943],{"class":769},[746,1416,1417],{"className":748,"code":1109,"filename":270,"language":750,"meta":1013,"style":751},[624,1418,1419,1437,1455,1459,1479,1511],{"__ignoreMap":751},[755,1420,1421,1423,1425,1427,1429,1431,1433,1435],{"class":757,"line":758},[755,1422,762],{"class":761},[755,1424,766],{"class":765},[755,1426,770],{"class":769},[755,1428,773],{"class":765},[755,1430,776],{"class":761},[755,1432,779],{"class":765},[755,1434,1128],{"class":782},[755,1436,785],{"class":765},[755,1438,1439,1441,1443,1445,1447,1449,1451,1453],{"class":757,"line":788},[755,1440,762],{"class":761},[755,1442,766],{"class":765},[755,1444,1024],{"class":769},[755,1446,773],{"class":765},[755,1448,776],{"class":761},[755,1450,779],{"class":765},[755,1452,1033],{"class":782},[755,1454,785],{"class":765},[755,1456,1457],{"class":757,"line":795},[755,1458,792],{"emptyLinePlaceholder":791},[755,1460,1461,1463,1465,1467,1469,1471,1473,1475,1477],{"class":757,"line":820},[755,1462,798],{"class":761},[755,1464,1046],{"class":761},[755,1466,770],{"class":811},[755,1468,814],{"class":769},[755,1470,814],{"class":765},[755,1472,1056],{"class":850},[755,1474,697],{"class":765},[755,1476,1061],{"class":801},[755,1478,863],{"class":765},[755,1480,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509],{"class":757,"line":841},[755,1482,1068],{"class":769},[755,1484,914],{"class":765},[755,1486,1073],{"class":769},[755,1488,914],{"class":765},[755,1490,1078],{"class":811},[755,1492,814],{"class":823},[755,1494,835],{"class":765},[755,1496,1085],{"class":782},[755,1498,835],{"class":765},[755,1500,854],{"class":765},[755,1502,1024],{"class":769},[755,1504,914],{"class":765},[755,1506,681],{"class":769},[755,1508,1098],{"class":765},[755,1510,943],{"class":823},[755,1512,1513,1515],{"class":757,"line":866},[755,1514,1001],{"class":765},[755,1516,943],{"class":769},[746,1518,1521],{"className":748,"code":1519,"filename":300,"language":750,"meta":1520,"style":751},"import { evlog } from 'evlog\u002Freact-router'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nexport const middleware: Route.MiddlewareFunction[] = [\n  evlog({ plugins: [tenantPlugin] }),\n]\n","app\u002Froot.tsx",[624,1522,1523,1543,1561,1565,1593,1614],{"__ignoreMap":751},[755,1524,1525,1527,1529,1532,1534,1536,1538,1541],{"class":757,"line":758},[755,1526,762],{"class":761},[755,1528,766],{"class":765},[755,1530,1531],{"class":769}," evlog",[755,1533,773],{"class":765},[755,1535,776],{"class":761},[755,1537,779],{"class":765},[755,1539,1540],{"class":782},"evlog\u002Freact-router",[755,1542,785],{"class":765},[755,1544,1545,1547,1549,1551,1553,1555,1557,1559],{"class":757,"line":788},[755,1546,762],{"class":761},[755,1548,766],{"class":765},[755,1550,1024],{"class":769},[755,1552,773],{"class":765},[755,1554,776],{"class":761},[755,1556,779],{"class":765},[755,1558,1033],{"class":782},[755,1560,785],{"class":765},[755,1562,1563],{"class":757,"line":795},[755,1564,792],{"emptyLinePlaceholder":791},[755,1566,1567,1569,1571,1574,1576,1580,1582,1585,1588,1590],{"class":757,"line":820},[755,1568,798],{"class":761},[755,1570,802],{"class":801},[755,1572,1573],{"class":769}," middleware",[755,1575,827],{"class":765},[755,1577,1579],{"class":1578},"sBMFI"," Route",[755,1581,914],{"class":765},[755,1583,1584],{"class":1578},"MiddlewareFunction",[755,1586,1587],{"class":769},"[] ",[755,1589,808],{"class":765},[755,1591,1592],{"class":769}," [\n",[755,1594,1595,1598,1600,1602,1604,1606,1608,1610,1612],{"class":757,"line":841},[755,1596,1597],{"class":811},"  evlog",[755,1599,814],{"class":769},[755,1601,922],{"class":765},[755,1603,1405],{"class":823},[755,1605,827],{"class":765},[755,1607,1410],{"class":769},[755,1609,1001],{"class":765},[755,1611,697],{"class":769},[755,1613,838],{"class":765},[755,1615,1616],{"class":757,"line":866},[755,1617,893],{"class":769},[746,1619,1622],{"className":748,"code":1620,"filename":285,"language":750,"meta":1621,"style":751},"import { evlog } from 'evlog\u002Fhono'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\napp.use(evlog({ plugins: [tenantPlugin] }))\n","src\u002Findex.ts",[624,1623,1624,1643,1661,1665],{"__ignoreMap":751},[755,1625,1626,1628,1630,1632,1634,1636,1638,1641],{"class":757,"line":758},[755,1627,762],{"class":761},[755,1629,766],{"class":765},[755,1631,1531],{"class":769},[755,1633,773],{"class":765},[755,1635,776],{"class":761},[755,1637,779],{"class":765},[755,1639,1640],{"class":782},"evlog\u002Fhono",[755,1642,785],{"class":765},[755,1644,1645,1647,1649,1651,1653,1655,1657,1659],{"class":757,"line":788},[755,1646,762],{"class":761},[755,1648,766],{"class":765},[755,1650,1024],{"class":769},[755,1652,773],{"class":765},[755,1654,776],{"class":761},[755,1656,779],{"class":765},[755,1658,1033],{"class":782},[755,1660,785],{"class":765},[755,1662,1663],{"class":757,"line":795},[755,1664,792],{"emptyLinePlaceholder":791},[755,1666,1667,1670,1672,1675,1677,1679,1681,1683,1685,1687,1689,1691],{"class":757,"line":820},[755,1668,1669],{"class":769},"app",[755,1671,914],{"class":765},[755,1673,1674],{"class":811},"use",[755,1676,814],{"class":769},[755,1678,673],{"class":811},[755,1680,814],{"class":769},[755,1682,922],{"class":765},[755,1684,1405],{"class":823},[755,1686,827],{"class":765},[755,1688,1410],{"class":769},[755,1690,1001],{"class":765},[755,1692,1693],{"class":769},"))\n",[746,1695,1697],{"className":748,"code":1696,"filename":280,"language":750,"meta":1621,"style":751},"import { evlog } from 'evlog\u002Fexpress'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\napp.use(evlog({ plugins: [tenantPlugin] }))\n",[624,1698,1699,1718,1736,1740],{"__ignoreMap":751},[755,1700,1701,1703,1705,1707,1709,1711,1713,1716],{"class":757,"line":758},[755,1702,762],{"class":761},[755,1704,766],{"class":765},[755,1706,1531],{"class":769},[755,1708,773],{"class":765},[755,1710,776],{"class":761},[755,1712,779],{"class":765},[755,1714,1715],{"class":782},"evlog\u002Fexpress",[755,1717,785],{"class":765},[755,1719,1720,1722,1724,1726,1728,1730,1732,1734],{"class":757,"line":788},[755,1721,762],{"class":761},[755,1723,766],{"class":765},[755,1725,1024],{"class":769},[755,1727,773],{"class":765},[755,1729,776],{"class":761},[755,1731,779],{"class":765},[755,1733,1033],{"class":782},[755,1735,785],{"class":765},[755,1737,1738],{"class":757,"line":795},[755,1739,792],{"emptyLinePlaceholder":791},[755,1741,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1764],{"class":757,"line":820},[755,1743,1669],{"class":769},[755,1745,914],{"class":765},[755,1747,1674],{"class":811},[755,1749,814],{"class":769},[755,1751,673],{"class":811},[755,1753,814],{"class":769},[755,1755,922],{"class":765},[755,1757,1405],{"class":823},[755,1759,827],{"class":765},[755,1761,1410],{"class":769},[755,1763,1001],{"class":765},[755,1765,1693],{"class":769},[746,1767,1769],{"className":748,"code":1768,"filename":290,"language":750,"meta":1621,"style":751},"import { evlog } from 'evlog\u002Ffastify'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nawait app.register(evlog, { plugins: [tenantPlugin] })\n",[624,1770,1771,1790,1808,1812],{"__ignoreMap":751},[755,1772,1773,1775,1777,1779,1781,1783,1785,1788],{"class":757,"line":758},[755,1774,762],{"class":761},[755,1776,766],{"class":765},[755,1778,1531],{"class":769},[755,1780,773],{"class":765},[755,1782,776],{"class":761},[755,1784,779],{"class":765},[755,1786,1787],{"class":782},"evlog\u002Ffastify",[755,1789,785],{"class":765},[755,1791,1792,1794,1796,1798,1800,1802,1804,1806],{"class":757,"line":788},[755,1793,762],{"class":761},[755,1795,766],{"class":765},[755,1797,1024],{"class":769},[755,1799,773],{"class":765},[755,1801,776],{"class":761},[755,1803,779],{"class":765},[755,1805,1033],{"class":782},[755,1807,785],{"class":765},[755,1809,1810],{"class":757,"line":795},[755,1811,792],{"emptyLinePlaceholder":791},[755,1813,1814,1817,1820,1822,1825,1828,1830,1832,1834,1836,1838,1840],{"class":757,"line":820},[755,1815,1816],{"class":761},"await",[755,1818,1819],{"class":769}," app",[755,1821,914],{"class":765},[755,1823,1824],{"class":811},"register",[755,1826,1827],{"class":769},"(evlog",[755,1829,854],{"class":765},[755,1831,766],{"class":765},[755,1833,1405],{"class":823},[755,1835,827],{"class":765},[755,1837,1410],{"class":769},[755,1839,1001],{"class":765},[755,1841,943],{"class":769},[746,1843,1845],{"className":748,"code":1844,"filename":295,"language":750,"meta":1621,"style":751},"import { evlog } from 'evlog\u002Felysia'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\napp.use(evlog({ plugins: [tenantPlugin] }))\n",[624,1846,1847,1866,1884,1888],{"__ignoreMap":751},[755,1848,1849,1851,1853,1855,1857,1859,1861,1864],{"class":757,"line":758},[755,1850,762],{"class":761},[755,1852,766],{"class":765},[755,1854,1531],{"class":769},[755,1856,773],{"class":765},[755,1858,776],{"class":761},[755,1860,779],{"class":765},[755,1862,1863],{"class":782},"evlog\u002Felysia",[755,1865,785],{"class":765},[755,1867,1868,1870,1872,1874,1876,1878,1880,1882],{"class":757,"line":788},[755,1869,762],{"class":761},[755,1871,766],{"class":765},[755,1873,1024],{"class":769},[755,1875,773],{"class":765},[755,1877,776],{"class":761},[755,1879,779],{"class":765},[755,1881,1033],{"class":782},[755,1883,785],{"class":765},[755,1885,1886],{"class":757,"line":795},[755,1887,792],{"emptyLinePlaceholder":791},[755,1889,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912],{"class":757,"line":820},[755,1891,1669],{"class":769},[755,1893,914],{"class":765},[755,1895,1674],{"class":811},[755,1897,814],{"class":769},[755,1899,673],{"class":811},[755,1901,814],{"class":769},[755,1903,922],{"class":765},[755,1905,1405],{"class":823},[755,1907,827],{"class":765},[755,1909,1410],{"class":769},[755,1911,1001],{"class":765},[755,1913,1693],{"class":769},[746,1915,1918],{"className":748,"code":1916,"filename":275,"language":750,"meta":1917,"style":751},"import { EvlogModule } from 'evlog\u002Fnestjs'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nEvlogModule.forRoot({ plugins: [tenantPlugin] })\n","src\u002Fapp.module.ts",[624,1919,1920,1940,1958,1962],{"__ignoreMap":751},[755,1921,1922,1924,1926,1929,1931,1933,1935,1938],{"class":757,"line":758},[755,1923,762],{"class":761},[755,1925,766],{"class":765},[755,1927,1928],{"class":769}," EvlogModule",[755,1930,773],{"class":765},[755,1932,776],{"class":761},[755,1934,779],{"class":765},[755,1936,1937],{"class":782},"evlog\u002Fnestjs",[755,1939,785],{"class":765},[755,1941,1942,1944,1946,1948,1950,1952,1954,1956],{"class":757,"line":788},[755,1943,762],{"class":761},[755,1945,766],{"class":765},[755,1947,1024],{"class":769},[755,1949,773],{"class":765},[755,1951,776],{"class":761},[755,1953,779],{"class":765},[755,1955,1033],{"class":782},[755,1957,785],{"class":765},[755,1959,1960],{"class":757,"line":795},[755,1961,792],{"emptyLinePlaceholder":791},[755,1963,1964,1967,1969,1972,1974,1976,1978,1980,1982,1984],{"class":757,"line":820},[755,1965,1966],{"class":769},"EvlogModule",[755,1968,914],{"class":765},[755,1970,1971],{"class":811},"forRoot",[755,1973,814],{"class":769},[755,1975,922],{"class":765},[755,1977,1405],{"class":823},[755,1979,827],{"class":765},[755,1981,1410],{"class":769},[755,1983,1001],{"class":765},[755,1985,943],{"class":769},[746,1987,1990],{"className":748,"code":1988,"filename":319,"language":750,"meta":1989,"style":751},"import { withEvlog } from 'evlog\u002Forpc'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nconst handler = withEvlog(new RPCHandler(router), { plugins: [tenantPlugin] })\n","server\u002Forpc.ts",[624,1991,1992,2011,2029,2033],{"__ignoreMap":751},[755,1993,1994,1996,1998,2000,2002,2004,2006,2009],{"class":757,"line":758},[755,1995,762],{"class":761},[755,1997,766],{"class":765},[755,1999,1269],{"class":769},[755,2001,773],{"class":765},[755,2003,776],{"class":761},[755,2005,779],{"class":765},[755,2007,2008],{"class":782},"evlog\u002Forpc",[755,2010,785],{"class":765},[755,2012,2013,2015,2017,2019,2021,2023,2025,2027],{"class":757,"line":788},[755,2014,762],{"class":761},[755,2016,766],{"class":765},[755,2018,1024],{"class":769},[755,2020,773],{"class":765},[755,2022,776],{"class":761},[755,2024,779],{"class":765},[755,2026,1033],{"class":782},[755,2028,785],{"class":765},[755,2030,2031],{"class":757,"line":795},[755,2032,792],{"emptyLinePlaceholder":791},[755,2034,2035,2038,2041,2043,2045,2047,2050,2053,2056,2058,2060,2062,2064,2066,2068],{"class":757,"line":820},[755,2036,2037],{"class":801},"const",[755,2039,2040],{"class":769}," handler ",[755,2042,808],{"class":765},[755,2044,1269],{"class":811},[755,2046,814],{"class":769},[755,2048,2049],{"class":765},"new",[755,2051,2052],{"class":811}," RPCHandler",[755,2054,2055],{"class":769},"(router)",[755,2057,854],{"class":765},[755,2059,766],{"class":765},[755,2061,1405],{"class":823},[755,2063,827],{"class":765},[755,2065,1410],{"class":769},[755,2067,1001],{"class":765},[755,2069,943],{"class":769},[746,2071,2074],{"className":748,"code":2072,"filename":305,"language":750,"meta":2073,"style":751},"import { withEvlog } from 'evlog\u002Fworkers'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\nexport default withEvlog(handler, { plugins: [tenantPlugin] })\n","src\u002Fworker.ts",[624,2075,2076,2095,2113,2117],{"__ignoreMap":751},[755,2077,2078,2080,2082,2084,2086,2088,2090,2093],{"class":757,"line":758},[755,2079,762],{"class":761},[755,2081,766],{"class":765},[755,2083,1269],{"class":769},[755,2085,773],{"class":765},[755,2087,776],{"class":761},[755,2089,779],{"class":765},[755,2091,2092],{"class":782},"evlog\u002Fworkers",[755,2094,785],{"class":765},[755,2096,2097,2099,2101,2103,2105,2107,2109,2111],{"class":757,"line":788},[755,2098,762],{"class":761},[755,2100,766],{"class":765},[755,2102,1024],{"class":769},[755,2104,773],{"class":765},[755,2106,776],{"class":761},[755,2108,779],{"class":765},[755,2110,1033],{"class":782},[755,2112,785],{"class":765},[755,2114,2115],{"class":757,"line":795},[755,2116,792],{"emptyLinePlaceholder":791},[755,2118,2119,2121,2123,2125,2128,2130,2132,2134,2136,2138,2140],{"class":757,"line":820},[755,2120,798],{"class":761},[755,2122,1046],{"class":761},[755,2124,1269],{"class":811},[755,2126,2127],{"class":769},"(handler",[755,2129,854],{"class":765},[755,2131,766],{"class":765},[755,2133,1405],{"class":823},[755,2135,827],{"class":765},[755,2137,1410],{"class":769},[755,2139,1001],{"class":765},[755,2141,943],{"class":769},[746,2143,2145],{"className":748,"code":2144,"filename":310,"language":750,"meta":1621,"style":751},"import { initLogger } from 'evlog'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\ninitLogger({ plugins: [tenantPlugin] })\n",[624,2146,2147,2166,2184,2188],{"__ignoreMap":751},[755,2148,2149,2151,2153,2156,2158,2160,2162,2164],{"class":757,"line":758},[755,2150,762],{"class":761},[755,2152,766],{"class":765},[755,2154,2155],{"class":769}," initLogger",[755,2157,773],{"class":765},[755,2159,776],{"class":761},[755,2161,779],{"class":765},[755,2163,673],{"class":782},[755,2165,785],{"class":765},[755,2167,2168,2170,2172,2174,2176,2178,2180,2182],{"class":757,"line":788},[755,2169,762],{"class":761},[755,2171,766],{"class":765},[755,2173,1024],{"class":769},[755,2175,773],{"class":765},[755,2177,776],{"class":761},[755,2179,779],{"class":765},[755,2181,1033],{"class":782},[755,2183,785],{"class":765},[755,2185,2186],{"class":757,"line":795},[755,2187,792],{"emptyLinePlaceholder":791},[755,2189,2190,2193,2195,2197,2199,2201,2203,2205],{"class":757,"line":820},[755,2191,2192],{"class":811},"initLogger",[755,2194,814],{"class":769},[755,2196,922],{"class":765},[755,2198,1405],{"class":823},[755,2200,827],{"class":765},[755,2202,1410],{"class":769},[755,2204,1001],{"class":765},[755,2206,943],{"class":769},[741,2208,2209],{"id":1073},"Hooks",[2211,2212,2213,2229],"table",{},[2214,2215,2216],"thead",{},[2217,2218,2219,2223,2226],"tr",{},[2220,2221,2222],"th",{},"Hook",[2220,2224,2225],{},"When",[2220,2227,2228],{},"Use it for",[2230,2231,2232,2249,2264,2277,2297,2310,2323,2336],"tbody",{},[2217,2233,2234,2240,2243],{},[2235,2236,2237],"td",{},[624,2238,2239],{},"setup(ctx)",[2235,2241,2242],{},"Once when registered",[2235,2244,2245,2246,2248],{},"Read ",[624,2247,985],{},", set up shared state",[2217,2250,2251,2256,2259],{},[2235,2252,2253],{},[624,2254,2255],{},"onRequestStart(ctx)",[2235,2257,2258],{},"Each request, before any handler runs",[2235,2260,2261,2262],{},"Pull values from headers into ",[624,2263,911],{},[2217,2265,2266,2271,2274],{},[2235,2267,2268],{},[624,2269,2270],{},"enrich(ctx)",[2235,2272,2273],{},"Every event, before drain",[2235,2275,2276],{},"Add derived fields (geo, deploy id…)",[2217,2278,2279,2284,2287],{},[2235,2280,2281],{},[624,2282,2283],{},"keep(ctx)",[2235,2285,2286],{},"Tail sampling decision",[2235,2288,2289,2290,678,2293,2296],{},"Force-keep based on outcome (",[624,2291,2292],{},"status >= 400",[624,2294,2295],{},"duration > 500",", …)",[2217,2298,2299,2304,2307],{},[2235,2300,2301],{},[624,2302,2303],{},"drain(ctx)",[2235,2305,2306],{},"Every emitted event",[2235,2308,2309],{},"Side-effect: alert, mirror to a queue, etc.",[2217,2311,2312,2317,2320],{},[2235,2313,2314],{},[624,2315,2316],{},"onRequestFinish(ctx)",[2235,2318,2319],{},"After response",[2235,2321,2322],{},"Per-request post-processing",[2217,2324,2325,2330,2333],{},[2235,2326,2327],{},[624,2328,2329],{},"onClientLog(ctx)",[2235,2331,2332],{},"Browser-submitted event hits the ingest endpoint",[2235,2334,2335],{},"Observe \u002F reject client traffic",[2217,2337,2338,2343,2346],{},[2235,2339,2340],{},[624,2341,2342],{},"extendLogger(logger)",[2235,2344,2345],{},"Each request",[2235,2347,2348,2349,697],{},"Add custom methods (e.g. ",[624,2350,2351],{},"logger.audit.refund()",[621,2353,2354,2355,2358,2359,914],{},"Every hook is ",[629,2356,2357],{},"optional",". A plugin can implement any subset. The full type lives in ",[637,2360,2363],{"href":2361,"rel":2362},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[739],[624,2364,2365],{},"packages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[741,2367,2369],{"id":2368},"a-multi-hook-example","A multi-hook example",[621,2371,2372,2373,2376,2377,678,2380,2382,2383,827],{},"Plugins shine when several concerns share state. Here, a single ",[624,2374,2375],{},"request-metrics"," plugin tracks per-request timing through ",[624,2378,2379],{},"setup",[624,2381,677],{},", and ",[624,2384,684],{},[746,2386,2388],{"className":748,"code":2387,"language":750,"meta":751,"style":751},"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    if (event.durationMs !== undefined) event.tier = event.durationMs > 1000 ? 'slow' : 'fast'\n  },\n\n  drain({ event }) {\n    if (event.durationMs !== undefined) {\n      statsd.timing('http.request', event.durationMs, { path: event.path as string })\n    }\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",[624,2389,2390,2409,2413,2430,2444,2448,2462,2491,2495,2499,2511,2575,2579,2584,2598,2619,2673,2679,2684,2689,2707,2750,2755,2760,2779,2825,2832,2837,2842],{"__ignoreMap":751},[755,2391,2392,2394,2396,2398,2400,2402,2404,2407],{"class":757,"line":758},[755,2393,762],{"class":761},[755,2395,766],{"class":765},[755,2397,770],{"class":769},[755,2399,773],{"class":765},[755,2401,776],{"class":761},[755,2403,779],{"class":765},[755,2405,2406],{"class":782},"evlog\u002Ftoolkit",[755,2408,785],{"class":765},[755,2410,2411],{"class":757,"line":788},[755,2412,792],{"emptyLinePlaceholder":791},[755,2414,2415,2417,2419,2422,2424,2426,2428],{"class":757,"line":795},[755,2416,798],{"class":761},[755,2418,802],{"class":801},[755,2420,2421],{"class":769}," requestMetricsPlugin ",[755,2423,808],{"class":765},[755,2425,770],{"class":811},[755,2427,814],{"class":769},[755,2429,817],{"class":765},[755,2431,2432,2434,2436,2438,2440,2442],{"class":757,"line":820},[755,2433,824],{"class":823},[755,2435,827],{"class":765},[755,2437,779],{"class":765},[755,2439,2375],{"class":782},[755,2441,835],{"class":765},[755,2443,838],{"class":765},[755,2445,2446],{"class":757,"line":841},[755,2447,792],{"emptyLinePlaceholder":791},[755,2449,2450,2453,2455,2458,2460],{"class":757,"line":866},[755,2451,2452],{"class":823},"  setup",[755,2454,847],{"class":765},[755,2456,2457],{"class":850}," env",[755,2459,860],{"class":765},[755,2461,863],{"class":765},[755,2463,2464,2467,2469,2471,2473,2475,2478,2480,2482,2484,2487,2489],{"class":757,"line":896},[755,2465,2466],{"class":769},"    statsd",[755,2468,914],{"class":765},[755,2470,94],{"class":811},[755,2472,814],{"class":823},[755,2474,922],{"class":765},[755,2476,2477],{"class":823}," service",[755,2479,827],{"class":765},[755,2481,2457],{"class":769},[755,2483,914],{"class":765},[755,2485,2486],{"class":769},"service",[755,2488,773],{"class":765},[755,2490,943],{"class":823},[755,2492,2493],{"class":757,"line":946},[755,2494,949],{"class":765},[755,2496,2497],{"class":757,"line":952},[755,2498,792],{"emptyLinePlaceholder":791},[755,2500,2501,2503,2505,2507,2509],{"class":757,"line":967},[755,2502,955],{"class":823},[755,2504,847],{"class":765},[755,2506,960],{"class":850},[755,2508,860],{"class":765},[755,2510,863],{"class":765},[755,2512,2513,2515,2517,2520,2522,2525,2528,2531,2533,2535,2537,2540,2542,2544,2546,2548,2551,2555,2558,2560,2563,2565,2568,2570,2573],{"class":757,"line":993},[755,2514,899],{"class":761},[755,2516,902],{"class":823},[755,2518,2519],{"class":769},"event",[755,2521,914],{"class":765},[755,2523,2524],{"class":769},"durationMs",[755,2526,2527],{"class":765}," !==",[755,2529,2530],{"class":765}," undefined",[755,2532,908],{"class":823},[755,2534,2519],{"class":769},[755,2536,914],{"class":765},[755,2538,2539],{"class":769},"tier",[755,2541,875],{"class":765},[755,2543,960],{"class":769},[755,2545,914],{"class":765},[755,2547,2524],{"class":769},[755,2549,2550],{"class":765}," >",[755,2552,2554],{"class":2553},"sbssI"," 1000",[755,2556,2557],{"class":765}," ?",[755,2559,779],{"class":765},[755,2561,2562],{"class":782},"slow",[755,2564,835],{"class":765},[755,2566,2567],{"class":765}," :",[755,2569,779],{"class":765},[755,2571,2572],{"class":782},"fast",[755,2574,785],{"class":765},[755,2576,2577],{"class":757,"line":998},[755,2578,949],{"class":765},[755,2580,2582],{"class":757,"line":2581},13,[755,2583,792],{"emptyLinePlaceholder":791},[755,2585,2587,2590,2592,2594,2596],{"class":757,"line":2586},14,[755,2588,2589],{"class":823},"  drain",[755,2591,847],{"class":765},[755,2593,960],{"class":850},[755,2595,860],{"class":765},[755,2597,863],{"class":765},[755,2599,2601,2603,2605,2607,2609,2611,2613,2615,2617],{"class":757,"line":2600},15,[755,2602,899],{"class":761},[755,2604,902],{"class":823},[755,2606,2519],{"class":769},[755,2608,914],{"class":765},[755,2610,2524],{"class":769},[755,2612,2527],{"class":765},[755,2614,2530],{"class":765},[755,2616,908],{"class":823},[755,2618,817],{"class":765},[755,2620,2622,2625,2627,2630,2632,2634,2637,2639,2641,2643,2645,2647,2649,2651,2654,2656,2658,2660,2663,2666,2669,2671],{"class":757,"line":2621},16,[755,2623,2624],{"class":769},"      statsd",[755,2626,914],{"class":765},[755,2628,2629],{"class":811},"timing",[755,2631,814],{"class":823},[755,2633,835],{"class":765},[755,2635,2636],{"class":782},"http.request",[755,2638,835],{"class":765},[755,2640,854],{"class":765},[755,2642,960],{"class":769},[755,2644,914],{"class":765},[755,2646,2524],{"class":769},[755,2648,854],{"class":765},[755,2650,766],{"class":765},[755,2652,2653],{"class":823}," path",[755,2655,827],{"class":765},[755,2657,960],{"class":769},[755,2659,914],{"class":765},[755,2661,2662],{"class":769},"path",[755,2664,2665],{"class":761}," as",[755,2667,2668],{"class":1578}," string",[755,2670,773],{"class":765},[755,2672,943],{"class":823},[755,2674,2676],{"class":757,"line":2675},17,[755,2677,2678],{"class":765},"    }\n",[755,2680,2682],{"class":757,"line":2681},18,[755,2683,949],{"class":765},[755,2685,2687],{"class":757,"line":2686},19,[755,2688,792],{"emptyLinePlaceholder":791},[755,2690,2692,2694,2696,2698,2700,2703,2705],{"class":757,"line":2691},20,[755,2693,844],{"class":823},[755,2695,847],{"class":765},[755,2697,851],{"class":850},[755,2699,854],{"class":765},[755,2701,2702],{"class":850}," request",[755,2704,860],{"class":765},[755,2706,863],{"class":765},[755,2708,2710,2713,2715,2717,2719,2721,2724,2726,2728,2731,2733,2736,2738,2741,2744,2746,2748],{"class":757,"line":2709},21,[755,2711,2712],{"class":769},"    logger",[755,2714,914],{"class":765},[755,2716,917],{"class":811},[755,2718,814],{"class":823},[755,2720,922],{"class":765},[755,2722,2723],{"class":823}," trace",[755,2725,827],{"class":765},[755,2727,766],{"class":765},[755,2729,2730],{"class":823}," startedAt",[755,2732,827],{"class":765},[755,2734,2735],{"class":769}," Date",[755,2737,914],{"class":765},[755,2739,2740],{"class":811},"now",[755,2742,2743],{"class":823},"() ",[755,2745,1001],{"class":765},[755,2747,773],{"class":765},[755,2749,943],{"class":823},[755,2751,2753],{"class":757,"line":2752},22,[755,2754,949],{"class":765},[755,2756,2758],{"class":757,"line":2757},23,[755,2759,792],{"emptyLinePlaceholder":791},[755,2761,2763,2766,2768,2770,2772,2775,2777],{"class":757,"line":2762},24,[755,2764,2765],{"class":823},"  onRequestFinish",[755,2767,847],{"class":765},[755,2769,960],{"class":850},[755,2771,854],{"class":765},[755,2773,2774],{"class":850}," durationMs",[755,2776,860],{"class":765},[755,2778,863],{"class":765},[755,2780,2782,2784,2786,2788,2791,2793,2795,2797,2800,2803,2805,2808,2810,2813,2815,2817,2820,2823],{"class":757,"line":2781},25,[755,2783,899],{"class":761},[755,2785,902],{"class":823},[755,2787,2519],{"class":769},[755,2789,2790],{"class":765}," &&",[755,2792,902],{"class":823},[755,2794,2519],{"class":769},[755,2796,914],{"class":765},[755,2798,2799],{"class":769},"level",[755,2801,2802],{"class":765}," ===",[755,2804,779],{"class":765},[755,2806,2807],{"class":782},"error",[755,2809,835],{"class":765},[755,2811,2812],{"class":765}," ||",[755,2814,2774],{"class":769},[755,2816,2550],{"class":765},[755,2818,2819],{"class":2553}," 5000",[755,2821,2822],{"class":823},")) ",[755,2824,817],{"class":765},[755,2826,2828],{"class":757,"line":2827},26,[755,2829,2831],{"class":2830},"sHwdD","      \u002F\u002F alert \u002F forward \u002F etc.\n",[755,2833,2835],{"class":757,"line":2834},27,[755,2836,2678],{"class":765},[755,2838,2840],{"class":757,"line":2839},28,[755,2841,949],{"class":765},[755,2843,2845,2847],{"class":757,"line":2844},29,[755,2846,1001],{"class":765},[755,2848,943],{"class":769},[741,2850,2852],{"id":2851},"sugar-plugins","Sugar plugins",[621,2854,2855,2856,2858,2859,2861],{},"For single-hook extensions, the toolkit offers ",[624,2857,647],{}," and ",[624,2860,641],{}," wrappers:",[746,2863,2867],{"className":2864,"code":2865,"language":2866,"meta":751,"style":751},"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",[624,2868,2869,2893,2897,2925],{"__ignoreMap":751},[755,2870,2871,2873,2875,2878,2880,2883,2885,2887,2889,2891],{"class":757,"line":758},[755,2872,762],{"class":761},[755,2874,766],{"class":765},[755,2876,2877],{"class":769}," drainPlugin",[755,2879,854],{"class":765},[755,2881,2882],{"class":769}," enricherPlugin",[755,2884,773],{"class":765},[755,2886,776],{"class":761},[755,2888,779],{"class":765},[755,2890,2406],{"class":782},[755,2892,785],{"class":765},[755,2894,2895],{"class":757,"line":788},[755,2896,792],{"emptyLinePlaceholder":791},[755,2898,2899,2901,2904,2906,2908,2910,2912,2915,2917,2919,2922],{"class":757,"line":795},[755,2900,2037],{"class":801},[755,2902,2903],{"class":769}," drainOnly ",[755,2905,808],{"class":765},[755,2907,2877],{"class":811},[755,2909,814],{"class":769},[755,2911,835],{"class":765},[755,2913,2914],{"class":782},"axiom",[755,2916,835],{"class":765},[755,2918,854],{"class":765},[755,2920,2921],{"class":811}," createAxiomDrain",[755,2923,2924],{"class":769},"())\n",[755,2926,2927,2929,2932,2934,2936,2938,2940,2943,2945,2947,2950],{"class":757,"line":820},[755,2928,2037],{"class":801},[755,2930,2931],{"class":769}," enricherOnly ",[755,2933,808],{"class":765},[755,2935,2882],{"class":811},[755,2937,814],{"class":769},[755,2939,835],{"class":765},[755,2941,2942],{"class":782},"user-agent",[755,2944,835],{"class":765},[755,2946,854],{"class":765},[755,2948,2949],{"class":811}," createUserAgentEnricher",[755,2951,2924],{"class":769},[621,2953,2954,2955,2958],{},"These are equivalent to a ",[624,2956,2957],{},"definePlugin({ name, drain | enrich })"," shape but read more clearly when intent is obvious.",[741,2960,2962],{"id":2961},"common-pitfalls","Common pitfalls",[662,2964,2965,2974,2985,3008],{},[665,2966,2967,2970,2971,2973],{},[629,2968,2969],{},"Don't throw from a hook."," The plugin runner catches and logs errors with the plugin name, but a thrown error from ",[624,2972,681],{}," won't propagate the event downstream. Keep hooks defensive.",[665,2975,2976,2981,2982,2984],{},[629,2977,2978,2980],{},[624,2979,684],{}," runs for every event",": not just per-request. If you only care about per-request lifecycle, use ",[624,2983,696],{}," instead.",[665,2986,2987,2992,2993,2996,2997,3000,3001,3004,3005,914],{},[629,2988,2989,2991],{},[624,2990,687],{}," mutates the logger object",": augment ",[624,2994,2995],{},"RequestLogger"," in a ",[624,2998,2999],{},".d.ts"," so ",[624,3002,3003],{},"useLogger(event)"," exposes the new methods to TypeScript. See ",[637,3006,3007],{"href":77},"typed fields",[665,3009,3010,3016,3017,3019],{},[629,3011,3012,3013],{},"Plugins are de-duplicated by ",[624,3014,3015],{},"name",". Re-registering with the same ",[624,3018,3015],{}," replaces the previous version (last registration wins).",[741,3021,3023],{"id":3022},"next-steps","Next steps",[662,3025,3026,3032,3038,3044],{},[665,3027,3028,3031],{},[637,3029,3030],{"href":527},"Custom Enrichers",": single-hook enrichment",[665,3033,3034,3037],{},[637,3035,3036],{"href":540},"Custom Drains",": single-destination output",[665,3039,3040,3043],{},[637,3041,3042],{"href":531},"Tail Sampling",": outcome-aware keep decisions",[665,3045,3046,3049],{},[637,3047,3048],{"href":535},"Identity Headers",": tag every drain request",[3051,3052,3053],"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":751,"searchDepth":788,"depth":788,"links":3055},[3056,3057,3058,3059,3060,3061],{"id":743,"depth":788,"text":744},{"id":1073,"depth":788,"text":2209},{"id":2368,"depth":788,"text":2369},{"id":2851,"depth":788,"text":2852},{"id":2961,"depth":788,"text":2962},{"id":3022,"depth":788,"text":3023},"definePlugin is evlog's canonical extension point: opt into any subset of the lifecycle hooks from one cohesive object.","md",[3065,3068,3069],{"label":3030,"icon":453,"to":527,"color":3066,"variant":3067},"neutral","subtle",{"label":3036,"icon":542,"to":540,"color":3066,"variant":3067},{"label":3042,"icon":69,"to":531,"color":3066,"variant":3067},{},{"title":522,"icon":497},{"title":522,"description":3062},"SiYv2AyfnAgGXNo5QLny9kdgTP5r4rTZ55zPD-rawts",[3075,3077],{"title":425,"path":518,"stem":519,"description":3076,"icon":520,"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":526,"path":527,"stem":528,"description":3078,"icon":453,"children":-1},"Write an enricher that adds deployment metadata, tenant ids, feature flags, or anything computed. Error isolation and merging are handled.",1791636516128]