[{"data":1,"prerenderedAt":2545},["ShallowReactive",2],{"navigation_docs":3,"-cli-init":505,"-cli-init-surround":2540},[4,30,80,123,288,420,475],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"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",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113,118],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":94,"path":95,"stem":96,"icon":97},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":99,"path":100,"stem":101,"icon":102},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":104,"path":105,"stem":106,"icon":107},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":109,"path":110,"stem":111,"icon":112},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":114,"path":115,"stem":116,"icon":117},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":119,"path":120,"stem":121,"icon":122},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":124,"path":125,"stem":126,"children":127,"page":29},"Integrate","\u002Fintegrate","4.integrate",[128,132,200],{"title":36,"path":129,"stem":130,"icon":131},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,140,180],{"title":36,"path":138,"stem":139,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":141,"path":142,"stem":143,"children":144,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[145,150,155,160,165,170,175],{"title":146,"path":147,"stem":148,"icon":149},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":151,"path":152,"stem":153,"icon":154},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":156,"path":157,"stem":158,"icon":159},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":161,"path":162,"stem":163,"icon":164},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":166,"path":167,"stem":168,"icon":169},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":171,"path":172,"stem":173,"icon":174},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":176,"path":177,"stem":178,"icon":179},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":181,"path":182,"stem":183,"children":184,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[185,190,195],{"title":186,"path":187,"stem":188,"icon":189},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":191,"path":192,"stem":193,"icon":194},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":196,"path":197,"stem":198,"icon":199},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":201,"path":202,"stem":203,"children":204,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[205,209,214,219,224,229,234,239,244,249,254,259,264,269,273,278,283],{"title":36,"path":206,"stem":207,"icon":208},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":210,"path":211,"stem":212,"icon":213},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":215,"path":216,"stem":217,"icon":218},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":220,"path":221,"stem":222,"icon":223},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":225,"path":226,"stem":227,"icon":228},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":230,"path":231,"stem":232,"icon":233},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":235,"path":236,"stem":237,"icon":238},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":240,"path":241,"stem":242,"icon":243},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":245,"path":246,"stem":247,"icon":248},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":250,"path":251,"stem":252,"icon":253},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":255,"path":256,"stem":257,"icon":258},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":260,"path":261,"stem":262,"icon":263},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":265,"path":266,"stem":267,"icon":268},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":270,"path":271,"stem":272,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":274,"path":275,"stem":276,"icon":277},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":279,"path":280,"stem":281,"icon":282},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":284,"path":285,"stem":286,"icon":287},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":289,"path":290,"stem":291,"children":292,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[293,296,301,330,357,389,410,415],{"title":36,"path":294,"stem":295,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":297,"path":298,"stem":299,"icon":300},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[307,310,315,320,325],{"title":36,"path":308,"stem":309,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":311,"path":312,"stem":313,"icon":314},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":316,"path":317,"stem":318,"icon":319},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":321,"path":322,"stem":323,"icon":324},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":326,"path":327,"stem":328,"icon":329},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":331,"icon":332,"path":333,"stem":334,"children":335,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[336,339,344,349,353],{"title":36,"path":337,"stem":338,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":340,"path":341,"stem":342,"icon":343},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":345,"path":346,"stem":347,"icon":348},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":350,"path":351,"stem":352,"icon":300},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":354,"path":355,"stem":356,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":358,"icon":359,"path":360,"stem":361,"children":362,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[363,366,371,376,381,385],{"title":36,"path":364,"stem":365,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":367,"path":368,"stem":369,"icon":370},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":372,"path":373,"stem":374,"icon":375},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":377,"path":378,"stem":379,"icon":380},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":382,"path":383,"stem":384,"icon":359},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":386,"path":387,"stem":388,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":326,"icon":107,"path":390,"stem":391,"children":392,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[393,396,401,406],{"title":36,"path":394,"stem":395,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":397,"path":398,"stem":399,"icon":400},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":402,"path":403,"stem":404,"icon":405},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":407,"path":408,"stem":409,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":411,"path":412,"stem":413,"icon":414},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":416,"path":417,"stem":418,"icon":419},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":421,"path":422,"stem":423,"children":424,"page":29},"Extend","\u002Fextend","6.extend",[425,429,434,439,444,448,452,456,460,465,470],{"title":36,"path":426,"stem":427,"icon":428},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":430,"path":431,"stem":432,"icon":433},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":435,"path":436,"stem":437,"icon":438},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":440,"path":441,"stem":442,"icon":443},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":386,"path":445,"stem":446,"icon":447},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":449,"path":450,"stem":451,"icon":428},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":453,"path":454,"stem":455,"icon":414},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":457,"path":458,"stem":459,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":461,"path":462,"stem":463,"icon":464},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":466,"path":467,"stem":468,"icon":469},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":471,"path":472,"stem":473,"icon":474},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":407,"path":476,"stem":477,"children":478,"page":29},"\u002Freference","7.reference",[479,484,487,492,496,501],{"title":480,"path":481,"stem":482,"icon":483},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":354,"path":485,"stem":486,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":488,"path":489,"stem":490,"icon":491},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":493,"path":494,"stem":495,"icon":359},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":497,"path":498,"stem":499,"icon":500},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":502,"path":503,"stem":504,"icon":414},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":506,"title":507,"body":508,"description":2530,"extension":2531,"links":2532,"meta":2536,"navigation":2537,"path":90,"seo":2538,"stem":91,"__hash__":2539},"docs\u002F3.cli\u002F1.init.md","evlog init",{"type":509,"value":510,"toc":2509},"minimark",[511,522,548,551,560,567,572,623,626,630,633,715,718,722,725,784,851,868,872,877,905,908,915,922,926,930,954,1071,1074,1093,1222,1225,1240,1250,1340,1343,1354,1365,1369,1386,1535,1538,1612,1615,1624,1628,1728,1735,1739,1742,1837,1843,1855,1947,1951,1956,2072,2080,2084,2094,2122,2128,2132,2144,2285,2288,2299,2303,2481,2484,2505],[512,513,514,518,519,521],"p",{},[515,516,517],"code",{},"evlog map"," tells you which entry points are dark. ",[515,520,507],{}," is what you run before that — it does the setup the framework guide describes, in the project you are standing in.",[523,524,530],"pre",{"className":525,"code":526,"filename":527,"language":528,"meta":529,"style":529},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx @evlog\u002Fcli init\n","Terminal","bash","",[515,531,532],{"__ignoreMap":529},[533,534,537,541,545],"span",{"class":535,"line":536},"line",1,[533,538,540],{"class":539},"sBMFI","npx",[533,542,544],{"class":543},"sfazB"," @evlog\u002Fcli",[533,546,547],{"class":543}," init\n",[512,549,550],{},"On a terminal it reads your project, asks what it cannot infer, and shows you the plan before touching anything:",[523,552,558],{"className":553,"code":555,"filename":556,"language":557,"meta":529},[554],"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│  update  nuxt.config.ts                  │\n│  create  server\u002Fplugins\u002Fevlog-drain.ts   │\n│  create  server\u002Fplugins\u002Fevlog-enrich.ts  │\n│                                          │\n├──────────────────────────────────────────╯\n│\n◇  Apply?\n│  Yes\n│\n◇  4 ok · 1 warn · 0 fail\n│\n◇  Set these before anything is received ─────────────╮\n│                                                     │\n│  AXIOM_DATASET    dataset to write to               │\n│  AXIOM_API_KEY    API token with ingest permission  │\n│                                                     │\n├─────────────────────────────────────────────────────╯\n│\n│  verify  evlog doctor\n│  score   evlog map\n│\n└  Nuxt wired · evlog.dev\u002Fintegrate\u002Fframeworks\u002Fnuxt\n","Interactive","text",[515,559,555],{"__ignoreMap":529},[512,561,562,563,566],{},"The production picker is a fuzzy search — type ",[515,564,565],{},"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.",[568,569,571],"h2",{"id":570},"what-it-does","What it does",[573,574,575,589,602,608,614],"ol",{},[576,577,578,582,583,588],"li",{},[579,580,581],"strong",{},"Reads your project"," with the same analysis ",[584,585,586],"a",{"href":95},[515,587,517],{}," runs — framework, installed packages, errors you repeat, entry points with no audit trail. That is what the offers are built from.",[576,590,591,597,598,601],{},[579,592,593,594],{},"Installs ",[515,595,596],{},"evlog"," with the package manager your lockfile implies, unless it is already there. ",[515,599,600],{},"--no-install"," prints the command instead of running it.",[576,603,604,607],{},[579,605,606],{},"Registers the integration"," — the Nuxt module, the Nitro module, or the Next.js instrumentation files.",[576,609,610,613],{},[579,611,612],{},"Wires your destinations",", dev and production branched in one place, with batching, enrichers and sampling when you asked for them.",[576,615,616,622],{},[579,617,618,619],{},"Runs ",[515,620,621],{},"evlog doctor"," before it finishes, so the run answers \"did it work\" instead of telling you to go and check.",[512,624,625],{},"Everything it writes is reported line by line, including the parts that were already in place.",[568,627,629],{"id":628},"it-only-offers-what-it-can-back-up","It only offers what it can back up",[512,631,632],{},"An option that does not apply is not shown, and one that is shown says why:",[634,635,636,649],"table",{},[637,638,639],"thead",{},[640,641,642,646],"tr",{},[643,644,645],"th",{},"Offer",[643,647,648],{},"Appears when",[650,651,652,665,678,689,699,707],"tbody",{},[640,653,654,658],{},[655,656,657],"td",{},"Error catalog",[655,659,660,661,664],{},"The scan found the same ",[515,662,663],{},"createError"," in more than one file",[640,666,667,670],{},[655,668,669],{},"Audit actions",[655,671,672,674,675],{},[515,673,94],{}," flagged sensitive entry points with no ",[515,676,677],{},"log.audit()",[640,679,680,683],{},[655,681,682],{},"AI SDK logging",[655,684,685,688],{},[515,686,687],{},"ai"," is a dependency",[640,690,691,694],{},[655,692,693],{},"Auth identity",[655,695,696,688],{},[515,697,698],{},"better-auth",[640,700,701,704],{},[655,702,703],{},"Batching and retry",[655,705,706],{},"A production destination was picked — there is nothing to batch otherwise",[640,708,709,712],{},[655,710,711],{},"Vite plugin",[655,713,714],{},"The framework is Vite-based",[512,716,717],{},"Passing one of these as a flag against a project that cannot use it drops it and says so, rather than wiring something inert.",[568,719,721],{"id":720},"non-interactive","Non-interactive",[512,723,724],{},"Prompts are skipped — and every answer comes from flags and defaults — whenever anything suggests nobody is watching:",[634,726,727,737],{},[637,728,729],{},[640,730,731,734],{},[643,732,733],{},"Condition",[643,735,736],{},"Why",[650,738,739,749,759,767],{},[640,740,741,746],{},[655,742,743],{},[515,744,745],{},"--yes",[655,747,748],{},"You said so",[640,750,751,756],{},[655,752,753],{},[515,754,755],{},"--json",[655,757,758],{},"The payload is the contract; half a TUI in front of it helps nobody",[640,760,761,764],{},[655,762,763],{},"stdin or stdout is not a TTY",[655,765,766],{},"Piped, redirected, or spawned by a tool",[640,768,769,781],{},[655,770,771,773,774,777,778],{},[515,772,109],{}," is set to anything but ",[515,775,776],{},"false"," \u002F ",[515,779,780],{},"0",[655,782,783],{},"A workflow runner has no keyboard",[523,785,787],{"className":525,"code":786,"filename":527,"language":528,"meta":529,"style":529},"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",[515,788,789,811,831],{"__ignoreMap":529},[533,790,791,793,796,799,802,805,808],{"class":535,"line":536},[533,792,596],{"class":539},[533,794,795],{"class":543}," init",[533,797,798],{"class":543}," --yes",[533,800,801],{"class":543}," --prod-drain",[533,803,804],{"class":543}," axiom,sentry",[533,806,807],{"class":543}," --extras",[533,809,810],{"class":543}," pipeline,enrichers\n",[533,812,814,816,818,820,822,825,828],{"class":535,"line":813},2,[533,815,596],{"class":539},[533,817,795],{"class":543},[533,819,798],{"class":543},[533,821,807],{"class":543},[533,823,824],{"class":543}," sampling",[533,826,827],{"class":543}," --sampling",[533,829,830],{"class":543}," high\n",[533,832,834,836,838,841,844,847],{"class":535,"line":833},3,[533,835,596],{"class":539},[533,837,795],{"class":543},[533,839,840],{"class":543}," --json",[533,842,843],{"class":543}," --drain",[533,845,846],{"class":543}," none",[533,848,850],{"class":849},"sHwdD","          # plan and result as JSON, nothing to read\n",[852,853,856,859,860,863,864,867],"callout",{"color":854,"icon":855},"neutral","i-lucide-bot",[579,857,858],{},"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 ",[515,861,862],{},"--drain"," or ",[515,865,866],{},"--extras"," value stops the run rather than falling back to a default, because silently wiring the wrong destination is worse than a failed command.",[568,869,871],{"id":870},"it-will-not-overwrite-your-code","It will not overwrite your code",[512,873,874,876],{},[515,875,89],{}," appends; it never rewrites. Concretely:",[878,879,880,887,894],"ul",{},[576,881,882,883,886],{},"A config file is patched ",[579,884,885],{},"at the exact offsets"," of the node it is adding to. Your comments, quote style, and formatting survive — nothing is reprinted from an AST.",[576,888,889,890,893],{},"A file that already exists is left alone and reported as already present. There is no ",[515,891,892],{},"--force",".",[576,895,896,897,900,901,904],{},"Anything it cannot do safely becomes a ",[579,898,899],{},"manual step"," with the snippet to paste and the reason it stopped. A ",[515,902,903],{},"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.",[512,906,907],{},"Which makes it safe to run twice. The second run reports what is already wired and writes nothing:",[523,909,913],{"className":910,"code":911,"filename":912,"language":557,"meta":529},[554],"· nuxt.config.ts already registers evlog\u002Fnuxt\n· nuxt.config.ts already has an evlog block\n· server\u002Fplugins\u002Fevlog-drain.ts already exists\n","Output",[515,914,911],{"__ignoreMap":529},[512,916,917,918,921],{},"Use ",[515,919,920],{},"--dry-run"," first if you would rather see the plan before anything is touched.",[568,923,925],{"id":924},"per-framework","Per framework",[927,928,210],"h3",{"id":929},"nuxt",[512,931,932,933,936,937,939,940,942,943,946,947,949,950,953],{},"Adds ",[515,934,935],{},"'evlog\u002Fnuxt'"," to ",[515,938,903],{}," and an ",[515,941,596],{}," block with your service name. ",[515,944,945],{},"useLogger",", ",[515,948,663],{},", and ",[515,951,952],{},"parseError"," are auto-imported from there.",[523,955,960],{"className":956,"code":957,"filename":958,"language":959,"meta":529,"style":529},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@nuxt\u002Fui', 'evlog\u002Fnuxt'],\n  evlog: {\n    env: { service: 'checkout' },\n  },\n})\n","nuxt.config.ts","typescript",[515,961,962,983,1020,1030,1056,1062],{"__ignoreMap":529},[533,963,964,968,971,975,979],{"class":535,"line":536},[533,965,967],{"class":966},"s7zQu","export",[533,969,970],{"class":966}," default",[533,972,974],{"class":973},"s2Zo4"," defineNuxtConfig",[533,976,978],{"class":977},"sTEyZ","(",[533,980,982],{"class":981},"sMK4o","{\n",[533,984,985,989,992,995,998,1001,1003,1006,1009,1012,1014,1017],{"class":535,"line":813},[533,986,988],{"class":987},"swJcz","  modules",[533,990,991],{"class":981},":",[533,993,994],{"class":977}," [",[533,996,997],{"class":981},"'",[533,999,1000],{"class":543},"@nuxt\u002Fui",[533,1002,997],{"class":981},[533,1004,1005],{"class":981},",",[533,1007,1008],{"class":981}," '",[533,1010,1011],{"class":543},"evlog\u002Fnuxt",[533,1013,997],{"class":981},[533,1015,1016],{"class":977},"]",[533,1018,1019],{"class":981},",\n",[533,1021,1022,1025,1027],{"class":535,"line":833},[533,1023,1024],{"class":987},"  evlog",[533,1026,991],{"class":981},[533,1028,1029],{"class":981}," {\n",[533,1031,1033,1036,1038,1041,1044,1046,1048,1051,1053],{"class":535,"line":1032},4,[533,1034,1035],{"class":987},"    env",[533,1037,991],{"class":981},[533,1039,1040],{"class":981}," {",[533,1042,1043],{"class":987}," service",[533,1045,991],{"class":981},[533,1047,1008],{"class":981},[533,1049,1050],{"class":543},"checkout",[533,1052,997],{"class":981},[533,1054,1055],{"class":981}," },\n",[533,1057,1059],{"class":535,"line":1058},5,[533,1060,1061],{"class":981},"  },\n",[533,1063,1065,1068],{"class":535,"line":1064},6,[533,1066,1067],{"class":981},"}",[533,1069,1070],{"class":977},")\n",[927,1072,225],{"id":1073},"nitro",[512,1075,1076,1077,1080,1081,1084,1085,1088,1089,1092],{},"Adds the import and the module call, picking the subpath that matches your major — ",[515,1078,1079],{},"evlog\u002Fnitro\u002Fv3"," for Nitro 3, ",[515,1082,1083],{},"evlog\u002Fnitro"," for ",[515,1086,1087],{},"nitropack",". Creates ",[515,1090,1091],{},"nitro.config.ts"," when there is none.",[523,1094,1096],{"className":956,"code":1095,"filename":1091,"language":959,"meta":529,"style":529},"import { defineConfig } from 'nitro'\nimport evlog from 'evlog\u002Fnitro\u002Fv3'\n\nexport default defineConfig({\n  modules: [\n    evlog({\n      env: { service: 'api' },\n    }),\n  ],\n})\n",[515,1097,1098,1121,1137,1143,1155,1164,1173,1196,1207,1215],{"__ignoreMap":529},[533,1099,1100,1103,1105,1108,1111,1114,1116,1118],{"class":535,"line":536},[533,1101,1102],{"class":966},"import",[533,1104,1040],{"class":981},[533,1106,1107],{"class":977}," defineConfig",[533,1109,1110],{"class":981}," }",[533,1112,1113],{"class":966}," from",[533,1115,1008],{"class":981},[533,1117,1073],{"class":543},[533,1119,1120],{"class":981},"'\n",[533,1122,1123,1125,1128,1131,1133,1135],{"class":535,"line":813},[533,1124,1102],{"class":966},[533,1126,1127],{"class":977}," evlog ",[533,1129,1130],{"class":966},"from",[533,1132,1008],{"class":981},[533,1134,1079],{"class":543},[533,1136,1120],{"class":981},[533,1138,1139],{"class":535,"line":833},[533,1140,1142],{"emptyLinePlaceholder":1141},true,"\n",[533,1144,1145,1147,1149,1151,1153],{"class":535,"line":1032},[533,1146,967],{"class":966},[533,1148,970],{"class":966},[533,1150,1107],{"class":973},[533,1152,978],{"class":977},[533,1154,982],{"class":981},[533,1156,1157,1159,1161],{"class":535,"line":1058},[533,1158,988],{"class":987},[533,1160,991],{"class":981},[533,1162,1163],{"class":977}," [\n",[533,1165,1166,1169,1171],{"class":535,"line":1064},[533,1167,1168],{"class":973},"    evlog",[533,1170,978],{"class":977},[533,1172,982],{"class":981},[533,1174,1176,1179,1181,1183,1185,1187,1189,1192,1194],{"class":535,"line":1175},7,[533,1177,1178],{"class":987},"      env",[533,1180,991],{"class":981},[533,1182,1040],{"class":981},[533,1184,1043],{"class":987},[533,1186,991],{"class":981},[533,1188,1008],{"class":981},[533,1190,1191],{"class":543},"api",[533,1193,997],{"class":981},[533,1195,1055],{"class":981},[533,1197,1199,1202,1205],{"class":535,"line":1198},8,[533,1200,1201],{"class":981},"    }",[533,1203,1204],{"class":977},")",[533,1206,1019],{"class":981},[533,1208,1210,1213],{"class":535,"line":1209},9,[533,1211,1212],{"class":977},"  ]",[533,1214,1019],{"class":981},[533,1216,1218,1220],{"class":535,"line":1217},10,[533,1219,1067],{"class":981},[533,1221,1070],{"class":977},[927,1223,215],{"id":1224},"nextjs",[512,1226,1227,1228,1231,1232,1235,1236,1239],{},"Creates ",[515,1229,1230],{},"instrumentation.ts"," and ",[515,1233,1234],{},"lib\u002Fevlog.ts"," — under ",[515,1237,1238],{},"src\u002F"," when your app lives there, since Next only loads the one that matches.",[512,1241,1242,1243,1246,1247,1249],{},"Wrapping handlers stays yours: Next has no ambient request logger, so each route opts in with ",[515,1244,1245],{},"withEvlog()",". ",[515,1248,89],{}," prints the snippet.",[523,1251,1253],{"className":956,"code":1252,"filename":1234,"language":959,"meta":529,"style":529},"import { createEvlog } from 'evlog\u002Fnext'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'web',\n})\n",[515,1254,1255,1275,1279,1318,1334],{"__ignoreMap":529},[533,1256,1257,1259,1261,1264,1266,1268,1270,1273],{"class":535,"line":536},[533,1258,1102],{"class":966},[533,1260,1040],{"class":981},[533,1262,1263],{"class":977}," createEvlog",[533,1265,1110],{"class":981},[533,1267,1113],{"class":966},[533,1269,1008],{"class":981},[533,1271,1272],{"class":543},"evlog\u002Fnext",[533,1274,1120],{"class":981},[533,1276,1277],{"class":535,"line":813},[533,1278,1142],{"emptyLinePlaceholder":1141},[533,1280,1281,1283,1287,1289,1292,1294,1297,1299,1302,1304,1307,1309,1312,1314,1316],{"class":535,"line":833},[533,1282,967],{"class":966},[533,1284,1286],{"class":1285},"spNyl"," const",[533,1288,1040],{"class":981},[533,1290,1291],{"class":977}," withEvlog",[533,1293,1005],{"class":981},[533,1295,1296],{"class":977}," useLogger",[533,1298,1005],{"class":981},[533,1300,1301],{"class":977}," log",[533,1303,1005],{"class":981},[533,1305,1306],{"class":977}," createError ",[533,1308,1067],{"class":981},[533,1310,1311],{"class":981}," =",[533,1313,1263],{"class":973},[533,1315,978],{"class":977},[533,1317,982],{"class":981},[533,1319,1320,1323,1325,1327,1330,1332],{"class":535,"line":1032},[533,1321,1322],{"class":987},"  service",[533,1324,991],{"class":981},[533,1326,1008],{"class":981},[533,1328,1329],{"class":543},"web",[533,1331,997],{"class":981},[533,1333,1019],{"class":981},[533,1335,1336,1338],{"class":535,"line":1058},[533,1337,1067],{"class":981},[533,1339,1070],{"class":977},[927,1341,230],{"id":1342},"tanstack-start",[512,1344,1345,1346,1349,1350,1353],{},"Writes the Nitro v3 config with ",[515,1347,1348],{},"experimental.asyncContext"," enabled — without it ",[515,1351,1352],{},"useRequest()"," returns nothing and you get an install that looks complete and logs no business context.",[512,1355,1356,1357,1360,1361,1364],{},"The ",[515,1358,1359],{},"evlogErrorHandler"," middleware on your root route is a manual step: ",[515,1362,1363],{},"__root.tsx"," is a component file, and splicing into it is guesswork.",[568,1366,1368],{"id":1367},"destinations","Destinations",[512,1370,1371,1372,1374,1375,863,1378,1381,1382,1385],{},"Two questions rather than one list: nobody sends local development traffic to Axiom, and nobody reads production logs off the box's filesystem. ",[515,1373,862],{}," sets the development sink (",[515,1376,1377],{},"fs",[515,1379,1380],{},"none","); ",[515,1383,1384],{},"--prod-drain"," takes one or more hosted destinations.",[634,1387,1388,1401],{},[637,1389,1390],{},[640,1391,1392,1395,1398],{},[643,1393,1394],{},"Id",[643,1396,1397],{},"Destination",[643,1399,1400],{},"Needs",[650,1402,1403,1419,1436,1451,1465,1479,1493,1510,1524],{},[640,1404,1405,1409,1416],{},[655,1406,1407],{},[515,1408,1377],{},[655,1410,1411,1412,1415],{},"Local files under ",[515,1413,1414],{},".evlog\u002Flogs"," (dev default)",[655,1417,1418],{},"nothing",[640,1420,1421,1426,1428],{},[655,1422,1423],{},[515,1424,1425],{},"axiom",[655,1427,146],{},[655,1429,1430,946,1433],{},[515,1431,1432],{},"AXIOM_DATASET",[515,1434,1435],{},"AXIOM_API_KEY",[640,1437,1438,1443,1446],{},[655,1439,1440],{},[515,1441,1442],{},"otlp",[655,1444,1445],{},"Any OpenTelemetry collector",[655,1447,1448],{},[515,1449,1450],{},"OTEL_EXPORTER_OTLP_ENDPOINT",[640,1452,1453,1458,1460],{},[655,1454,1455],{},[515,1456,1457],{},"posthog",[655,1459,156],{},[655,1461,1462],{},[515,1463,1464],{},"POSTHOG_API_KEY",[640,1466,1467,1472,1474],{},[655,1468,1469],{},[515,1470,1471],{},"sentry",[655,1473,161],{},[655,1475,1476],{},[515,1477,1478],{},"SENTRY_DSN",[640,1480,1481,1486,1488],{},[655,1482,1483],{},[515,1484,1485],{},"better-stack",[655,1487,166],{},[655,1489,1490],{},[515,1491,1492],{},"BETTER_STACK_API_KEY",[640,1494,1495,1500,1502],{},[655,1496,1497],{},[515,1498,1499],{},"datadog",[655,1501,171],{},[655,1503,1504,946,1507],{},[515,1505,1506],{},"DATADOG_API_KEY",[515,1508,1509],{},"DATADOG_SITE",[640,1511,1512,1517,1519],{},[655,1513,1514],{},[515,1515,1516],{},"hyperdx",[655,1518,176],{},[655,1520,1521],{},[515,1522,1523],{},"HYPERDX_API_KEY",[640,1525,1526,1530,1533],{},[655,1527,1528],{},[515,1529,1380],{},[655,1531,1532],{},"Pretty console output only",[655,1534,1418],{},[512,1536,1537],{},"Picking several production destinations fans the same event out to each. The generated plugin branches on the environment in one place, so \"which drain runs where\" is never something to reconstruct:",[523,1539,1542],{"className":956,"code":1540,"filename":1541,"language":959,"meta":529,"style":529},"const drains = import.meta.dev\n  ? [createFsDrain()]\n  : [pipeline(createAxiomDrain()), pipeline(createSentryDrain())]\n","server\u002Fplugins\u002Fevlog-drain.ts",[515,1543,1544,1568,1581],{"__ignoreMap":529},[533,1545,1546,1549,1552,1555,1558,1560,1563,1565],{"class":535,"line":536},[533,1547,1548],{"class":1285},"const",[533,1550,1551],{"class":977}," drains ",[533,1553,1554],{"class":981},"=",[533,1556,1557],{"class":966}," import",[533,1559,893],{"class":981},[533,1561,1562],{"class":977},"meta",[533,1564,893],{"class":981},[533,1566,1567],{"class":977},"dev\n",[533,1569,1570,1573,1575,1578],{"class":535,"line":813},[533,1571,1572],{"class":981},"  ?",[533,1574,994],{"class":977},[533,1576,1577],{"class":973},"createFsDrain",[533,1579,1580],{"class":977},"()]\n",[533,1582,1583,1586,1588,1591,1593,1596,1599,1601,1604,1606,1609],{"class":535,"line":833},[533,1584,1585],{"class":981},"  :",[533,1587,994],{"class":977},[533,1589,1590],{"class":973},"pipeline",[533,1592,978],{"class":977},[533,1594,1595],{"class":973},"createAxiomDrain",[533,1597,1598],{"class":977},"())",[533,1600,1005],{"class":981},[533,1602,1603],{"class":973}," pipeline",[533,1605,978],{"class":977},[533,1607,1608],{"class":973},"createSentryDrain",[533,1610,1611],{"class":977},"())]\n",[512,1613,1614],{},"Batching wraps the network sends only — buffering a local file write adds latency to the one loop where you want the event on screen immediately.",[852,1616,1618,1623],{"color":854,"icon":1617},"i-lucide-key",[579,1619,1620,1622],{},[515,1621,89],{}," 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.",[568,1625,1627],{"id":1626},"extras","Extras",[634,1629,1630,1639],{},[637,1631,1632],{},[640,1633,1634,1636],{},[643,1635,1394],{},[643,1637,1638],{},"What you get",[650,1640,1641,1654,1663,1676,1686,1696,1705,1714],{},[640,1642,1643,1648],{},[655,1644,1645],{},[515,1646,1647],{},"enrichers",[655,1649,1650,1651,1204],{},"Pick from user agent, geo, request size, trace context (",[515,1652,1653],{},"--enrichers",[640,1655,1656,1660],{},[655,1657,1658],{},[515,1659,1590],{},[655,1661,1662],{},"Batching and retry instead of one HTTP call per request",[640,1664,1665,1670],{},[655,1666,1667],{},[515,1668,1669],{},"sampling",[655,1671,1672,1673,1204],{},"A rate profile, see below (",[515,1674,1675],{},"--sampling",[640,1677,1678,1683],{},[655,1679,1680],{},[515,1681,1682],{},"error-catalog",[655,1684,1685],{},"A typed catalog seeded with the errors you already repeat",[640,1687,1688,1693],{},[655,1689,1690],{},[515,1691,1692],{},"audit-catalog",[655,1694,1695],{},"Typed audit actions for the sensitive routes with no trail",[640,1697,1698,1702],{},[655,1699,1700],{},[515,1701,687],{},[655,1703,1704],{},"Token usage, tool calls and cost on AI SDK generations",[640,1706,1707,1711],{},[655,1708,1709],{},[515,1710,698],{},[655,1712,1713],{},"The signed-in user on every event",[640,1715,1716,1721],{},[655,1717,1718],{},[515,1719,1720],{},"vite",[655,1722,1723,1724,1727],{},"The Vite plugin that strips ",[515,1725,1726],{},"log.debug()"," from production builds",[512,1729,1730,1731,1734],{},"An extra that does not apply is dropped and reported, not refused — so ",[515,1732,1733],{},"--extras vite,enrichers"," does the right thing across a monorepo of mixed apps.",[927,1736,1738],{"id":1737},"sampling-presets","Sampling presets",[512,1740,1741],{},"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.",[634,1743,1744,1759],{},[637,1745,1746],{},[640,1747,1748,1750,1753,1756],{},[643,1749,1394],{},[643,1751,1752],{},"Info",[643,1754,1755],{},"Warnings",[643,1757,1758],{},"For",[650,1760,1761,1776,1792,1807,1822],{},[640,1762,1763,1768,1771,1773],{},[655,1764,1765],{},[515,1766,1767],{},"all",[655,1769,1770],{},"everything",[655,1772,1770],{},[655,1774,1775],{},"The right answer until volume or cost says otherwise",[640,1777,1778,1783,1786,1789],{},[655,1779,1780],{},[515,1781,1782],{},"low",[655,1784,1785],{},"50%",[655,1787,1788],{},"100%",[655,1790,1791],{},"A small app that has started to repeat itself",[640,1793,1794,1799,1802,1804],{},[655,1795,1796],{},[515,1797,1798],{},"medium",[655,1800,1801],{},"25%",[655,1803,1788],{},[655,1805,1806],{},"Steady traffic with a bill worth watching",[640,1808,1809,1814,1817,1819],{},[655,1810,1811],{},[515,1812,1813],{},"high",[655,1815,1816],{},"10%",[655,1818,1788],{},[655,1820,1821],{},"Info is most of what you are paying for",[640,1823,1824,1829,1832,1834],{},[655,1825,1826],{},[515,1827,1828],{},"very-high",[655,1830,1831],{},"1%",[655,1833,1785],{},[655,1835,1836],{},"Trends rather than individual requests",[512,1838,1839,1842],{},[579,1840,1841],{},"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.",[512,1844,1845,1851,1852,1854],{},[579,1846,1847,1850],{},[515,1848,1849],{},"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 ",[515,1853,1726],{}," anyway, so there is rarely volume there to sample.",[523,1856,1858],{"className":956,"code":1857,"filename":958,"language":959,"meta":529,"style":529},"evlog: {\n  env: { service: 'shop' },\n  sampling: {\n    rates: { info: 10, warn: 100, error: 100 },\n  },\n}\n",[515,1859,1860,1868,1890,1899,1938,1942],{"__ignoreMap":529},[533,1861,1862,1864,1866],{"class":535,"line":536},[533,1863,596],{"class":539},[533,1865,991],{"class":981},[533,1867,1029],{"class":981},[533,1869,1870,1873,1875,1877,1879,1881,1883,1886,1888],{"class":535,"line":813},[533,1871,1872],{"class":539},"  env",[533,1874,991],{"class":981},[533,1876,1040],{"class":981},[533,1878,1043],{"class":539},[533,1880,991],{"class":981},[533,1882,1008],{"class":981},[533,1884,1885],{"class":543},"shop",[533,1887,997],{"class":981},[533,1889,1055],{"class":981},[533,1891,1892,1895,1897],{"class":535,"line":833},[533,1893,1894],{"class":539},"  sampling",[533,1896,991],{"class":981},[533,1898,1029],{"class":981},[533,1900,1901,1904,1906,1908,1911,1913,1917,1919,1922,1924,1927,1929,1932,1934,1936],{"class":535,"line":1032},[533,1902,1903],{"class":539},"    rates",[533,1905,991],{"class":981},[533,1907,1040],{"class":981},[533,1909,1910],{"class":539}," info",[533,1912,991],{"class":981},[533,1914,1916],{"class":1915},"sbssI"," 10",[533,1918,1005],{"class":981},[533,1920,1921],{"class":539}," warn",[533,1923,991],{"class":981},[533,1925,1926],{"class":1915}," 100",[533,1928,1005],{"class":981},[533,1930,1931],{"class":539}," error",[533,1933,991],{"class":981},[533,1935,1926],{"class":1915},[533,1937,1055],{"class":981},[533,1939,1940],{"class":535,"line":1058},[533,1941,1061],{"class":981},[533,1943,1944],{"class":535,"line":1064},[533,1945,1946],{"class":981},"}\n",[927,1948,1950],{"id":1949},"catalogs-are-seeded-not-scaffolded","Catalogs are seeded, not scaffolded",[512,1952,1953,1955],{},[515,1954,1682],{}," does not write a template with the names filled in. It writes the errors your code already repeats, with the prose you already wrote:",[523,1957,1960],{"className":956,"code":1958,"filename":1959,"language":959,"meta":529,"style":529},"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",[515,1961,1962,1988,1993,2002,2014,2030,2046,2062,2066],{"__ignoreMap":529},[533,1963,1964,1966,1968,1971,1973,1976,1978,1980,1982,1984,1986],{"class":535,"line":536},[533,1965,967],{"class":966},[533,1967,1286],{"class":1285},[533,1969,1970],{"class":977}," shopErrors ",[533,1972,1554],{"class":981},[533,1974,1975],{"class":973}," defineErrorCatalog",[533,1977,978],{"class":977},[533,1979,997],{"class":981},[533,1981,1885],{"class":543},[533,1983,997],{"class":981},[533,1985,1005],{"class":981},[533,1987,1029],{"class":981},[533,1989,1990],{"class":535,"line":813},[533,1991,1992],{"class":849},"  \u002F** Currently written inline in server\u002Fapi\u002Fcheckout.post.ts, server\u002Fapi\u002Frefund.post.ts *\u002F\n",[533,1994,1995,1998,2000],{"class":535,"line":833},[533,1996,1997],{"class":987},"  CARD_DECLINED",[533,1999,991],{"class":981},[533,2001,1029],{"class":981},[533,2003,2004,2007,2009,2012],{"class":535,"line":1032},[533,2005,2006],{"class":987},"    status",[533,2008,991],{"class":981},[533,2010,2011],{"class":1915}," 402",[533,2013,1019],{"class":981},[533,2015,2016,2019,2021,2023,2026,2028],{"class":535,"line":1058},[533,2017,2018],{"class":987},"    message",[533,2020,991],{"class":981},[533,2022,1008],{"class":981},[533,2024,2025],{"class":543},"Card declined",[533,2027,997],{"class":981},[533,2029,1019],{"class":981},[533,2031,2032,2035,2037,2039,2042,2044],{"class":535,"line":1064},[533,2033,2034],{"class":987},"    why",[533,2036,991],{"class":981},[533,2038,1008],{"class":981},[533,2040,2041],{"class":543},"The issuer refused it",[533,2043,997],{"class":981},[533,2045,1019],{"class":981},[533,2047,2048,2051,2053,2055,2058,2060],{"class":535,"line":1175},[533,2049,2050],{"class":987},"    fix",[533,2052,991],{"class":981},[533,2054,1008],{"class":981},[533,2056,2057],{"class":543},"TODO: what they should do about it",[533,2059,997],{"class":981},[533,2061,1019],{"class":981},[533,2063,2064],{"class":535,"line":1198},[533,2065,1061],{"class":981},[533,2067,2068,2070],{"class":535,"line":1209},[533,2069,1067],{"class":981},[533,2071,1070],{"class":977},[512,2073,2074,2076,2077,2079],{},[515,2075,1692],{}," works the same way, naming an action per entry point ",[515,2078,94],{}," 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.",[568,2081,2083],{"id":2082},"monorepos","Monorepos",[512,2085,2086,2087,2089,2090,2093],{},"Run from a workspace root and ",[515,2088,89],{}," 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 ",[515,2091,2092],{},"utils"," package has no entry points to instrument — and asks which to wire:",[523,2095,2097],{"className":525,"code":2096,"filename":527,"language":528,"meta":529,"style":529},"evlog init                            # pick from the list\nevlog init --yes --apps apps\u002Fweb,apps\u002Fapi\n",[515,2098,2099,2108],{"__ignoreMap":529},[533,2100,2101,2103,2105],{"class":535,"line":536},[533,2102,596],{"class":539},[533,2104,795],{"class":543},[533,2106,2107],{"class":849},"                            # pick from the list\n",[533,2109,2110,2112,2114,2116,2119],{"class":535,"line":813},[533,2111,596],{"class":539},[533,2113,795],{"class":543},[533,2115,798],{"class":543},[533,2117,2118],{"class":543}," --apps",[533,2120,2121],{"class":543}," apps\u002Fweb,apps\u002Fapi\n",[512,2123,2124,2125,893],{},"Each app keeps its own service name, taken from its ",[515,2126,2127],{},"package.json",[568,2129,2131],{"id":2130},"the-local-sink","The local sink",[512,2133,2134,2135,2137,2138,2140,2141,991],{},"On Nitro-based apps ",[515,2136,89],{}," writes a drain plugin; on Next.js it adds the drain to ",[515,2139,1234],{},". The filesystem drain — and only that one — is ",[579,2142,2143],{},"gated to development",[523,2145,2147],{"className":956,"code":2146,"filename":1541,"language":959,"meta":529,"style":529},"import { createFsDrain } from 'evlog\u002Ffs'\n\nconst drain = createFsDrain()\n\nexport default defineNitroPlugin((nitroApp) => {\n  \u002F\u002F Local files are a development convenience — never a production sink.\n  if (!import.meta.dev) return\n  nitroApp.hooks.hook('evlog:drain', drain)\n})\n",[515,2148,2149,2169,2173,2187,2191,2215,2220,2248,2279],{"__ignoreMap":529},[533,2150,2151,2153,2155,2158,2160,2162,2164,2167],{"class":535,"line":536},[533,2152,1102],{"class":966},[533,2154,1040],{"class":981},[533,2156,2157],{"class":977}," createFsDrain",[533,2159,1110],{"class":981},[533,2161,1113],{"class":966},[533,2163,1008],{"class":981},[533,2165,2166],{"class":543},"evlog\u002Ffs",[533,2168,1120],{"class":981},[533,2170,2171],{"class":535,"line":813},[533,2172,1142],{"emptyLinePlaceholder":1141},[533,2174,2175,2177,2180,2182,2184],{"class":535,"line":833},[533,2176,1548],{"class":1285},[533,2178,2179],{"class":977}," drain ",[533,2181,1554],{"class":981},[533,2183,2157],{"class":973},[533,2185,2186],{"class":977},"()\n",[533,2188,2189],{"class":535,"line":1032},[533,2190,1142],{"emptyLinePlaceholder":1141},[533,2192,2193,2195,2197,2200,2202,2204,2208,2210,2213],{"class":535,"line":1058},[533,2194,967],{"class":966},[533,2196,970],{"class":966},[533,2198,2199],{"class":973}," defineNitroPlugin",[533,2201,978],{"class":977},[533,2203,978],{"class":981},[533,2205,2207],{"class":2206},"sHdIc","nitroApp",[533,2209,1204],{"class":981},[533,2211,2212],{"class":1285}," =>",[533,2214,1029],{"class":981},[533,2216,2217],{"class":535,"line":1064},[533,2218,2219],{"class":849},"  \u002F\u002F Local files are a development convenience — never a production sink.\n",[533,2221,2222,2225,2228,2231,2233,2235,2237,2239,2242,2245],{"class":535,"line":1175},[533,2223,2224],{"class":966},"  if",[533,2226,2227],{"class":987}," (",[533,2229,2230],{"class":981},"!",[533,2232,1102],{"class":966},[533,2234,893],{"class":981},[533,2236,1562],{"class":977},[533,2238,893],{"class":981},[533,2240,2241],{"class":977},"dev",[533,2243,2244],{"class":987},") ",[533,2246,2247],{"class":966},"return\n",[533,2249,2250,2253,2255,2258,2260,2263,2265,2267,2270,2272,2274,2277],{"class":535,"line":1198},[533,2251,2252],{"class":977},"  nitroApp",[533,2254,893],{"class":981},[533,2256,2257],{"class":977},"hooks",[533,2259,893],{"class":981},[533,2261,2262],{"class":973},"hook",[533,2264,978],{"class":987},[533,2266,997],{"class":981},[533,2268,2269],{"class":543},"evlog:drain",[533,2271,997],{"class":981},[533,2273,1005],{"class":981},[533,2275,2276],{"class":977}," drain",[533,2278,1070],{"class":987},[533,2280,2281,2283],{"class":535,"line":1209},[533,2282,1067],{"class":981},[533,2284,1070],{"class":977},[512,2286,2287],{},"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.",[512,2289,2290,2291,2293,2294,2298],{},"The directory it writes to is ",[515,2292,1414],{},", and evlog gitignores it on first write. It is also what ",[584,2295,2296],{"href":115},[515,2297,621],{}," looks for.",[568,2300,2302],{"id":2301},"flags","Flags",[634,2304,2305,2314],{},[637,2306,2307],{},[640,2308,2309,2312],{},[643,2310,2311],{},"Flag",[643,2313,571],{},[650,2315,2316,2328,2347,2357,2372,2382,2392,2414,2434,2444,2453,2462,2472],{},[640,2317,2318,2325],{},[655,2319,2320,946,2322],{},[515,2321,745],{},[515,2323,2324],{},"-y",[655,2326,2327],{},"Skip every question and take the defaults",[640,2329,2330,2335],{},[655,2331,2332],{},[515,2333,2334],{},"--framework \u003Cname>",[655,2336,2337,2338,946,2340,946,2342,946,2345,1204],{},"Override detection (",[515,2339,929],{},[515,2341,1073],{},[515,2343,2344],{},"next",[515,2346,1342],{},[640,2348,2349,2354],{},[655,2350,2351],{},[515,2352,2353],{},"--service \u003Cname>",[655,2355,2356],{},"Service name on every wide event (default: your package name, unscoped)",[640,2358,2359,2364],{},[655,2360,2361],{},[515,2362,2363],{},"--drain \u003Cid>",[655,2365,2366,2367,2369,2370],{},"Development sink: ",[515,2368,1377],{}," (default) or ",[515,2371,1380],{},[640,2373,2374,2379],{},[655,2375,2376],{},[515,2377,2378],{},"--prod-drain \u003Ca,b>",[655,2380,2381],{},"Production destinations — see the table above",[640,2383,2384,2389],{},[655,2385,2386],{},[515,2387,2388],{},"--extras \u003Ca,b>",[655,2390,2391],{},"Comma-separated, see Extras",[640,2393,2394,2399],{},[655,2395,2396],{},[515,2397,2398],{},"--enrichers \u003Ca,b>",[655,2400,2401,946,2404,946,2407,946,2410,2413],{},[515,2402,2403],{},"user-agent",[515,2405,2406],{},"geo",[515,2408,2409],{},"request-size",[515,2411,2412],{},"trace-context"," (default: all)",[640,2415,2416,2421],{},[655,2417,2418],{},[515,2419,2420],{},"--sampling \u003Cid>",[655,2422,2423,946,2425,946,2427,2429,2430,946,2432],{},[515,2424,1767],{},[515,2426,1782],{},[515,2428,1798],{}," (default), ",[515,2431,1813],{},[515,2433,1828],{},[640,2435,2436,2441],{},[655,2437,2438],{},[515,2439,2440],{},"--apps \u003Ca,b>",[655,2442,2443],{},"Workspace packages to set up (monorepo root only)",[640,2445,2446,2450],{},[655,2447,2448],{},[515,2449,920],{},[655,2451,2452],{},"Print the plan, write nothing",[640,2454,2455,2459],{},[655,2456,2457],{},[515,2458,600],{},[655,2460,2461],{},"Do not run the package manager; print the command instead",[640,2463,2464,2469],{},[655,2465,2466],{},[515,2467,2468],{},"--cwd \u003Cdir>",[655,2470,2471],{},"Set up another app in the workspace",[640,2473,2474,2478],{},[655,2475,2476],{},[515,2477,755],{},[655,2479,2480],{},"The plan and result as JSON on stdout (implies non-interactive)",[568,2482,2483],{"id":2344},"Next",[878,2485,2486,2493,2500],{},[576,2487,2488,2492],{},[584,2489,2490],{"href":115},[515,2491,621],{}," — confirm the wiring resolves and logs are being written",[576,2494,2495,2499],{},[584,2496,2497],{"href":95},[515,2498,517],{}," — score what is still dark now that evlog is in place",[576,2501,2502,2504],{},[584,2503,25],{"href":26}," — the concepts behind the wiring",[2506,2507,2508],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":529,"searchDepth":813,"depth":813,"links":2510},[2511,2512,2513,2514,2515,2521,2522,2526,2527,2528,2529],{"id":570,"depth":813,"text":571},{"id":628,"depth":813,"text":629},{"id":720,"depth":813,"text":721},{"id":870,"depth":813,"text":871},{"id":924,"depth":813,"text":925,"children":2516},[2517,2518,2519,2520],{"id":929,"depth":833,"text":210},{"id":1073,"depth":833,"text":225},{"id":1224,"depth":833,"text":215},{"id":1342,"depth":833,"text":230},{"id":1367,"depth":813,"text":1368},{"id":1626,"depth":813,"text":1627,"children":2523},[2524,2525],{"id":1737,"depth":833,"text":1738},{"id":1949,"depth":833,"text":1950},{"id":2082,"depth":813,"text":2083},{"id":2130,"depth":813,"text":2131},{"id":2301,"depth":813,"text":2302},{"id":2344,"depth":813,"text":2483},"Wire evlog into an existing app — an interactive setup that installs the package, registers the framework integration, and wires the destination you pick. Fully driveable by flags for CI and agents.","md",[2533,2535],{"label":20,"icon":23,"to":21,"color":854,"variant":2534},"subtle",{"label":517,"icon":97,"to":95,"color":854,"variant":2534},{},{"title":89,"icon":92},{"title":507,"description":2530},"aPiMXT7QqtHny0E9NWtzr6XtuyHtipw3UFBxUUh7ZMg",[2541,2543],{"title":36,"path":86,"stem":87,"description":2542,"icon":44,"children":-1},"The evlog command line — map your app's observability coverage, diagnose your setup, and control telemetry. Install, global flags, output streams, exit codes, and monorepo behaviour.",{"title":94,"path":95,"stem":96,"description":2544,"icon":97,"children":-1},"A static observability score for your app, Lighthouse-style. Scans every entry point in a Nuxt, Nitro, Next.js, or TanStack Start project, scores wide-event coverage, and names the entry points to fix first.",1785255161517]