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