[{"data":1,"prerenderedAt":2112},["ShallowReactive",2],{"navigation_docs":3,"-extend-plugins":612,"-extend-plugins-surround":2107},[4,35,85,138,318,453,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],{"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},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"path":455,"stem":456,"children":457,"page":34},"Libraries","\u002Flibraries","6.libraries",[458,462,467,470,474,479,484],{"title":41,"path":459,"stem":460,"icon":461},"\u002Flibraries\u002Foverview","6.libraries\u002F0.overview","i-lucide-package",{"title":463,"path":464,"stem":465,"icon":466},"Emitting Events","\u002Flibraries\u002Femitting","6.libraries\u002F1.emitting","i-lucide-radio",{"title":56,"path":468,"stem":469,"icon":59},"\u002Flibraries\u002Ferrors","6.libraries\u002F2.errors",{"title":471,"path":472,"stem":473,"icon":132},"Errors Agents Can Act On","\u002Flibraries\u002Fagents","6.libraries\u002F3.agents",{"title":475,"path":476,"stem":477,"icon":478},"Exporting the Catalog","\u002Flibraries\u002Fexporting","6.libraries\u002F4.exporting","i-lucide-file-output",{"title":480,"path":481,"stem":482,"icon":483},"Migrating","\u002Flibraries\u002Fmigrating","6.libraries\u002F5.migrating","i-lucide-route",{"title":485,"path":486,"stem":487,"icon":488},"Testing","\u002Flibraries\u002Ftesting","6.libraries\u002F6.testing","i-lucide-flask-conical",{"title":490,"path":491,"stem":492,"children":493,"page":34},"Extend","\u002Fextend","7.extend",[494,498,503,508,512,517,521,525,529,533,538,543],{"title":41,"path":495,"stem":496,"icon":497},"\u002Fextend\u002Foverview","7.extend\u002F0.overview","i-lucide-blocks",{"title":499,"path":500,"stem":501,"icon":502},"Stream","\u002Fextend\u002Fstream","7.extend\u002F1.stream","i-lucide-radio-tower",{"title":504,"path":505,"stem":506,"icon":507},"Custom framework","\u002Fextend\u002Fcustom-framework","7.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":509,"path":510,"stem":511,"icon":502},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","7.extend\u002F11.diagnostics-channel",{"title":513,"path":514,"stem":515,"icon":516},"FS reader","\u002Fextend\u002Ffs-reader","7.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":518,"stem":519,"icon":520},"\u002Fextend\u002Fconsumer-recipes","7.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":522,"path":523,"stem":524,"icon":497},"Plugins","\u002Fextend\u002Fplugins","7.extend\u002F4.plugins",{"title":526,"path":527,"stem":528,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","7.extend\u002F5.custom-enrichers",{"title":530,"path":531,"stem":532,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","7.extend\u002F6.tail-sampling",{"title":534,"path":535,"stem":536,"icon":537},"Identity headers","\u002Fextend\u002Fidentity-headers","7.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":539,"path":540,"stem":541,"icon":542},"Custom drains","\u002Fextend\u002Fcustom-drains","7.extend\u002F8.custom-drains","i-lucide-share-2",{"title":544,"path":545,"stem":546,"icon":547},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","7.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":549,"stem":550,"children":551,"page":34},"\u002Freference","8.reference",[552,556,561,564,569,573,578,582],{"title":41,"path":553,"stem":554,"icon":555},"\u002Freference\u002Foverview","8.reference\u002F0.overview","i-lucide-book-marked",{"title":557,"path":558,"stem":559,"icon":560},"Configuration","\u002Freference\u002Fconfiguration","8.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":562,"stem":563,"icon":112},"\u002Freference\u002Fperformance","8.reference\u002F2.performance",{"title":565,"path":566,"stem":567,"icon":568},"Vite Plugin","\u002Freference\u002Fvite-plugin","8.reference\u002F3.vite-plugin","i-custom-vite",{"title":570,"path":571,"stem":572,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","8.reference\u002F4.best-practices",{"title":574,"path":575,"stem":576,"icon":577},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","8.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":579,"path":580,"stem":581,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","8.reference\u002F6.agent-skills",{"title":583,"path":584,"stem":585,"icon":586},"Cost","\u002Freference\u002Fcost","8.reference\u002F7.cost","i-lucide-receipt",{"title":588,"path":589,"stem":590,"children":591,"page":34},"Compare","\u002Fcompare","9.compare",[592,596,600,604,608],{"title":593,"path":594,"stem":595,"icon":577},"evlog vs Pino","\u002Fcompare\u002Fpino","9.compare\u002F1.pino",{"title":597,"path":598,"stem":599,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","9.compare\u002F2.opentelemetry",{"title":601,"path":602,"stem":603,"icon":577},"evlog vs LogTape","\u002Fcompare\u002Flogtape","9.compare\u002F3.logtape",{"title":605,"path":606,"stem":607,"icon":577},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","9.compare\u002F4.winston",{"title":609,"path":610,"stem":611,"icon":577},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","9.compare\u002F5.consola",{"id":613,"title":522,"body":614,"description":2095,"extension":2096,"links":2097,"meta":2103,"navigation":2104,"path":523,"seo":2105,"stem":524,"__hash__":2106},"docs\u002F7.extend\u002F4.plugins.md",{"type":615,"value":616,"toc":2087},"minimark",[617,620,633,653,740,745,1004,1007,1239,1242,1384,1398,1402,1417,1881,1885,1894,1985,1992,1996,2053,2057,2083],[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,1080,1158],"code-group",{},[746,1011,1014],{"className":748,"code":1012,"filename":1013,"language":750,"meta":751,"style":751},"import { initLogger } from 'evlog'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\ninitLogger({ plugins: [tenantPlugin] })\n","Next.js \u002F standalone",[624,1015,1016,1035,1055,1059],{"__ignoreMap":751},[755,1017,1018,1020,1022,1025,1027,1029,1031,1033],{"class":757,"line":758},[755,1019,762],{"class":761},[755,1021,766],{"class":765},[755,1023,1024],{"class":769}," initLogger",[755,1026,773],{"class":765},[755,1028,776],{"class":761},[755,1030,779],{"class":765},[755,1032,673],{"class":782},[755,1034,785],{"class":765},[755,1036,1037,1039,1041,1044,1046,1048,1050,1053],{"class":757,"line":788},[755,1038,762],{"class":761},[755,1040,766],{"class":765},[755,1042,1043],{"class":769}," tenantPlugin",[755,1045,773],{"class":765},[755,1047,776],{"class":761},[755,1049,779],{"class":765},[755,1051,1052],{"class":782},".\u002Fplugins\u002Ftenant",[755,1054,785],{"class":765},[755,1056,1057],{"class":757,"line":795},[755,1058,792],{"emptyLinePlaceholder":791},[755,1060,1061,1064,1066,1068,1071,1073,1076,1078],{"class":757,"line":820},[755,1062,1063],{"class":811},"initLogger",[755,1065,814],{"class":769},[755,1067,922],{"class":765},[755,1069,1070],{"class":823}," plugins",[755,1072,827],{"class":765},[755,1074,1075],{"class":769}," [tenantPlugin] ",[755,1077,1001],{"class":765},[755,1079,943],{"class":769},[746,1081,1084],{"className":748,"code":1082,"filename":1083,"language":750,"meta":751,"style":751},"import { evlogMiddleware } from 'evlog\u002F\u003Cframework>'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\napp.use(evlogMiddleware({ plugins: [tenantPlugin] }))\n","Hono \u002F Express \u002F Fastify \u002F Elysia",[624,1085,1086,1106,1124,1128],{"__ignoreMap":751},[755,1087,1088,1090,1092,1095,1097,1099,1101,1104],{"class":757,"line":758},[755,1089,762],{"class":761},[755,1091,766],{"class":765},[755,1093,1094],{"class":769}," evlogMiddleware",[755,1096,773],{"class":765},[755,1098,776],{"class":761},[755,1100,779],{"class":765},[755,1102,1103],{"class":782},"evlog\u002F\u003Cframework>",[755,1105,785],{"class":765},[755,1107,1108,1110,1112,1114,1116,1118,1120,1122],{"class":757,"line":788},[755,1109,762],{"class":761},[755,1111,766],{"class":765},[755,1113,1043],{"class":769},[755,1115,773],{"class":765},[755,1117,776],{"class":761},[755,1119,779],{"class":765},[755,1121,1052],{"class":782},[755,1123,785],{"class":765},[755,1125,1126],{"class":757,"line":795},[755,1127,792],{"emptyLinePlaceholder":791},[755,1129,1130,1133,1135,1138,1140,1143,1145,1147,1149,1151,1153,1155],{"class":757,"line":820},[755,1131,1132],{"class":769},"app",[755,1134,914],{"class":765},[755,1136,1137],{"class":811},"use",[755,1139,814],{"class":769},[755,1141,1142],{"class":811},"evlogMiddleware",[755,1144,814],{"class":769},[755,1146,922],{"class":765},[755,1148,1070],{"class":823},[755,1150,827],{"class":765},[755,1152,1075],{"class":769},[755,1154,1001],{"class":765},[755,1156,1157],{"class":769},"))\n",[746,1159,1161],{"className":748,"code":1160,"filename":255,"language":750,"meta":751,"style":751},"\u002F\u002F Register the hooks you actually use directly:\nnitroApp.hooks.hook('evlog:enrich', tenantPlugin.enrich!)\nnitroApp.hooks.hook('evlog:request:start', tenantPlugin.onRequestStart!)\n",[624,1162,1163,1169,1206],{"__ignoreMap":751},[755,1164,1165],{"class":757,"line":758},[755,1166,1168],{"class":1167},"sHwdD","\u002F\u002F Register the hooks you actually use directly:\n",[755,1170,1171,1174,1176,1179,1181,1184,1186,1188,1191,1193,1195,1197,1199,1201,1204],{"class":757,"line":788},[755,1172,1173],{"class":769},"nitroApp",[755,1175,914],{"class":765},[755,1177,1178],{"class":769},"hooks",[755,1180,914],{"class":765},[755,1182,1183],{"class":811},"hook",[755,1185,814],{"class":769},[755,1187,835],{"class":765},[755,1189,1190],{"class":782},"evlog:enrich",[755,1192,835],{"class":765},[755,1194,854],{"class":765},[755,1196,1043],{"class":769},[755,1198,914],{"class":765},[755,1200,681],{"class":769},[755,1202,1203],{"class":765},"!",[755,1205,943],{"class":769},[755,1207,1208,1210,1212,1214,1216,1218,1220,1222,1225,1227,1229,1231,1233,1235,1237],{"class":757,"line":795},[755,1209,1173],{"class":769},[755,1211,914],{"class":765},[755,1213,1178],{"class":769},[755,1215,914],{"class":765},[755,1217,1183],{"class":811},[755,1219,814],{"class":769},[755,1221,835],{"class":765},[755,1223,1224],{"class":782},"evlog:request:start",[755,1226,835],{"class":765},[755,1228,854],{"class":765},[755,1230,1043],{"class":769},[755,1232,914],{"class":765},[755,1234,677],{"class":769},[755,1236,1203],{"class":765},[755,1238,943],{"class":769},[741,1240,1241],{"id":1178},"Hooks",[1243,1244,1245,1261],"table",{},[1246,1247,1248],"thead",{},[1249,1250,1251,1255,1258],"tr",{},[1252,1253,1254],"th",{},"Hook",[1252,1256,1257],{},"When",[1252,1259,1260],{},"Use it for",[1262,1263,1264,1281,1296,1309,1329,1342,1355,1368],"tbody",{},[1249,1265,1266,1272,1275],{},[1267,1268,1269],"td",{},[624,1270,1271],{},"setup(ctx)",[1267,1273,1274],{},"Once when registered",[1267,1276,1277,1278,1280],{},"Read ",[624,1279,985],{},", set up shared state",[1249,1282,1283,1288,1291],{},[1267,1284,1285],{},[624,1286,1287],{},"onRequestStart(ctx)",[1267,1289,1290],{},"Each request, before any handler runs",[1267,1292,1293,1294],{},"Pull values from headers into ",[624,1295,911],{},[1249,1297,1298,1303,1306],{},[1267,1299,1300],{},[624,1301,1302],{},"enrich(ctx)",[1267,1304,1305],{},"Every event, before drain",[1267,1307,1308],{},"Add derived fields (geo, deploy id…)",[1249,1310,1311,1316,1319],{},[1267,1312,1313],{},[624,1314,1315],{},"keep(ctx)",[1267,1317,1318],{},"Tail sampling decision",[1267,1320,1321,1322,678,1325,1328],{},"Force-keep based on outcome (",[624,1323,1324],{},"status >= 400",[624,1326,1327],{},"duration > 500",", …)",[1249,1330,1331,1336,1339],{},[1267,1332,1333],{},[624,1334,1335],{},"drain(ctx)",[1267,1337,1338],{},"Every emitted event",[1267,1340,1341],{},"Side-effect: alert, mirror to a queue, etc.",[1249,1343,1344,1349,1352],{},[1267,1345,1346],{},[624,1347,1348],{},"onRequestFinish(ctx)",[1267,1350,1351],{},"After response",[1267,1353,1354],{},"Per-request post-processing",[1249,1356,1357,1362,1365],{},[1267,1358,1359],{},[624,1360,1361],{},"onClientLog(ctx)",[1267,1363,1364],{},"Browser-submitted event hits the ingest endpoint",[1267,1366,1367],{},"Observe \u002F reject client traffic",[1249,1369,1370,1375,1378],{},[1267,1371,1372],{},[624,1373,1374],{},"extendLogger(logger)",[1267,1376,1377],{},"Each request",[1267,1379,1380,1381,697],{},"Add custom methods (e.g. ",[624,1382,1383],{},"logger.audit.refund()",[621,1385,1386,1387,1390,1391,914],{},"Every hook is ",[629,1388,1389],{},"optional",". A plugin can implement any subset. The full type lives in ",[637,1392,1395],{"href":1393,"rel":1394},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[739],[624,1396,1397],{},"packages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[741,1399,1401],{"id":1400},"a-multi-hook-example","A multi-hook example",[621,1403,1404,1405,1408,1409,678,1412,1414,1415,827],{},"Plugins shine when several concerns share state. Here, a single ",[624,1406,1407],{},"request-metrics"," plugin tracks per-request timing through ",[624,1410,1411],{},"setup",[624,1413,677],{},", and ",[624,1416,684],{},[746,1418,1420],{"className":748,"code":1419,"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,1421,1422,1441,1445,1462,1476,1480,1494,1523,1527,1531,1543,1607,1611,1616,1630,1651,1706,1712,1717,1722,1740,1783,1788,1793,1812,1858,1864,1869,1874],{"__ignoreMap":751},[755,1423,1424,1426,1428,1430,1432,1434,1436,1439],{"class":757,"line":758},[755,1425,762],{"class":761},[755,1427,766],{"class":765},[755,1429,770],{"class":769},[755,1431,773],{"class":765},[755,1433,776],{"class":761},[755,1435,779],{"class":765},[755,1437,1438],{"class":782},"evlog\u002Ftoolkit",[755,1440,785],{"class":765},[755,1442,1443],{"class":757,"line":788},[755,1444,792],{"emptyLinePlaceholder":791},[755,1446,1447,1449,1451,1454,1456,1458,1460],{"class":757,"line":795},[755,1448,798],{"class":761},[755,1450,802],{"class":801},[755,1452,1453],{"class":769}," requestMetricsPlugin ",[755,1455,808],{"class":765},[755,1457,770],{"class":811},[755,1459,814],{"class":769},[755,1461,817],{"class":765},[755,1463,1464,1466,1468,1470,1472,1474],{"class":757,"line":820},[755,1465,824],{"class":823},[755,1467,827],{"class":765},[755,1469,779],{"class":765},[755,1471,1407],{"class":782},[755,1473,835],{"class":765},[755,1475,838],{"class":765},[755,1477,1478],{"class":757,"line":841},[755,1479,792],{"emptyLinePlaceholder":791},[755,1481,1482,1485,1487,1490,1492],{"class":757,"line":866},[755,1483,1484],{"class":823},"  setup",[755,1486,847],{"class":765},[755,1488,1489],{"class":850}," env",[755,1491,860],{"class":765},[755,1493,863],{"class":765},[755,1495,1496,1499,1501,1503,1505,1507,1510,1512,1514,1516,1519,1521],{"class":757,"line":896},[755,1497,1498],{"class":769},"    statsd",[755,1500,914],{"class":765},[755,1502,94],{"class":811},[755,1504,814],{"class":823},[755,1506,922],{"class":765},[755,1508,1509],{"class":823}," service",[755,1511,827],{"class":765},[755,1513,1489],{"class":769},[755,1515,914],{"class":765},[755,1517,1518],{"class":769},"service",[755,1520,773],{"class":765},[755,1522,943],{"class":823},[755,1524,1525],{"class":757,"line":946},[755,1526,949],{"class":765},[755,1528,1529],{"class":757,"line":952},[755,1530,792],{"emptyLinePlaceholder":791},[755,1532,1533,1535,1537,1539,1541],{"class":757,"line":967},[755,1534,955],{"class":823},[755,1536,847],{"class":765},[755,1538,960],{"class":850},[755,1540,860],{"class":765},[755,1542,863],{"class":765},[755,1544,1545,1547,1549,1552,1554,1557,1560,1563,1565,1567,1569,1572,1574,1576,1578,1580,1583,1587,1590,1592,1595,1597,1600,1602,1605],{"class":757,"line":993},[755,1546,899],{"class":761},[755,1548,902],{"class":823},[755,1550,1551],{"class":769},"event",[755,1553,914],{"class":765},[755,1555,1556],{"class":769},"durationMs",[755,1558,1559],{"class":765}," !==",[755,1561,1562],{"class":765}," undefined",[755,1564,908],{"class":823},[755,1566,1551],{"class":769},[755,1568,914],{"class":765},[755,1570,1571],{"class":769},"tier",[755,1573,875],{"class":765},[755,1575,960],{"class":769},[755,1577,914],{"class":765},[755,1579,1556],{"class":769},[755,1581,1582],{"class":765}," >",[755,1584,1586],{"class":1585},"sbssI"," 1000",[755,1588,1589],{"class":765}," ?",[755,1591,779],{"class":765},[755,1593,1594],{"class":782},"slow",[755,1596,835],{"class":765},[755,1598,1599],{"class":765}," :",[755,1601,779],{"class":765},[755,1603,1604],{"class":782},"fast",[755,1606,785],{"class":765},[755,1608,1609],{"class":757,"line":998},[755,1610,949],{"class":765},[755,1612,1614],{"class":757,"line":1613},13,[755,1615,792],{"emptyLinePlaceholder":791},[755,1617,1619,1622,1624,1626,1628],{"class":757,"line":1618},14,[755,1620,1621],{"class":823},"  drain",[755,1623,847],{"class":765},[755,1625,960],{"class":850},[755,1627,860],{"class":765},[755,1629,863],{"class":765},[755,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649],{"class":757,"line":1632},15,[755,1634,899],{"class":761},[755,1636,902],{"class":823},[755,1638,1551],{"class":769},[755,1640,914],{"class":765},[755,1642,1556],{"class":769},[755,1644,1559],{"class":765},[755,1646,1562],{"class":765},[755,1648,908],{"class":823},[755,1650,817],{"class":765},[755,1652,1654,1657,1659,1662,1664,1666,1669,1671,1673,1675,1677,1679,1681,1683,1686,1688,1690,1692,1695,1698,1702,1704],{"class":757,"line":1653},16,[755,1655,1656],{"class":769},"      statsd",[755,1658,914],{"class":765},[755,1660,1661],{"class":811},"timing",[755,1663,814],{"class":823},[755,1665,835],{"class":765},[755,1667,1668],{"class":782},"http.request",[755,1670,835],{"class":765},[755,1672,854],{"class":765},[755,1674,960],{"class":769},[755,1676,914],{"class":765},[755,1678,1556],{"class":769},[755,1680,854],{"class":765},[755,1682,766],{"class":765},[755,1684,1685],{"class":823}," path",[755,1687,827],{"class":765},[755,1689,960],{"class":769},[755,1691,914],{"class":765},[755,1693,1694],{"class":769},"path",[755,1696,1697],{"class":761}," as",[755,1699,1701],{"class":1700},"sBMFI"," string",[755,1703,773],{"class":765},[755,1705,943],{"class":823},[755,1707,1709],{"class":757,"line":1708},17,[755,1710,1711],{"class":765},"    }\n",[755,1713,1715],{"class":757,"line":1714},18,[755,1716,949],{"class":765},[755,1718,1720],{"class":757,"line":1719},19,[755,1721,792],{"emptyLinePlaceholder":791},[755,1723,1725,1727,1729,1731,1733,1736,1738],{"class":757,"line":1724},20,[755,1726,844],{"class":823},[755,1728,847],{"class":765},[755,1730,851],{"class":850},[755,1732,854],{"class":765},[755,1734,1735],{"class":850}," request",[755,1737,860],{"class":765},[755,1739,863],{"class":765},[755,1741,1743,1746,1748,1750,1752,1754,1757,1759,1761,1764,1766,1769,1771,1774,1777,1779,1781],{"class":757,"line":1742},21,[755,1744,1745],{"class":769},"    logger",[755,1747,914],{"class":765},[755,1749,917],{"class":811},[755,1751,814],{"class":823},[755,1753,922],{"class":765},[755,1755,1756],{"class":823}," trace",[755,1758,827],{"class":765},[755,1760,766],{"class":765},[755,1762,1763],{"class":823}," startedAt",[755,1765,827],{"class":765},[755,1767,1768],{"class":769}," Date",[755,1770,914],{"class":765},[755,1772,1773],{"class":811},"now",[755,1775,1776],{"class":823},"() ",[755,1778,1001],{"class":765},[755,1780,773],{"class":765},[755,1782,943],{"class":823},[755,1784,1786],{"class":757,"line":1785},22,[755,1787,949],{"class":765},[755,1789,1791],{"class":757,"line":1790},23,[755,1792,792],{"emptyLinePlaceholder":791},[755,1794,1796,1799,1801,1803,1805,1808,1810],{"class":757,"line":1795},24,[755,1797,1798],{"class":823},"  onRequestFinish",[755,1800,847],{"class":765},[755,1802,960],{"class":850},[755,1804,854],{"class":765},[755,1806,1807],{"class":850}," durationMs",[755,1809,860],{"class":765},[755,1811,863],{"class":765},[755,1813,1815,1817,1819,1821,1824,1826,1828,1830,1833,1836,1838,1841,1843,1846,1848,1850,1853,1856],{"class":757,"line":1814},25,[755,1816,899],{"class":761},[755,1818,902],{"class":823},[755,1820,1551],{"class":769},[755,1822,1823],{"class":765}," &&",[755,1825,902],{"class":823},[755,1827,1551],{"class":769},[755,1829,914],{"class":765},[755,1831,1832],{"class":769},"level",[755,1834,1835],{"class":765}," ===",[755,1837,779],{"class":765},[755,1839,1840],{"class":782},"error",[755,1842,835],{"class":765},[755,1844,1845],{"class":765}," ||",[755,1847,1807],{"class":769},[755,1849,1582],{"class":765},[755,1851,1852],{"class":1585}," 5000",[755,1854,1855],{"class":823},")) ",[755,1857,817],{"class":765},[755,1859,1861],{"class":757,"line":1860},26,[755,1862,1863],{"class":1167},"      \u002F\u002F alert \u002F forward \u002F etc.\n",[755,1865,1867],{"class":757,"line":1866},27,[755,1868,1711],{"class":765},[755,1870,1872],{"class":757,"line":1871},28,[755,1873,949],{"class":765},[755,1875,1877,1879],{"class":757,"line":1876},29,[755,1878,1001],{"class":765},[755,1880,943],{"class":769},[741,1882,1884],{"id":1883},"sugar-plugins","Sugar plugins",[621,1886,1887,1888,1890,1891,1893],{},"For single-hook extensions, the toolkit offers ",[624,1889,647],{}," and ",[624,1892,641],{}," wrappers:",[746,1895,1899],{"className":1896,"code":1897,"language":1898,"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,1900,1901,1925,1929,1958],{"__ignoreMap":751},[755,1902,1903,1905,1907,1910,1912,1915,1917,1919,1921,1923],{"class":757,"line":758},[755,1904,762],{"class":761},[755,1906,766],{"class":765},[755,1908,1909],{"class":769}," drainPlugin",[755,1911,854],{"class":765},[755,1913,1914],{"class":769}," enricherPlugin",[755,1916,773],{"class":765},[755,1918,776],{"class":761},[755,1920,779],{"class":765},[755,1922,1438],{"class":782},[755,1924,785],{"class":765},[755,1926,1927],{"class":757,"line":788},[755,1928,792],{"emptyLinePlaceholder":791},[755,1930,1931,1934,1937,1939,1941,1943,1945,1948,1950,1952,1955],{"class":757,"line":795},[755,1932,1933],{"class":801},"const",[755,1935,1936],{"class":769}," drainOnly ",[755,1938,808],{"class":765},[755,1940,1909],{"class":811},[755,1942,814],{"class":769},[755,1944,835],{"class":765},[755,1946,1947],{"class":782},"axiom",[755,1949,835],{"class":765},[755,1951,854],{"class":765},[755,1953,1954],{"class":811}," createAxiomDrain",[755,1956,1957],{"class":769},"())\n",[755,1959,1960,1962,1965,1967,1969,1971,1973,1976,1978,1980,1983],{"class":757,"line":820},[755,1961,1933],{"class":801},[755,1963,1964],{"class":769}," enricherOnly ",[755,1966,808],{"class":765},[755,1968,1914],{"class":811},[755,1970,814],{"class":769},[755,1972,835],{"class":765},[755,1974,1975],{"class":782},"user-agent",[755,1977,835],{"class":765},[755,1979,854],{"class":765},[755,1981,1982],{"class":811}," createUserAgentEnricher",[755,1984,1957],{"class":769},[621,1986,1987,1988,1991],{},"These are equivalent to a ",[624,1989,1990],{},"definePlugin({ name, drain | enrich })"," shape but read more clearly when intent is obvious.",[741,1993,1995],{"id":1994},"common-pitfalls","Common pitfalls",[662,1997,1998,2007,2018,2041],{},[665,1999,2000,2003,2004,2006],{},[629,2001,2002],{},"Don't throw from a hook."," The plugin runner catches and logs errors with the plugin name, but a thrown error from ",[624,2005,681],{}," won't propagate the event downstream. Keep hooks defensive.",[665,2008,2009,2014,2015,2017],{},[629,2010,2011,2013],{},[624,2012,684],{}," runs for every event",": not just per-request. If you only care about per-request lifecycle, use ",[624,2016,696],{}," instead.",[665,2019,2020,2025,2026,2029,2030,2033,2034,2037,2038,914],{},[629,2021,2022,2024],{},[624,2023,687],{}," mutates the logger object",": augment ",[624,2027,2028],{},"RequestLogger"," in a ",[624,2031,2032],{},".d.ts"," so ",[624,2035,2036],{},"useLogger(event)"," exposes the new methods to TypeScript. See ",[637,2039,2040],{"href":77},"typed fields",[665,2042,2043,2049,2050,2052],{},[629,2044,2045,2046],{},"Plugins are de-duplicated by ",[624,2047,2048],{},"name",". Re-registering with the same ",[624,2051,2048],{}," replaces the previous version (last registration wins).",[741,2054,2056],{"id":2055},"next-steps","Next steps",[662,2058,2059,2065,2071,2077],{},[665,2060,2061,2064],{},[637,2062,2063],{"href":527},"Custom Enrichers",": single-hook enrichment",[665,2066,2067,2070],{},[637,2068,2069],{"href":540},"Custom Drains",": single-destination output",[665,2072,2073,2076],{},[637,2074,2075],{"href":531},"Tail Sampling",": outcome-aware keep decisions",[665,2078,2079,2082],{},[637,2080,2081],{"href":535},"Identity Headers",": tag every drain request",[2084,2085,2086],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":751,"searchDepth":788,"depth":788,"links":2088},[2089,2090,2091,2092,2093,2094],{"id":743,"depth":788,"text":744},{"id":1178,"depth":788,"text":1241},{"id":1400,"depth":788,"text":1401},{"id":1883,"depth":788,"text":1884},{"id":1994,"depth":788,"text":1995},{"id":2055,"depth":788,"text":2056},"definePlugin is evlog's canonical extension point: opt into any subset of the lifecycle hooks from one cohesive object.","md",[2098,2101,2102],{"label":2063,"icon":443,"to":527,"color":2099,"variant":2100},"neutral","subtle",{"label":2069,"icon":542,"to":540,"color":2099,"variant":2100},{"label":2075,"icon":69,"to":531,"color":2099,"variant":2100},{},{"title":522,"icon":497},{"title":522,"description":2095},"aEy_At20tZ52v0Sa8rLmt4NbCoh45YTn5d0jO7kZShI",[2108,2110],{"title":415,"path":518,"stem":519,"description":2109,"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":2111,"icon":443,"children":-1},"Write an enricher that adds deployment metadata, tenant ids, feature flags, or anything computed. Error isolation and merging are handled.",1789294025894]