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