[{"data":1,"prerenderedAt":6111},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-nextjs":598,"-integrate-frameworks-nextjs-surround":6106},[4,35,85,138,318,453,475,534,573],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"path":455,"stem":456,"children":457,"page":34},"Libraries","\u002Flibraries","6.libraries",[458,462,467,470],{"title":41,"path":459,"stem":460,"icon":461},"\u002Flibraries\u002Foverview","6.libraries\u002F0.overview","i-lucide-package",{"title":463,"path":464,"stem":465,"icon":466},"Emitting Events","\u002Flibraries\u002Femitting","6.libraries\u002F1.emitting","i-lucide-radio",{"title":56,"path":468,"stem":469,"icon":59},"\u002Flibraries\u002Ferrors","6.libraries\u002F2.errors",{"title":471,"path":472,"stem":473,"icon":474},"Testing","\u002Flibraries\u002Ftesting","6.libraries\u002F3.testing","i-lucide-flask-conical",{"title":476,"path":477,"stem":478,"children":479,"page":34},"Extend","\u002Fextend","7.extend",[480,484,489,494,498,503,507,511,515,519,524,529],{"title":41,"path":481,"stem":482,"icon":483},"\u002Fextend\u002Foverview","7.extend\u002F0.overview","i-lucide-blocks",{"title":485,"path":486,"stem":487,"icon":488},"Stream","\u002Fextend\u002Fstream","7.extend\u002F1.stream","i-lucide-radio-tower",{"title":490,"path":491,"stem":492,"icon":493},"Custom framework","\u002Fextend\u002Fcustom-framework","7.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":495,"path":496,"stem":497,"icon":488},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","7.extend\u002F11.diagnostics-channel",{"title":499,"path":500,"stem":501,"icon":502},"FS reader","\u002Fextend\u002Ffs-reader","7.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":504,"stem":505,"icon":506},"\u002Fextend\u002Fconsumer-recipes","7.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":508,"path":509,"stem":510,"icon":483},"Plugins","\u002Fextend\u002Fplugins","7.extend\u002F4.plugins",{"title":512,"path":513,"stem":514,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","7.extend\u002F5.custom-enrichers",{"title":516,"path":517,"stem":518,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","7.extend\u002F6.tail-sampling",{"title":520,"path":521,"stem":522,"icon":523},"Identity headers","\u002Fextend\u002Fidentity-headers","7.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":525,"path":526,"stem":527,"icon":528},"Custom drains","\u002Fextend\u002Fcustom-drains","7.extend\u002F8.custom-drains","i-lucide-share-2",{"title":530,"path":531,"stem":532,"icon":533},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","7.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":535,"stem":536,"children":537,"page":34},"\u002Freference","8.reference",[538,542,547,550,555,559,564,568],{"title":41,"path":539,"stem":540,"icon":541},"\u002Freference\u002Foverview","8.reference\u002F0.overview","i-lucide-book-marked",{"title":543,"path":544,"stem":545,"icon":546},"Configuration","\u002Freference\u002Fconfiguration","8.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":548,"stem":549,"icon":112},"\u002Freference\u002Fperformance","8.reference\u002F2.performance",{"title":551,"path":552,"stem":553,"icon":554},"Vite Plugin","\u002Freference\u002Fvite-plugin","8.reference\u002F3.vite-plugin","i-custom-vite",{"title":556,"path":557,"stem":558,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","8.reference\u002F4.best-practices",{"title":560,"path":561,"stem":562,"icon":563},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","8.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":565,"path":566,"stem":567,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","8.reference\u002F6.agent-skills",{"title":569,"path":570,"stem":571,"icon":572},"Cost","\u002Freference\u002Fcost","8.reference\u002F7.cost","i-lucide-receipt",{"title":574,"path":575,"stem":576,"children":577,"page":34},"Compare","\u002Fcompare","9.compare",[578,582,586,590,594],{"title":579,"path":580,"stem":581,"icon":563},"evlog vs Pino","\u002Fcompare\u002Fpino","9.compare\u002F1.pino",{"title":583,"path":584,"stem":585,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","9.compare\u002F2.opentelemetry",{"title":587,"path":588,"stem":589,"icon":563},"evlog vs LogTape","\u002Fcompare\u002Flogtape","9.compare\u002F3.logtape",{"title":591,"path":592,"stem":593,"icon":563},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","9.compare\u002F4.winston",{"title":595,"path":596,"stem":597,"icon":563},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","9.compare\u002F5.consola",{"id":599,"title":245,"body":600,"description":6097,"extension":6098,"links":6099,"meta":6102,"navigation":6103,"path":246,"seo":6104,"stem":247,"__hash__":6105},"docs\u002F4.integrate\u002Fframeworks\u002F02.nextjs.md",{"type":601,"value":602,"toc":6068},"minimark",[603,620,667,671,676,747,751,870,874,1022,1026,1041,1087,1091,1113,1131,1219,1331,1335,1348,1352,1359,1585,1596,1599,1637,1672,1675,1706,1750,1756,1827,1902,1906,1912,2741,2766,2769,2772,3150,3153,3233,3240,3259,3435,3439,3457,3928,3937,4063,4066,4217,4221,4234,4535,4548,4551,4567,4573,4776,4780,4783,5008,5013,5016,5029,5114,5127,5131,5136,5283,5287,5294,5482,5485,5491,5733,5737,5743,5874,5877,5961,5965,6007,6015,6025,6029,6035,6064],[604,605,606,607,611,612,615,616,619],"p",{},"evlog integrates with Next.js App Router via a ",[608,609,610],"code",{},"createEvlog()"," factory that provides ",[608,613,614],{},"withEvlog()"," handler wrapper, ",[608,617,618],{},"useLogger()",", and typed exports. One file, zero global state.",[621,622,625,628,653],"prompt",{":actions":623,"description":624,"icon":248},"[\"copy\",\"cursor\",\"claude\"]","Set up evlog in my Next.js app",[604,626,627],{},"Set up evlog in my Next.js app with wide events and structured errors.",[629,630,631,635,638,641,644,647,650],"ul",{},[632,633,634],"li",{},"Install evlog: pnpm add evlog",[632,636,637],{},"Create lib\u002Fevlog.ts with createEvlog() to export withEvlog, useLogger, createError",[632,639,640],{},"Set service name and optional sampling\u002Fdrain config",[632,642,643],{},"Wrap API route handlers with withEvlog()",[632,645,646],{},"Use useLogger() inside handlers to build wide events with log.set()",[632,648,649],{},"Throw errors with createError({ message, status, why, fix })",[632,651,652],{},"Wide events are auto-emitted when each request completes",[604,654,655,656,662,663],{},"Docs: ",[657,658,659],"a",{"href":659,"rel":660},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Fnextjs",[661],"nofollow","\nAdapters: ",[657,664,665],{"href":665,"rel":666},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[661],[668,669,25],"h2",{"id":670},"quick-start",[672,673,675],"h3",{"id":674},"_1-install","1. Install",[677,678,679,704,718,732],"code-group",{},[680,681,687],"pre",{"className":682,"code":683,"filename":684,"language":685,"meta":686,"style":686},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[608,688,689],{"__ignoreMap":686},[690,691,694,697,701],"span",{"class":692,"line":693},"line",1,[690,695,684],{"class":696},"sBMFI",[690,698,700],{"class":699},"sfazB"," add",[690,702,703],{"class":699}," evlog\n",[680,705,708],{"className":682,"code":706,"filename":707,"language":685,"meta":686,"style":686},"bun add evlog\n","bun",[608,709,710],{"__ignoreMap":686},[690,711,712,714,716],{"class":692,"line":693},[690,713,707],{"class":696},[690,715,700],{"class":699},[690,717,703],{"class":699},[680,719,722],{"className":682,"code":720,"filename":721,"language":685,"meta":686,"style":686},"yarn add evlog\n","yarn",[608,723,724],{"__ignoreMap":686},[690,725,726,728,730],{"class":692,"line":693},[690,727,721],{"class":696},[690,729,700],{"class":699},[690,731,703],{"class":699},[680,733,736],{"className":682,"code":734,"filename":735,"language":685,"meta":686,"style":686},"npm install evlog\n","npm",[608,737,738],{"__ignoreMap":686},[690,739,740,742,745],{"class":692,"line":693},[690,741,735],{"class":696},[690,743,744],{"class":699}," install",[690,746,703],{"class":699},[672,748,750],{"id":749},"_2-create-your-evlog-instance","2. Create your evlog instance",[680,752,757],{"className":753,"code":754,"filename":755,"language":756,"meta":686,"style":686},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createEvlog } from 'evlog\u002Fnext'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n})\n","lib\u002Fevlog.ts","typescript",[608,758,759,788,795,841,862],{"__ignoreMap":686},[690,760,761,765,769,773,776,779,782,785],{"class":692,"line":693},[690,762,764],{"class":763},"s7zQu","import",[690,766,768],{"class":767},"sMK4o"," {",[690,770,772],{"class":771},"sTEyZ"," createEvlog",[690,774,775],{"class":767}," }",[690,777,778],{"class":763}," from",[690,780,781],{"class":767}," '",[690,783,784],{"class":699},"evlog\u002Fnext",[690,786,787],{"class":767},"'\n",[690,789,791],{"class":692,"line":790},2,[690,792,794],{"emptyLinePlaceholder":793},true,"\n",[690,796,798,801,805,807,810,813,816,818,821,823,826,829,832,835,838],{"class":692,"line":797},3,[690,799,800],{"class":763},"export",[690,802,804],{"class":803},"spNyl"," const",[690,806,768],{"class":767},[690,808,809],{"class":771}," withEvlog",[690,811,812],{"class":767},",",[690,814,815],{"class":771}," useLogger",[690,817,812],{"class":767},[690,819,820],{"class":771}," log",[690,822,812],{"class":767},[690,824,825],{"class":771}," createError ",[690,827,828],{"class":767},"}",[690,830,831],{"class":767}," =",[690,833,772],{"class":834},"s2Zo4",[690,836,837],{"class":771},"(",[690,839,840],{"class":767},"{\n",[690,842,844,848,851,853,856,859],{"class":692,"line":843},4,[690,845,847],{"class":846},"swJcz","  service",[690,849,850],{"class":767},":",[690,852,781],{"class":767},[690,854,855],{"class":699},"my-app",[690,857,858],{"class":767},"'",[690,860,861],{"class":767},",\n",[690,863,865,867],{"class":692,"line":864},5,[690,866,828],{"class":767},[690,868,869],{"class":771},")\n",[672,871,873],{"id":872},"_3-wrap-a-route-handler","3. Wrap a route handler",[680,875,878],{"className":753,"code":876,"filename":877,"language":756,"meta":686,"style":686},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const GET = withEvlog(async () => {\n  const log = useLogger()\n  log.set({ action: 'hello' })\n  return Response.json({ message: 'Hello!' })\n})\n","app\u002Fapi\u002Fhello\u002Froute.ts",[608,879,880,903,907,935,949,981,1015],{"__ignoreMap":686},[690,881,882,884,886,888,890,892,894,896,898,901],{"class":692,"line":693},[690,883,764],{"class":763},[690,885,768],{"class":767},[690,887,809],{"class":771},[690,889,812],{"class":767},[690,891,815],{"class":771},[690,893,775],{"class":767},[690,895,778],{"class":763},[690,897,781],{"class":767},[690,899,900],{"class":699},"@\u002Flib\u002Fevlog",[690,902,787],{"class":767},[690,904,905],{"class":692,"line":790},[690,906,794],{"emptyLinePlaceholder":793},[690,908,909,911,913,916,919,921,923,926,929,932],{"class":692,"line":797},[690,910,800],{"class":763},[690,912,804],{"class":803},[690,914,915],{"class":771}," GET ",[690,917,918],{"class":767},"=",[690,920,809],{"class":834},[690,922,837],{"class":771},[690,924,925],{"class":803},"async",[690,927,928],{"class":767}," ()",[690,930,931],{"class":803}," =>",[690,933,934],{"class":767}," {\n",[690,936,937,940,942,944,946],{"class":692,"line":843},[690,938,939],{"class":803},"  const",[690,941,820],{"class":771},[690,943,831],{"class":767},[690,945,815],{"class":834},[690,947,948],{"class":846},"()\n",[690,950,951,954,957,960,962,965,968,970,972,975,977,979],{"class":692,"line":864},[690,952,953],{"class":771},"  log",[690,955,956],{"class":767},".",[690,958,959],{"class":834},"set",[690,961,837],{"class":846},[690,963,964],{"class":767},"{",[690,966,967],{"class":846}," action",[690,969,850],{"class":767},[690,971,781],{"class":767},[690,973,974],{"class":699},"hello",[690,976,858],{"class":767},[690,978,775],{"class":767},[690,980,869],{"class":846},[690,982,984,987,990,992,995,997,999,1002,1004,1006,1009,1011,1013],{"class":692,"line":983},6,[690,985,986],{"class":763},"  return",[690,988,989],{"class":771}," Response",[690,991,956],{"class":767},[690,993,994],{"class":834},"json",[690,996,837],{"class":846},[690,998,964],{"class":767},[690,1000,1001],{"class":846}," message",[690,1003,850],{"class":767},[690,1005,781],{"class":767},[690,1007,1008],{"class":699},"Hello!",[690,1010,858],{"class":767},[690,1012,775],{"class":767},[690,1014,869],{"class":846},[690,1016,1018,1020],{"class":692,"line":1017},7,[690,1019,828],{"class":767},[690,1021,869],{"class":771},[668,1023,1025],{"id":1024},"instrumentation","Instrumentation",[604,1027,1028,1029,1036,1037,1040],{},"Next.js supports an ",[657,1030,1033],{"href":1031,"rel":1032},"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fguides\u002Finstrumentation",[661],[608,1034,1035],{},"instrumentation.ts"," file at the project root for server startup hooks and error reporting. evlog provides ",[608,1038,1039],{},"createInstrumentation()"," to integrate with this pattern.",[1042,1043,1045,1048],"callout",{"color":1044,"icon":13},"info",[604,1046,1047],{},"These two APIs serve different purposes and can be used independently or together:",[629,1049,1050,1060,1075],{},[632,1051,1052,1057,1058],{},[1053,1054,1055],"strong",{},[608,1056,610],{},": per-request wide events via ",[608,1059,614],{},[632,1061,1062,1066,1067,1070,1071,1074],{},[1053,1063,1064],{},[608,1065,1039],{},": server startup (",[608,1068,1069],{},"register()",") + unhandled error reporting (",[608,1072,1073],{},"onRequestError()",") across all routes, including SSR and RSC",[632,1076,1077,1078,1080,1081,1083,1084,956],{},"Both can coexist: ",[608,1079,1069],{}," initializes and locks the logger first, so ",[608,1082,610],{}," respects it. Each can have its own ",[608,1085,1086],{},"drain",[672,1088,1090],{"id":1089},"_1-split-instrumentation-from-route-config","1. Split instrumentation from route config",[604,1092,1093,1094,1097,1098,1100,1101,1104,1105,1108,1109,1112],{},"Keep Node-only imports (",[608,1095,1096],{},"evlog\u002Ffs",", heavy adapters) out of root ",[608,1099,1035],{},". Use ",[608,1102,1103],{},"defineNodeInstrumentation"," with an options object. evlog loads ",[608,1106,1107],{},"createInstrumentation"," on Node.js only, without a visible ",[608,1110,1111],{},"import()"," in your file.",[629,1114,1115,1124],{},[632,1116,1117,1118,1120,1121],{},"Root ",[608,1119,1035],{}," → ",[608,1122,1123],{},"defineNodeInstrumentation({ service, ... })",[632,1125,1126,1120,1128,1130],{},[608,1127,755],{},[608,1129,610],{}," and Node-only drains for API routes",[680,1132,1134],{"className":753,"code":1133,"filename":1035,"language":756,"meta":686,"style":686},"import { defineNodeInstrumentation } from 'evlog\u002Fnext\u002Finstrumentation'\n\nexport const { register, onRequestError } = defineNodeInstrumentation({\n  service: 'my-app',\n  captureOutput: true,\n})\n",[608,1135,1136,1156,1160,1186,1200,1213],{"__ignoreMap":686},[690,1137,1138,1140,1142,1145,1147,1149,1151,1154],{"class":692,"line":693},[690,1139,764],{"class":763},[690,1141,768],{"class":767},[690,1143,1144],{"class":771}," defineNodeInstrumentation",[690,1146,775],{"class":767},[690,1148,778],{"class":763},[690,1150,781],{"class":767},[690,1152,1153],{"class":699},"evlog\u002Fnext\u002Finstrumentation",[690,1155,787],{"class":767},[690,1157,1158],{"class":692,"line":790},[690,1159,794],{"emptyLinePlaceholder":793},[690,1161,1162,1164,1166,1168,1171,1173,1176,1178,1180,1182,1184],{"class":692,"line":797},[690,1163,800],{"class":763},[690,1165,804],{"class":803},[690,1167,768],{"class":767},[690,1169,1170],{"class":771}," register",[690,1172,812],{"class":767},[690,1174,1175],{"class":771}," onRequestError ",[690,1177,828],{"class":767},[690,1179,831],{"class":767},[690,1181,1144],{"class":834},[690,1183,837],{"class":771},[690,1185,840],{"class":767},[690,1187,1188,1190,1192,1194,1196,1198],{"class":692,"line":843},[690,1189,847],{"class":846},[690,1191,850],{"class":767},[690,1193,781],{"class":767},[690,1195,855],{"class":699},[690,1197,858],{"class":767},[690,1199,861],{"class":767},[690,1201,1202,1205,1207,1211],{"class":692,"line":864},[690,1203,1204],{"class":846},"  captureOutput",[690,1206,850],{"class":767},[690,1208,1210],{"class":1209},"sfNiH"," true",[690,1212,861],{"class":767},[690,1214,1215,1217],{"class":692,"line":983},[690,1216,828],{"class":767},[690,1218,869],{"class":771},[680,1220,1222],{"className":753,"code":1221,"filename":755,"language":756,"meta":686,"style":686},"import { createEvlog } from 'evlog\u002Fnext'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain: createFsDrain(),\n})\n",[608,1223,1224,1242,1261,1265,1297,1311,1325],{"__ignoreMap":686},[690,1225,1226,1228,1230,1232,1234,1236,1238,1240],{"class":692,"line":693},[690,1227,764],{"class":763},[690,1229,768],{"class":767},[690,1231,772],{"class":771},[690,1233,775],{"class":767},[690,1235,778],{"class":763},[690,1237,781],{"class":767},[690,1239,784],{"class":699},[690,1241,787],{"class":767},[690,1243,1244,1246,1248,1251,1253,1255,1257,1259],{"class":692,"line":790},[690,1245,764],{"class":763},[690,1247,768],{"class":767},[690,1249,1250],{"class":771}," createFsDrain",[690,1252,775],{"class":767},[690,1254,778],{"class":763},[690,1256,781],{"class":767},[690,1258,1096],{"class":699},[690,1260,787],{"class":767},[690,1262,1263],{"class":692,"line":797},[690,1264,794],{"emptyLinePlaceholder":793},[690,1266,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295],{"class":692,"line":843},[690,1268,800],{"class":763},[690,1270,804],{"class":803},[690,1272,768],{"class":767},[690,1274,809],{"class":771},[690,1276,812],{"class":767},[690,1278,815],{"class":771},[690,1280,812],{"class":767},[690,1282,820],{"class":771},[690,1284,812],{"class":767},[690,1286,825],{"class":771},[690,1288,828],{"class":767},[690,1290,831],{"class":767},[690,1292,772],{"class":834},[690,1294,837],{"class":771},[690,1296,840],{"class":767},[690,1298,1299,1301,1303,1305,1307,1309],{"class":692,"line":864},[690,1300,847],{"class":846},[690,1302,850],{"class":767},[690,1304,781],{"class":767},[690,1306,855],{"class":699},[690,1308,858],{"class":767},[690,1310,861],{"class":767},[690,1312,1313,1316,1318,1320,1323],{"class":692,"line":983},[690,1314,1315],{"class":846},"  drain",[690,1317,850],{"class":767},[690,1319,1250],{"class":834},[690,1321,1322],{"class":771},"()",[690,1324,861],{"class":767},[690,1326,1327,1329],{"class":692,"line":1017},[690,1328,828],{"class":767},[690,1330,869],{"class":771},[672,1332,1334],{"id":1333},"_2-wire-up-instrumentationts","2. Wire up instrumentation.ts",[604,1336,1337,1338,1340,1341,1343,1344,1347],{},"Next.js evaluates ",[608,1339,1035],{}," in both Node.js and Edge runtimes. ",[608,1342,1103],{}," gates on ",[608,1345,1346],{},"NEXT_RUNTIME === 'nodejs'"," and loads the Node-only factory internally.",[672,1349,1351],{"id":1350},"custom-behavior-evlog-your-code","Custom behavior (evlog + your code)",[604,1353,1354,1355,1358],{},"Pass a ",[1053,1356,1357],{},"loader callback"," when you need extra startup work alongside evlog:",[680,1360,1362],{"className":753,"code":1361,"filename":1035,"language":756,"meta":686,"style":686},"import { defineNodeInstrumentation } from 'evlog\u002Fnext\u002Finstrumentation'\n\nexport const { register, onRequestError } = defineNodeInstrumentation(async () => {\n  const { createInstrumentation } = await import('evlog\u002Fnext\u002Finstrumentation\u002Fcreate')\n  const { register: evlogRegister, onRequestError: evlogOnRequestError } = createInstrumentation({\n    service: 'my-app',\n    captureOutput: true,\n  })\n\n  return {\n    async register() {\n      await evlogRegister()\n      \u002F\u002F e.g. OpenTelemetry, feature flags, custom one-off init\n    },\n    onRequestError: evlogOnRequestError,\n  }\n})\n",[608,1363,1364,1382,1386,1416,1446,1479,1494,1505,1513,1518,1525,1537,1547,1554,1560,1572,1578],{"__ignoreMap":686},[690,1365,1366,1368,1370,1372,1374,1376,1378,1380],{"class":692,"line":693},[690,1367,764],{"class":763},[690,1369,768],{"class":767},[690,1371,1144],{"class":771},[690,1373,775],{"class":767},[690,1375,778],{"class":763},[690,1377,781],{"class":767},[690,1379,1153],{"class":699},[690,1381,787],{"class":767},[690,1383,1384],{"class":692,"line":790},[690,1385,794],{"emptyLinePlaceholder":793},[690,1387,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414],{"class":692,"line":797},[690,1389,800],{"class":763},[690,1391,804],{"class":803},[690,1393,768],{"class":767},[690,1395,1170],{"class":771},[690,1397,812],{"class":767},[690,1399,1175],{"class":771},[690,1401,828],{"class":767},[690,1403,831],{"class":767},[690,1405,1144],{"class":834},[690,1407,837],{"class":771},[690,1409,925],{"class":803},[690,1411,928],{"class":767},[690,1413,931],{"class":803},[690,1415,934],{"class":767},[690,1417,1418,1420,1422,1425,1427,1429,1432,1435,1437,1439,1442,1444],{"class":692,"line":843},[690,1419,939],{"class":803},[690,1421,768],{"class":767},[690,1423,1424],{"class":771}," createInstrumentation",[690,1426,775],{"class":767},[690,1428,831],{"class":767},[690,1430,1431],{"class":763}," await",[690,1433,1434],{"class":767}," import",[690,1436,837],{"class":846},[690,1438,858],{"class":767},[690,1440,1441],{"class":699},"evlog\u002Fnext\u002Finstrumentation\u002Fcreate",[690,1443,858],{"class":767},[690,1445,869],{"class":846},[690,1447,1448,1450,1452,1454,1456,1459,1461,1464,1466,1469,1471,1473,1475,1477],{"class":692,"line":864},[690,1449,939],{"class":803},[690,1451,768],{"class":767},[690,1453,1170],{"class":846},[690,1455,850],{"class":767},[690,1457,1458],{"class":771}," evlogRegister",[690,1460,812],{"class":767},[690,1462,1463],{"class":846}," onRequestError",[690,1465,850],{"class":767},[690,1467,1468],{"class":771}," evlogOnRequestError",[690,1470,775],{"class":767},[690,1472,831],{"class":767},[690,1474,1424],{"class":834},[690,1476,837],{"class":846},[690,1478,840],{"class":767},[690,1480,1481,1484,1486,1488,1490,1492],{"class":692,"line":983},[690,1482,1483],{"class":846},"    service",[690,1485,850],{"class":767},[690,1487,781],{"class":767},[690,1489,855],{"class":699},[690,1491,858],{"class":767},[690,1493,861],{"class":767},[690,1495,1496,1499,1501,1503],{"class":692,"line":1017},[690,1497,1498],{"class":846},"    captureOutput",[690,1500,850],{"class":767},[690,1502,1210],{"class":1209},[690,1504,861],{"class":767},[690,1506,1508,1511],{"class":692,"line":1507},8,[690,1509,1510],{"class":767},"  }",[690,1512,869],{"class":846},[690,1514,1516],{"class":692,"line":1515},9,[690,1517,794],{"emptyLinePlaceholder":793},[690,1519,1521,1523],{"class":692,"line":1520},10,[690,1522,986],{"class":763},[690,1524,934],{"class":767},[690,1526,1528,1531,1533,1535],{"class":692,"line":1527},11,[690,1529,1530],{"class":803},"    async",[690,1532,1170],{"class":846},[690,1534,1322],{"class":767},[690,1536,934],{"class":767},[690,1538,1540,1543,1545],{"class":692,"line":1539},12,[690,1541,1542],{"class":763},"      await",[690,1544,1458],{"class":834},[690,1546,948],{"class":846},[690,1548,1550],{"class":692,"line":1549},13,[690,1551,1553],{"class":1552},"sHwdD","      \u002F\u002F e.g. OpenTelemetry, feature flags, custom one-off init\n",[690,1555,1557],{"class":692,"line":1556},14,[690,1558,1559],{"class":767},"    },\n",[690,1561,1563,1566,1568,1570],{"class":692,"line":1562},15,[690,1564,1565],{"class":846},"    onRequestError",[690,1567,850],{"class":767},[690,1569,1468],{"class":771},[690,1571,861],{"class":767},[690,1573,1575],{"class":692,"line":1574},16,[690,1576,1577],{"class":767},"  }\n",[690,1579,1581,1583],{"class":692,"line":1580},17,[690,1582,828],{"class":767},[690,1584,869],{"class":771},[604,1586,1587,1588,1590,1591,1593,1594,956],{},"Keep ",[608,1589,755],{}," for ",[608,1592,610],{}," and Node-only drains. Route handlers import ",[608,1595,900],{},[604,1597,1598],{},"Next.js automatically calls these exports:",[629,1600,1601,1618],{},[632,1602,1603,1605,1606,1609,1610,1613,1614,1617],{},[608,1604,1069],{},": Runs once when the server starts. Initializes the evlog logger with your configured drain, sampling, and options. When ",[608,1607,1608],{},"captureOutput"," is enabled, ",[608,1611,1612],{},"stdout"," and ",[608,1615,1616],{},"stderr"," writes are captured as structured log events.",[632,1619,1620,1622,1623,1626,1627,1626,1630,1626,1633,1636],{},[608,1621,1073],{},": Called on every unhandled request error. Emits a structured error log with the error message, digest, stack trace, request path\u002Fmethod, and routing context (",[608,1624,1625],{},"routerKind",", ",[608,1628,1629],{},"routePath",[608,1631,1632],{},"routeType",[608,1634,1635],{},"renderSource",").",[1042,1638,1639,1641,1642,1644,1645,1613,1648,1651,1652,1655,1656,1659,1660,1663,1664,1667,1668,1671],{"color":1044,"icon":13},[608,1640,1608],{}," only activates in the Node.js runtime (",[608,1643,1346],{},"). It patches ",[608,1646,1647],{},"process.stdout.write",[608,1649,1650],{},"process.stderr.write"," to emit structured ",[608,1653,1654],{},"log.info"," \u002F ",[608,1657,1658],{},"log.error"," events. When ",[608,1661,1662],{},"silent"," is ",[608,1665,1666],{},"false"," (the default), captured output is shown once as structured terminal output, and the raw write is not duplicated. Set ",[608,1669,1670],{},"silent: true"," to keep the original passthrough alongside drain delivery. Known Next.js Edge bundler warnings are filtered by default so they are not re-emitted as evlog errors.",[672,1673,543],{"id":1674},"configuration",[604,1676,1677,1613,1680,1682,1683,1626,1686,1626,1689,1626,1692,1626,1695,1626,1697,1626,1700,1626,1703,1705],{},[608,1678,1679],{},"defineNodeInstrumentation()",[608,1681,1039],{}," accept global logger options (",[608,1684,1685],{},"enabled",[608,1687,1688],{},"service",[608,1690,1691],{},"env",[608,1693,1694],{},"pretty",[608,1696,1662],{},[608,1698,1699],{},"sampling",[608,1701,1702],{},"stringify",[608,1704,1086],{},") plus:",[1707,1708,1709,1728],"table",{},[1710,1711,1712],"thead",{},[1713,1714,1715,1719,1722,1725],"tr",{},[1716,1717,1718],"th",{},"Option",[1716,1720,1721],{},"Type",[1716,1723,1724],{},"Default",[1716,1726,1727],{},"Description",[1729,1730,1731],"tbody",{},[1713,1732,1733,1738,1743,1747],{},[1734,1735,1736],"td",{},[608,1737,1608],{},[1734,1739,1740],{},[608,1741,1742],{},"boolean | CaptureOutputOptions",[1734,1744,1745],{},[608,1746,1666],{},[1734,1748,1749],{},"Capture stdout\u002Fstderr as structured log events",[604,1751,1752,1755],{},[608,1753,1754],{},"CaptureOutputOptions"," fields:",[1707,1757,1758,1771],{},[1710,1759,1760],{},[1713,1761,1762,1765,1767,1769],{},[1716,1763,1764],{},"Field",[1716,1766,1721],{},[1716,1768,1724],{},[1716,1770,1727],{},[1729,1772,1773,1792,1809],{},[1713,1774,1775,1779,1784,1789],{},[1734,1776,1777],{},[608,1778,1612],{},[1734,1780,1781],{},[608,1782,1783],{},"boolean",[1734,1785,1786],{},[608,1787,1788],{},"true",[1734,1790,1791],{},"Capture stdout writes",[1713,1793,1794,1798,1802,1806],{},[1734,1795,1796],{},[608,1797,1616],{},[1734,1799,1800],{},[608,1801,1783],{},[1734,1803,1804],{},[608,1805,1788],{},[1734,1807,1808],{},"Capture stderr writes",[1713,1810,1811,1816,1821,1824],{},[1734,1812,1813],{},[608,1814,1815],{},"ignore",[1734,1817,1818],{},[608,1819,1820],{},"(string | RegExp)[]",[1734,1822,1823],{},"Next.js Edge bundler warnings",[1734,1825,1826],{},"Skip re-emitting matching chunks as log events",[680,1828,1830],{"className":753,"code":1829,"filename":1035,"language":756,"meta":686,"style":686},"defineNodeInstrumentation({\n  captureOutput: {\n    stderr: true,\n    ignore: [\u002Fmy-noisy-dep\u002F, 'benign warning'],\n  },\n})\n",[608,1831,1832,1840,1848,1859,1891,1896],{"__ignoreMap":686},[690,1833,1834,1836,1838],{"class":692,"line":693},[690,1835,1103],{"class":834},[690,1837,837],{"class":771},[690,1839,840],{"class":767},[690,1841,1842,1844,1846],{"class":692,"line":790},[690,1843,1204],{"class":846},[690,1845,850],{"class":767},[690,1847,934],{"class":767},[690,1849,1850,1853,1855,1857],{"class":692,"line":797},[690,1851,1852],{"class":846},"    stderr",[690,1854,850],{"class":767},[690,1856,1210],{"class":1209},[690,1858,861],{"class":767},[690,1860,1861,1864,1866,1869,1872,1875,1877,1879,1881,1884,1886,1889],{"class":692,"line":843},[690,1862,1863],{"class":846},"    ignore",[690,1865,850],{"class":767},[690,1867,1868],{"class":771}," [",[690,1870,1871],{"class":767},"\u002F",[690,1873,1874],{"class":699},"my-noisy-dep",[690,1876,1871],{"class":767},[690,1878,812],{"class":767},[690,1880,781],{"class":767},[690,1882,1883],{"class":699},"benign warning",[690,1885,858],{"class":767},[690,1887,1888],{"class":771},"]",[690,1890,861],{"class":767},[690,1892,1893],{"class":692,"line":864},[690,1894,1895],{"class":767},"  },\n",[690,1897,1898,1900],{"class":692,"line":983},[690,1899,828],{"class":767},[690,1901,869],{"class":771},[668,1903,1905],{"id":1904},"production-configuration","Production Configuration",[604,1907,1908,1909,1911],{},"A real-world ",[608,1910,755],{}," with enrichers, batched drain, tail sampling, and route-based service names:",[1913,1914,1915],"code-collapse",{},[680,1916,1918],{"className":753,"code":1917,"filename":755,"language":756,"meta":686,"style":686},"import type { DrainContext } from 'evlog'\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createUserAgentEnricher, createRequestSizeEnricher } from 'evlog\u002Fenrichers'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\n\u002F\u002F 1. Enrichers - add derived context to every event\nconst enrichers = [createUserAgentEnricher(), createRequestSizeEnricher()]\n\n\u002F\u002F 2. Pipeline - batch events before sending\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 50, intervalMs: 5000 } })\n\n\u002F\u002F 3. Drain - send batched events to Axiom\nconst drain = pipeline(createAxiomDrain({\n  dataset: 'logs',\n  apiKey: process.env.AXIOM_API_KEY!,\n}))\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n\n  \u002F\u002F 4. Head sampling - keep 10% of info logs\n  sampling: {\n    rates: { info: 10 },\n    keep: [\n      { status: 400 },              \u002F\u002F Always keep errors\n      { duration: 1000 },           \u002F\u002F Always keep slow requests\n      { path: '\u002Fapi\u002Fcritical\u002F**' }, \u002F\u002F Always keep critical paths\n    ],\n  },\n\n  \u002F\u002F 5. Route-based service names\n  routes: {\n    '\u002Fapi\u002Fauth\u002F**': { service: 'auth-service' },\n    '\u002Fapi\u002Fpayment\u002F**': { service: 'payment-service' },\n    '\u002Fapi\u002Fbooking\u002F**': { service: 'booking-service' },\n  },\n\n  \u002F\u002F 6. Custom tail sampling - business logic\n  keep: (ctx) => {\n    const user = ctx.context.user as { premium?: boolean } | undefined\n    if (user?.premium) ctx.shouldKeep = true\n  },\n\n  \u002F\u002F 7. Enrich every event with user agent, request size, and deployment info\n  enrich: (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n    ctx.event.deploymentId = process.env.VERCEL_DEPLOYMENT_ID\n    ctx.event.region = process.env.VERCEL_REGION\n  },\n\n  drain,\n})\n",[608,1919,1920,1943,1961,1986,2006,2026,2030,2035,2059,2063,2068,2124,2128,2133,2154,2170,2192,2199,2204,2237,2252,2257,2263,2273,2294,2305,2325,2343,2365,2373,2378,2383,2389,2399,2428,2455,2482,2487,2492,2498,2520,2566,2597,2602,2607,2613,2631,2661,2690,2717,2722,2727,2734],{"__ignoreMap":686},[690,1921,1922,1924,1927,1929,1932,1934,1936,1938,1941],{"class":692,"line":693},[690,1923,764],{"class":763},[690,1925,1926],{"class":763}," type",[690,1928,768],{"class":767},[690,1930,1931],{"class":771}," DrainContext",[690,1933,775],{"class":767},[690,1935,778],{"class":763},[690,1937,781],{"class":767},[690,1939,1940],{"class":699},"evlog",[690,1942,787],{"class":767},[690,1944,1945,1947,1949,1951,1953,1955,1957,1959],{"class":692,"line":790},[690,1946,764],{"class":763},[690,1948,768],{"class":767},[690,1950,772],{"class":771},[690,1952,775],{"class":767},[690,1954,778],{"class":763},[690,1956,781],{"class":767},[690,1958,784],{"class":699},[690,1960,787],{"class":767},[690,1962,1963,1965,1967,1970,1972,1975,1977,1979,1981,1984],{"class":692,"line":797},[690,1964,764],{"class":763},[690,1966,768],{"class":767},[690,1968,1969],{"class":771}," createUserAgentEnricher",[690,1971,812],{"class":767},[690,1973,1974],{"class":771}," createRequestSizeEnricher",[690,1976,775],{"class":767},[690,1978,778],{"class":763},[690,1980,781],{"class":767},[690,1982,1983],{"class":699},"evlog\u002Fenrichers",[690,1985,787],{"class":767},[690,1987,1988,1990,1992,1995,1997,1999,2001,2004],{"class":692,"line":843},[690,1989,764],{"class":763},[690,1991,768],{"class":767},[690,1993,1994],{"class":771}," createAxiomDrain",[690,1996,775],{"class":767},[690,1998,778],{"class":763},[690,2000,781],{"class":767},[690,2002,2003],{"class":699},"evlog\u002Faxiom",[690,2005,787],{"class":767},[690,2007,2008,2010,2012,2015,2017,2019,2021,2024],{"class":692,"line":864},[690,2009,764],{"class":763},[690,2011,768],{"class":767},[690,2013,2014],{"class":771}," createDrainPipeline",[690,2016,775],{"class":767},[690,2018,778],{"class":763},[690,2020,781],{"class":767},[690,2022,2023],{"class":699},"evlog\u002Fpipeline",[690,2025,787],{"class":767},[690,2027,2028],{"class":692,"line":983},[690,2029,794],{"emptyLinePlaceholder":793},[690,2031,2032],{"class":692,"line":1017},[690,2033,2034],{"class":1552},"\u002F\u002F 1. Enrichers - add derived context to every event\n",[690,2036,2037,2040,2043,2045,2047,2050,2052,2054,2056],{"class":692,"line":1507},[690,2038,2039],{"class":803},"const",[690,2041,2042],{"class":771}," enrichers ",[690,2044,918],{"class":767},[690,2046,1868],{"class":771},[690,2048,2049],{"class":834},"createUserAgentEnricher",[690,2051,1322],{"class":771},[690,2053,812],{"class":767},[690,2055,1974],{"class":834},[690,2057,2058],{"class":771},"()]\n",[690,2060,2061],{"class":692,"line":1515},[690,2062,794],{"emptyLinePlaceholder":793},[690,2064,2065],{"class":692,"line":1520},[690,2066,2067],{"class":1552},"\u002F\u002F 2. Pipeline - batch events before sending\n",[690,2069,2070,2072,2075,2077,2079,2082,2085,2088,2090,2092,2095,2097,2099,2102,2104,2108,2110,2113,2115,2118,2120,2122],{"class":692,"line":1527},[690,2071,2039],{"class":803},[690,2073,2074],{"class":771}," pipeline ",[690,2076,918],{"class":767},[690,2078,2014],{"class":834},[690,2080,2081],{"class":767},"\u003C",[690,2083,2084],{"class":696},"DrainContext",[690,2086,2087],{"class":767},">",[690,2089,837],{"class":771},[690,2091,964],{"class":767},[690,2093,2094],{"class":846}," batch",[690,2096,850],{"class":767},[690,2098,768],{"class":767},[690,2100,2101],{"class":846}," size",[690,2103,850],{"class":767},[690,2105,2107],{"class":2106},"sbssI"," 50",[690,2109,812],{"class":767},[690,2111,2112],{"class":846}," intervalMs",[690,2114,850],{"class":767},[690,2116,2117],{"class":2106}," 5000",[690,2119,775],{"class":767},[690,2121,775],{"class":767},[690,2123,869],{"class":771},[690,2125,2126],{"class":692,"line":1539},[690,2127,794],{"emptyLinePlaceholder":793},[690,2129,2130],{"class":692,"line":1549},[690,2131,2132],{"class":1552},"\u002F\u002F 3. Drain - send batched events to Axiom\n",[690,2134,2135,2137,2140,2142,2145,2147,2150,2152],{"class":692,"line":1556},[690,2136,2039],{"class":803},[690,2138,2139],{"class":771}," drain ",[690,2141,918],{"class":767},[690,2143,2144],{"class":834}," pipeline",[690,2146,837],{"class":771},[690,2148,2149],{"class":834},"createAxiomDrain",[690,2151,837],{"class":771},[690,2153,840],{"class":767},[690,2155,2156,2159,2161,2163,2166,2168],{"class":692,"line":1562},[690,2157,2158],{"class":846},"  dataset",[690,2160,850],{"class":767},[690,2162,781],{"class":767},[690,2164,2165],{"class":699},"logs",[690,2167,858],{"class":767},[690,2169,861],{"class":767},[690,2171,2172,2175,2177,2180,2182,2184,2186,2189],{"class":692,"line":1574},[690,2173,2174],{"class":846},"  apiKey",[690,2176,850],{"class":767},[690,2178,2179],{"class":771}," process",[690,2181,956],{"class":767},[690,2183,1691],{"class":771},[690,2185,956],{"class":767},[690,2187,2188],{"class":771},"AXIOM_API_KEY",[690,2190,2191],{"class":767},"!,\n",[690,2193,2194,2196],{"class":692,"line":1580},[690,2195,828],{"class":767},[690,2197,2198],{"class":771},"))\n",[690,2200,2202],{"class":692,"line":2201},18,[690,2203,794],{"emptyLinePlaceholder":793},[690,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235],{"class":692,"line":2206},19,[690,2208,800],{"class":763},[690,2210,804],{"class":803},[690,2212,768],{"class":767},[690,2214,809],{"class":771},[690,2216,812],{"class":767},[690,2218,815],{"class":771},[690,2220,812],{"class":767},[690,2222,820],{"class":771},[690,2224,812],{"class":767},[690,2226,825],{"class":771},[690,2228,828],{"class":767},[690,2230,831],{"class":767},[690,2232,772],{"class":834},[690,2234,837],{"class":771},[690,2236,840],{"class":767},[690,2238,2240,2242,2244,2246,2248,2250],{"class":692,"line":2239},20,[690,2241,847],{"class":846},[690,2243,850],{"class":767},[690,2245,781],{"class":767},[690,2247,855],{"class":699},[690,2249,858],{"class":767},[690,2251,861],{"class":767},[690,2253,2255],{"class":692,"line":2254},21,[690,2256,794],{"emptyLinePlaceholder":793},[690,2258,2260],{"class":692,"line":2259},22,[690,2261,2262],{"class":1552},"  \u002F\u002F 4. Head sampling - keep 10% of info logs\n",[690,2264,2266,2269,2271],{"class":692,"line":2265},23,[690,2267,2268],{"class":846},"  sampling",[690,2270,850],{"class":767},[690,2272,934],{"class":767},[690,2274,2276,2279,2281,2283,2286,2288,2291],{"class":692,"line":2275},24,[690,2277,2278],{"class":846},"    rates",[690,2280,850],{"class":767},[690,2282,768],{"class":767},[690,2284,2285],{"class":846}," info",[690,2287,850],{"class":767},[690,2289,2290],{"class":2106}," 10",[690,2292,2293],{"class":767}," },\n",[690,2295,2297,2300,2302],{"class":692,"line":2296},25,[690,2298,2299],{"class":846},"    keep",[690,2301,850],{"class":767},[690,2303,2304],{"class":771}," [\n",[690,2306,2308,2311,2314,2316,2319,2322],{"class":692,"line":2307},26,[690,2309,2310],{"class":767},"      {",[690,2312,2313],{"class":846}," status",[690,2315,850],{"class":767},[690,2317,2318],{"class":2106}," 400",[690,2320,2321],{"class":767}," },",[690,2323,2324],{"class":1552},"              \u002F\u002F Always keep errors\n",[690,2326,2328,2330,2333,2335,2338,2340],{"class":692,"line":2327},27,[690,2329,2310],{"class":767},[690,2331,2332],{"class":846}," duration",[690,2334,850],{"class":767},[690,2336,2337],{"class":2106}," 1000",[690,2339,2321],{"class":767},[690,2341,2342],{"class":1552},"           \u002F\u002F Always keep slow requests\n",[690,2344,2346,2348,2351,2353,2355,2358,2360,2362],{"class":692,"line":2345},28,[690,2347,2310],{"class":767},[690,2349,2350],{"class":846}," path",[690,2352,850],{"class":767},[690,2354,781],{"class":767},[690,2356,2357],{"class":699},"\u002Fapi\u002Fcritical\u002F**",[690,2359,858],{"class":767},[690,2361,2321],{"class":767},[690,2363,2364],{"class":1552}," \u002F\u002F Always keep critical paths\n",[690,2366,2368,2371],{"class":692,"line":2367},29,[690,2369,2370],{"class":771},"    ]",[690,2372,861],{"class":767},[690,2374,2376],{"class":692,"line":2375},30,[690,2377,1895],{"class":767},[690,2379,2381],{"class":692,"line":2380},31,[690,2382,794],{"emptyLinePlaceholder":793},[690,2384,2386],{"class":692,"line":2385},32,[690,2387,2388],{"class":1552},"  \u002F\u002F 5. Route-based service names\n",[690,2390,2392,2395,2397],{"class":692,"line":2391},33,[690,2393,2394],{"class":846},"  routes",[690,2396,850],{"class":767},[690,2398,934],{"class":767},[690,2400,2402,2405,2408,2410,2412,2414,2417,2419,2421,2424,2426],{"class":692,"line":2401},34,[690,2403,2404],{"class":767},"    '",[690,2406,2407],{"class":846},"\u002Fapi\u002Fauth\u002F**",[690,2409,858],{"class":767},[690,2411,850],{"class":767},[690,2413,768],{"class":767},[690,2415,2416],{"class":846}," service",[690,2418,850],{"class":767},[690,2420,781],{"class":767},[690,2422,2423],{"class":699},"auth-service",[690,2425,858],{"class":767},[690,2427,2293],{"class":767},[690,2429,2431,2433,2436,2438,2440,2442,2444,2446,2448,2451,2453],{"class":692,"line":2430},35,[690,2432,2404],{"class":767},[690,2434,2435],{"class":846},"\u002Fapi\u002Fpayment\u002F**",[690,2437,858],{"class":767},[690,2439,850],{"class":767},[690,2441,768],{"class":767},[690,2443,2416],{"class":846},[690,2445,850],{"class":767},[690,2447,781],{"class":767},[690,2449,2450],{"class":699},"payment-service",[690,2452,858],{"class":767},[690,2454,2293],{"class":767},[690,2456,2458,2460,2463,2465,2467,2469,2471,2473,2475,2478,2480],{"class":692,"line":2457},36,[690,2459,2404],{"class":767},[690,2461,2462],{"class":846},"\u002Fapi\u002Fbooking\u002F**",[690,2464,858],{"class":767},[690,2466,850],{"class":767},[690,2468,768],{"class":767},[690,2470,2416],{"class":846},[690,2472,850],{"class":767},[690,2474,781],{"class":767},[690,2476,2477],{"class":699},"booking-service",[690,2479,858],{"class":767},[690,2481,2293],{"class":767},[690,2483,2485],{"class":692,"line":2484},37,[690,2486,1895],{"class":767},[690,2488,2490],{"class":692,"line":2489},38,[690,2491,794],{"emptyLinePlaceholder":793},[690,2493,2495],{"class":692,"line":2494},39,[690,2496,2497],{"class":1552},"  \u002F\u002F 6. Custom tail sampling - business logic\n",[690,2499,2501,2504,2506,2509,2513,2516,2518],{"class":692,"line":2500},40,[690,2502,2503],{"class":834},"  keep",[690,2505,850],{"class":767},[690,2507,2508],{"class":767}," (",[690,2510,2512],{"class":2511},"sHdIc","ctx",[690,2514,2515],{"class":767},")",[690,2517,931],{"class":803},[690,2519,934],{"class":767},[690,2521,2523,2526,2529,2531,2534,2536,2539,2541,2544,2547,2549,2552,2555,2558,2560,2563],{"class":692,"line":2522},41,[690,2524,2525],{"class":803},"    const",[690,2527,2528],{"class":771}," user",[690,2530,831],{"class":767},[690,2532,2533],{"class":771}," ctx",[690,2535,956],{"class":767},[690,2537,2538],{"class":771},"context",[690,2540,956],{"class":767},[690,2542,2543],{"class":771},"user",[690,2545,2546],{"class":763}," as",[690,2548,768],{"class":767},[690,2550,2551],{"class":846}," premium",[690,2553,2554],{"class":767},"?:",[690,2556,2557],{"class":696}," boolean",[690,2559,775],{"class":767},[690,2561,2562],{"class":767}," |",[690,2564,2565],{"class":696}," undefined\n",[690,2567,2569,2572,2574,2576,2579,2582,2585,2587,2589,2592,2594],{"class":692,"line":2568},42,[690,2570,2571],{"class":763},"    if",[690,2573,2508],{"class":846},[690,2575,2543],{"class":771},[690,2577,2578],{"class":767},"?.",[690,2580,2581],{"class":771},"premium",[690,2583,2584],{"class":846},") ",[690,2586,2512],{"class":771},[690,2588,956],{"class":767},[690,2590,2591],{"class":771},"shouldKeep",[690,2593,831],{"class":767},[690,2595,2596],{"class":1209}," true\n",[690,2598,2600],{"class":692,"line":2599},43,[690,2601,1895],{"class":767},[690,2603,2605],{"class":692,"line":2604},44,[690,2606,794],{"emptyLinePlaceholder":793},[690,2608,2610],{"class":692,"line":2609},45,[690,2611,2612],{"class":1552},"  \u002F\u002F 7. Enrich every event with user agent, request size, and deployment info\n",[690,2614,2616,2619,2621,2623,2625,2627,2629],{"class":692,"line":2615},46,[690,2617,2618],{"class":834},"  enrich",[690,2620,850],{"class":767},[690,2622,2508],{"class":767},[690,2624,2512],{"class":2511},[690,2626,2515],{"class":767},[690,2628,931],{"class":803},[690,2630,934],{"class":767},[690,2632,2634,2637,2639,2641,2644,2647,2650,2652,2655,2657,2659],{"class":692,"line":2633},47,[690,2635,2636],{"class":763},"    for",[690,2638,2508],{"class":846},[690,2640,2039],{"class":803},[690,2642,2643],{"class":771}," enricher",[690,2645,2646],{"class":767}," of",[690,2648,2649],{"class":771}," enrichers",[690,2651,2584],{"class":846},[690,2653,2654],{"class":834},"enricher",[690,2656,837],{"class":846},[690,2658,2512],{"class":771},[690,2660,869],{"class":846},[690,2662,2664,2667,2669,2672,2674,2677,2679,2681,2683,2685,2687],{"class":692,"line":2663},48,[690,2665,2666],{"class":771},"    ctx",[690,2668,956],{"class":767},[690,2670,2671],{"class":771},"event",[690,2673,956],{"class":767},[690,2675,2676],{"class":771},"deploymentId",[690,2678,831],{"class":767},[690,2680,2179],{"class":771},[690,2682,956],{"class":767},[690,2684,1691],{"class":771},[690,2686,956],{"class":767},[690,2688,2689],{"class":771},"VERCEL_DEPLOYMENT_ID\n",[690,2691,2693,2695,2697,2699,2701,2704,2706,2708,2710,2712,2714],{"class":692,"line":2692},49,[690,2694,2666],{"class":771},[690,2696,956],{"class":767},[690,2698,2671],{"class":771},[690,2700,956],{"class":767},[690,2702,2703],{"class":771},"region",[690,2705,831],{"class":767},[690,2707,2179],{"class":771},[690,2709,956],{"class":767},[690,2711,1691],{"class":771},[690,2713,956],{"class":767},[690,2715,2716],{"class":771},"VERCEL_REGION\n",[690,2718,2720],{"class":692,"line":2719},50,[690,2721,1895],{"class":767},[690,2723,2725],{"class":692,"line":2724},51,[690,2726,794],{"emptyLinePlaceholder":793},[690,2728,2730,2732],{"class":692,"line":2729},52,[690,2731,1315],{"class":771},[690,2733,861],{"class":767},[690,2735,2737,2739],{"class":692,"line":2736},53,[690,2738,828],{"class":767},[690,2740,869],{"class":771},[1042,2742,2745,2746,2749,2750,2753,2754,2757,2758,2761,2762,2765],{"color":2743,"icon":2744},"neutral","i-lucide-cloud","On Vercel, ",[608,2747,2748],{},"withEvlog"," registers drain work with Next's ",[608,2751,2752],{},"after()",", and with a pipeline it also registers ",[608,2755,2756],{},"drain.settled()",": the function stays alive until the buffered batch is delivered, or dropped once retries are exhausted. ",[608,2759,2760],{},"batch.intervalMs"," bounds when the first delivery attempt starts; retry backoff can extend the lifetime past it. If your ingest endpoint is slow enough to hit the default 5s request timeout, raise it (",[608,2763,2764],{},"createAxiomDrain({ timeout: 15000 })","): a timed-out request that actually landed gets retried, and non-idempotent ingest APIs count that twice.",[668,2767,51],{"id":2768},"wide-events",[604,2770,2771],{},"Build up context progressively through your handler. One request = one wide event:",[680,2773,2776],{"className":753,"code":2774,"filename":2775,"language":756,"meta":686,"style":686},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async (request: Request) => {\n  const log = useLogger()\n  const body = await request.json()\n\n  \u002F\u002F Stage 1: User context\n  log.set({\n    user: { id: body.userId, plan: 'enterprise' },\n  })\n\n  \u002F\u002F Stage 2: Cart context\n  log.set({\n    cart: { items: body.items.length, total: body.total, currency: 'USD' },\n  })\n\n  \u002F\u002F Stage 3: Payment context\n  const payment = await processPayment(body)\n  log.set({\n    payment: { method: payment.method, cardLast4: payment.last4 },\n  })\n\n  return Response.json({ success: true, orderId: payment.orderId })\n})\n","app\u002Fapi\u002Fcheckout\u002Froute.ts",[608,2777,2778,2800,2804,2837,2849,2869,2873,2878,2890,2927,2933,2937,2942,2954,3010,3016,3020,3025,3046,3058,3095,3101,3105,3144],{"__ignoreMap":686},[690,2779,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798],{"class":692,"line":693},[690,2781,764],{"class":763},[690,2783,768],{"class":767},[690,2785,809],{"class":771},[690,2787,812],{"class":767},[690,2789,815],{"class":771},[690,2791,775],{"class":767},[690,2793,778],{"class":763},[690,2795,781],{"class":767},[690,2797,900],{"class":699},[690,2799,787],{"class":767},[690,2801,2802],{"class":692,"line":790},[690,2803,794],{"emptyLinePlaceholder":793},[690,2805,2806,2808,2810,2813,2815,2817,2819,2821,2823,2826,2828,2831,2833,2835],{"class":692,"line":797},[690,2807,800],{"class":763},[690,2809,804],{"class":803},[690,2811,2812],{"class":771}," POST ",[690,2814,918],{"class":767},[690,2816,809],{"class":834},[690,2818,837],{"class":771},[690,2820,925],{"class":803},[690,2822,2508],{"class":767},[690,2824,2825],{"class":2511},"request",[690,2827,850],{"class":767},[690,2829,2830],{"class":696}," Request",[690,2832,2515],{"class":767},[690,2834,931],{"class":803},[690,2836,934],{"class":767},[690,2838,2839,2841,2843,2845,2847],{"class":692,"line":843},[690,2840,939],{"class":803},[690,2842,820],{"class":771},[690,2844,831],{"class":767},[690,2846,815],{"class":834},[690,2848,948],{"class":846},[690,2850,2851,2853,2856,2858,2860,2863,2865,2867],{"class":692,"line":864},[690,2852,939],{"class":803},[690,2854,2855],{"class":771}," body",[690,2857,831],{"class":767},[690,2859,1431],{"class":763},[690,2861,2862],{"class":771}," request",[690,2864,956],{"class":767},[690,2866,994],{"class":834},[690,2868,948],{"class":846},[690,2870,2871],{"class":692,"line":983},[690,2872,794],{"emptyLinePlaceholder":793},[690,2874,2875],{"class":692,"line":1017},[690,2876,2877],{"class":1552},"  \u002F\u002F Stage 1: User context\n",[690,2879,2880,2882,2884,2886,2888],{"class":692,"line":1507},[690,2881,953],{"class":771},[690,2883,956],{"class":767},[690,2885,959],{"class":834},[690,2887,837],{"class":846},[690,2889,840],{"class":767},[690,2891,2892,2895,2897,2899,2902,2904,2906,2908,2911,2913,2916,2918,2920,2923,2925],{"class":692,"line":1515},[690,2893,2894],{"class":846},"    user",[690,2896,850],{"class":767},[690,2898,768],{"class":767},[690,2900,2901],{"class":846}," id",[690,2903,850],{"class":767},[690,2905,2855],{"class":771},[690,2907,956],{"class":767},[690,2909,2910],{"class":771},"userId",[690,2912,812],{"class":767},[690,2914,2915],{"class":846}," plan",[690,2917,850],{"class":767},[690,2919,781],{"class":767},[690,2921,2922],{"class":699},"enterprise",[690,2924,858],{"class":767},[690,2926,2293],{"class":767},[690,2928,2929,2931],{"class":692,"line":1520},[690,2930,1510],{"class":767},[690,2932,869],{"class":846},[690,2934,2935],{"class":692,"line":1527},[690,2936,794],{"emptyLinePlaceholder":793},[690,2938,2939],{"class":692,"line":1539},[690,2940,2941],{"class":1552},"  \u002F\u002F Stage 2: Cart context\n",[690,2943,2944,2946,2948,2950,2952],{"class":692,"line":1549},[690,2945,953],{"class":771},[690,2947,956],{"class":767},[690,2949,959],{"class":834},[690,2951,837],{"class":846},[690,2953,840],{"class":767},[690,2955,2956,2959,2961,2963,2966,2968,2970,2972,2975,2977,2980,2982,2985,2987,2989,2991,2994,2996,2999,3001,3003,3006,3008],{"class":692,"line":1556},[690,2957,2958],{"class":846},"    cart",[690,2960,850],{"class":767},[690,2962,768],{"class":767},[690,2964,2965],{"class":846}," items",[690,2967,850],{"class":767},[690,2969,2855],{"class":771},[690,2971,956],{"class":767},[690,2973,2974],{"class":771},"items",[690,2976,956],{"class":767},[690,2978,2979],{"class":771},"length",[690,2981,812],{"class":767},[690,2983,2984],{"class":846}," total",[690,2986,850],{"class":767},[690,2988,2855],{"class":771},[690,2990,956],{"class":767},[690,2992,2993],{"class":771},"total",[690,2995,812],{"class":767},[690,2997,2998],{"class":846}," currency",[690,3000,850],{"class":767},[690,3002,781],{"class":767},[690,3004,3005],{"class":699},"USD",[690,3007,858],{"class":767},[690,3009,2293],{"class":767},[690,3011,3012,3014],{"class":692,"line":1562},[690,3013,1510],{"class":767},[690,3015,869],{"class":846},[690,3017,3018],{"class":692,"line":1574},[690,3019,794],{"emptyLinePlaceholder":793},[690,3021,3022],{"class":692,"line":1580},[690,3023,3024],{"class":1552},"  \u002F\u002F Stage 3: Payment context\n",[690,3026,3027,3029,3032,3034,3036,3039,3041,3044],{"class":692,"line":2201},[690,3028,939],{"class":803},[690,3030,3031],{"class":771}," payment",[690,3033,831],{"class":767},[690,3035,1431],{"class":763},[690,3037,3038],{"class":834}," processPayment",[690,3040,837],{"class":846},[690,3042,3043],{"class":771},"body",[690,3045,869],{"class":846},[690,3047,3048,3050,3052,3054,3056],{"class":692,"line":2206},[690,3049,953],{"class":771},[690,3051,956],{"class":767},[690,3053,959],{"class":834},[690,3055,837],{"class":846},[690,3057,840],{"class":767},[690,3059,3060,3063,3065,3067,3070,3072,3074,3076,3079,3081,3084,3086,3088,3090,3093],{"class":692,"line":2239},[690,3061,3062],{"class":846},"    payment",[690,3064,850],{"class":767},[690,3066,768],{"class":767},[690,3068,3069],{"class":846}," method",[690,3071,850],{"class":767},[690,3073,3031],{"class":771},[690,3075,956],{"class":767},[690,3077,3078],{"class":771},"method",[690,3080,812],{"class":767},[690,3082,3083],{"class":846}," cardLast4",[690,3085,850],{"class":767},[690,3087,3031],{"class":771},[690,3089,956],{"class":767},[690,3091,3092],{"class":771},"last4",[690,3094,2293],{"class":767},[690,3096,3097,3099],{"class":692,"line":2254},[690,3098,1510],{"class":767},[690,3100,869],{"class":846},[690,3102,3103],{"class":692,"line":2259},[690,3104,794],{"emptyLinePlaceholder":793},[690,3106,3107,3109,3111,3113,3115,3117,3119,3122,3124,3126,3128,3131,3133,3135,3137,3140,3142],{"class":692,"line":2265},[690,3108,986],{"class":763},[690,3110,989],{"class":771},[690,3112,956],{"class":767},[690,3114,994],{"class":834},[690,3116,837],{"class":846},[690,3118,964],{"class":767},[690,3120,3121],{"class":846}," success",[690,3123,850],{"class":767},[690,3125,1210],{"class":1209},[690,3127,812],{"class":767},[690,3129,3130],{"class":846}," orderId",[690,3132,850],{"class":767},[690,3134,3031],{"class":771},[690,3136,956],{"class":767},[690,3138,3139],{"class":771},"orderId",[690,3141,775],{"class":767},[690,3143,869],{"class":846},[690,3145,3146,3148],{"class":692,"line":2275},[690,3147,828],{"class":767},[690,3149,869],{"class":771},[604,3151,3152],{},"All fields are merged into a single wide event emitted when the handler completes (or when a streaming response body finishes, so AI SDK metadata is included):",[680,3154,3157],{"className":682,"code":3155,"filename":3156,"language":685,"meta":686,"style":686},"10:23:45.612 INFO [my-app] POST \u002Fapi\u002Fcheckout 200 in 145ms\n  ├─ user: id=usr_123 plan=enterprise\n  ├─ cart: items=3 total=14999 currency=USD\n  ├─ payment: method=card cardLast4=4242\n  └─ requestId: a1b2c3d4-...\n","Output (Pretty)",[608,3158,3159,3170,3184,3206,3222],{"__ignoreMap":686},[690,3160,3161,3164,3167],{"class":692,"line":693},[690,3162,3163],{"class":696},"10:23:45.612",[690,3165,3166],{"class":699}," INFO",[690,3168,3169],{"class":771}," [my-app] POST \u002Fapi\u002Fcheckout 200 in 145ms\n",[690,3171,3172,3175,3178,3181],{"class":692,"line":790},[690,3173,3174],{"class":696},"  ├─",[690,3176,3177],{"class":699}," user:",[690,3179,3180],{"class":699}," id=usr_123",[690,3182,3183],{"class":699}," plan=enterprise\n",[690,3185,3186,3188,3191,3194,3197,3200,3203],{"class":692,"line":797},[690,3187,3174],{"class":696},[690,3189,3190],{"class":699}," cart:",[690,3192,3193],{"class":699}," items=",[690,3195,3196],{"class":2106},"3",[690,3198,3199],{"class":699}," total=",[690,3201,3202],{"class":2106},"14999",[690,3204,3205],{"class":699}," currency=USD\n",[690,3207,3208,3210,3213,3216,3219],{"class":692,"line":843},[690,3209,3174],{"class":696},[690,3211,3212],{"class":699}," payment:",[690,3214,3215],{"class":699}," method=card",[690,3217,3218],{"class":699}," cardLast4=",[690,3220,3221],{"class":2106},"4242\n",[690,3223,3224,3227,3230],{"class":692,"line":864},[690,3225,3226],{"class":696},"  └─",[690,3228,3229],{"class":699}," requestId:",[690,3231,3232],{"class":699}," a1b2c3d4-...\n",[668,3234,3236,3237,2515],{"id":3235},"background-work-logfork","Background work (",[608,3238,3239],{},"log.fork",[604,3241,3242,3243,1626,3245,3247,3248,3253,3254,3258],{},"Inside ",[608,3244,2748],{},[608,3246,618],{}," returns a logger with ",[1053,3249,3250],{},[608,3251,3252],{},"fork"," for child wide events. See ",[657,3255,3257],{"href":3256},"\u002Flearn\u002Fwide-events#after-emit-sealing-and-background-work","After emit"," in Wide events.",[680,3260,3263],{"className":753,"code":3261,"filename":3262,"language":756,"meta":686,"style":686},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async () => {\n  const log = useLogger()\n  log.fork!('enqueue', async () => {\n    const child = useLogger()\n    child.set({ job: 'queued' })\n  })\n  return Response.json({ ok: true })\n})\n","app\u002Fapi\u002Forders\u002Froute.ts",[608,3264,3265,3287,3291,3313,3325,3356,3369,3398,3404,3429],{"__ignoreMap":686},[690,3266,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285],{"class":692,"line":693},[690,3268,764],{"class":763},[690,3270,768],{"class":767},[690,3272,809],{"class":771},[690,3274,812],{"class":767},[690,3276,815],{"class":771},[690,3278,775],{"class":767},[690,3280,778],{"class":763},[690,3282,781],{"class":767},[690,3284,900],{"class":699},[690,3286,787],{"class":767},[690,3288,3289],{"class":692,"line":790},[690,3290,794],{"emptyLinePlaceholder":793},[690,3292,3293,3295,3297,3299,3301,3303,3305,3307,3309,3311],{"class":692,"line":797},[690,3294,800],{"class":763},[690,3296,804],{"class":803},[690,3298,2812],{"class":771},[690,3300,918],{"class":767},[690,3302,809],{"class":834},[690,3304,837],{"class":771},[690,3306,925],{"class":803},[690,3308,928],{"class":767},[690,3310,931],{"class":803},[690,3312,934],{"class":767},[690,3314,3315,3317,3319,3321,3323],{"class":692,"line":843},[690,3316,939],{"class":803},[690,3318,820],{"class":771},[690,3320,831],{"class":767},[690,3322,815],{"class":834},[690,3324,948],{"class":846},[690,3326,3327,3329,3331,3333,3336,3338,3340,3343,3345,3347,3350,3352,3354],{"class":692,"line":864},[690,3328,953],{"class":771},[690,3330,956],{"class":767},[690,3332,3252],{"class":834},[690,3334,3335],{"class":767},"!",[690,3337,837],{"class":846},[690,3339,858],{"class":767},[690,3341,3342],{"class":699},"enqueue",[690,3344,858],{"class":767},[690,3346,812],{"class":767},[690,3348,3349],{"class":803}," async",[690,3351,928],{"class":767},[690,3353,931],{"class":803},[690,3355,934],{"class":767},[690,3357,3358,3360,3363,3365,3367],{"class":692,"line":983},[690,3359,2525],{"class":803},[690,3361,3362],{"class":771}," child",[690,3364,831],{"class":767},[690,3366,815],{"class":834},[690,3368,948],{"class":846},[690,3370,3371,3374,3376,3378,3380,3382,3385,3387,3389,3392,3394,3396],{"class":692,"line":1017},[690,3372,3373],{"class":771},"    child",[690,3375,956],{"class":767},[690,3377,959],{"class":834},[690,3379,837],{"class":846},[690,3381,964],{"class":767},[690,3383,3384],{"class":846}," job",[690,3386,850],{"class":767},[690,3388,781],{"class":767},[690,3390,3391],{"class":699},"queued",[690,3393,858],{"class":767},[690,3395,775],{"class":767},[690,3397,869],{"class":846},[690,3399,3400,3402],{"class":692,"line":1507},[690,3401,1510],{"class":767},[690,3403,869],{"class":846},[690,3405,3406,3408,3410,3412,3414,3416,3418,3421,3423,3425,3427],{"class":692,"line":1515},[690,3407,986],{"class":763},[690,3409,989],{"class":771},[690,3411,956],{"class":767},[690,3413,994],{"class":834},[690,3415,837],{"class":846},[690,3417,964],{"class":767},[690,3419,3420],{"class":846}," ok",[690,3422,850],{"class":767},[690,3424,1210],{"class":1209},[690,3426,775],{"class":767},[690,3428,869],{"class":846},[690,3430,3431,3433],{"class":692,"line":1520},[690,3432,828],{"class":767},[690,3434,869],{"class":771},[668,3436,3438],{"id":3437},"error-handling","Error Handling",[604,3440,3441,3442,3445,3446,1626,3449,3452,3453,3456],{},"Use ",[608,3443,3444],{},"createError"," for structured errors with ",[608,3447,3448],{},"why",[608,3450,3451],{},"fix",", and ",[608,3454,3455],{},"link"," fields that help developers debug in both logs and API responses:",[1913,3458,3459],{},[680,3460,3463],{"className":753,"code":3461,"filename":3462,"language":756,"meta":686,"style":686},"import { withEvlog, useLogger, createError } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async (request: Request) => {\n  const log = useLogger()\n  const body = await request.json()\n\n  log.set({ payment: { amount: body.amount } })\n\n  if (body.amount \u003C= 0) {\n    throw createError({\n      status: 400,\n      message: 'Invalid payment amount',\n      why: 'The amount must be a positive number',\n      fix: 'Pass a positive integer in cents (e.g. 4999 for $49.99)',\n      link: 'https:\u002F\u002Fdocs.example.com\u002Fapi\u002Fpayments#amount',\n    })\n  }\n\n  const result = await chargeCard(body)\n\n  if (!result.success) {\n    log.error(new Error(`Payment declined: ${result.reason}`))\n    throw createError({\n      status: 402,\n      message: 'Payment declined',\n      why: `Card declined by issuer: ${result.reason}`,\n      fix: 'Try a different payment method or contact your bank',\n    })\n  }\n\n  return Response.json({ success: true })\n})\n","app\u002Fapi\u002Fpayment\u002Fprocess\u002Froute.ts",[608,3464,3465,3492,3496,3526,3538,3556,3560,3596,3600,3623,3634,3645,3661,3677,3693,3709,3716,3720,3724,3744,3748,3768,3809,3819,3830,3845,3869,3884,3890,3894,3898,3922],{"__ignoreMap":686},[690,3466,3467,3469,3471,3473,3475,3477,3479,3482,3484,3486,3488,3490],{"class":692,"line":693},[690,3468,764],{"class":763},[690,3470,768],{"class":767},[690,3472,809],{"class":771},[690,3474,812],{"class":767},[690,3476,815],{"class":771},[690,3478,812],{"class":767},[690,3480,3481],{"class":771}," createError",[690,3483,775],{"class":767},[690,3485,778],{"class":763},[690,3487,781],{"class":767},[690,3489,900],{"class":699},[690,3491,787],{"class":767},[690,3493,3494],{"class":692,"line":790},[690,3495,794],{"emptyLinePlaceholder":793},[690,3497,3498,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518,3520,3522,3524],{"class":692,"line":797},[690,3499,800],{"class":763},[690,3501,804],{"class":803},[690,3503,2812],{"class":771},[690,3505,918],{"class":767},[690,3507,809],{"class":834},[690,3509,837],{"class":771},[690,3511,925],{"class":803},[690,3513,2508],{"class":767},[690,3515,2825],{"class":2511},[690,3517,850],{"class":767},[690,3519,2830],{"class":696},[690,3521,2515],{"class":767},[690,3523,931],{"class":803},[690,3525,934],{"class":767},[690,3527,3528,3530,3532,3534,3536],{"class":692,"line":843},[690,3529,939],{"class":803},[690,3531,820],{"class":771},[690,3533,831],{"class":767},[690,3535,815],{"class":834},[690,3537,948],{"class":846},[690,3539,3540,3542,3544,3546,3548,3550,3552,3554],{"class":692,"line":864},[690,3541,939],{"class":803},[690,3543,2855],{"class":771},[690,3545,831],{"class":767},[690,3547,1431],{"class":763},[690,3549,2862],{"class":771},[690,3551,956],{"class":767},[690,3553,994],{"class":834},[690,3555,948],{"class":846},[690,3557,3558],{"class":692,"line":983},[690,3559,794],{"emptyLinePlaceholder":793},[690,3561,3562,3564,3566,3568,3570,3572,3574,3576,3578,3581,3583,3585,3587,3590,3592,3594],{"class":692,"line":1017},[690,3563,953],{"class":771},[690,3565,956],{"class":767},[690,3567,959],{"class":834},[690,3569,837],{"class":846},[690,3571,964],{"class":767},[690,3573,3031],{"class":846},[690,3575,850],{"class":767},[690,3577,768],{"class":767},[690,3579,3580],{"class":846}," amount",[690,3582,850],{"class":767},[690,3584,2855],{"class":771},[690,3586,956],{"class":767},[690,3588,3589],{"class":771},"amount",[690,3591,775],{"class":767},[690,3593,775],{"class":767},[690,3595,869],{"class":846},[690,3597,3598],{"class":692,"line":1507},[690,3599,794],{"emptyLinePlaceholder":793},[690,3601,3602,3605,3607,3609,3611,3613,3616,3619,3621],{"class":692,"line":1515},[690,3603,3604],{"class":763},"  if",[690,3606,2508],{"class":846},[690,3608,3043],{"class":771},[690,3610,956],{"class":767},[690,3612,3589],{"class":771},[690,3614,3615],{"class":767}," \u003C=",[690,3617,3618],{"class":2106}," 0",[690,3620,2584],{"class":846},[690,3622,840],{"class":767},[690,3624,3625,3628,3630,3632],{"class":692,"line":1520},[690,3626,3627],{"class":763},"    throw",[690,3629,3481],{"class":834},[690,3631,837],{"class":846},[690,3633,840],{"class":767},[690,3635,3636,3639,3641,3643],{"class":692,"line":1527},[690,3637,3638],{"class":846},"      status",[690,3640,850],{"class":767},[690,3642,2318],{"class":2106},[690,3644,861],{"class":767},[690,3646,3647,3650,3652,3654,3657,3659],{"class":692,"line":1539},[690,3648,3649],{"class":846},"      message",[690,3651,850],{"class":767},[690,3653,781],{"class":767},[690,3655,3656],{"class":699},"Invalid payment amount",[690,3658,858],{"class":767},[690,3660,861],{"class":767},[690,3662,3663,3666,3668,3670,3673,3675],{"class":692,"line":1549},[690,3664,3665],{"class":846},"      why",[690,3667,850],{"class":767},[690,3669,781],{"class":767},[690,3671,3672],{"class":699},"The amount must be a positive number",[690,3674,858],{"class":767},[690,3676,861],{"class":767},[690,3678,3679,3682,3684,3686,3689,3691],{"class":692,"line":1556},[690,3680,3681],{"class":846},"      fix",[690,3683,850],{"class":767},[690,3685,781],{"class":767},[690,3687,3688],{"class":699},"Pass a positive integer in cents (e.g. 4999 for $49.99)",[690,3690,858],{"class":767},[690,3692,861],{"class":767},[690,3694,3695,3698,3700,3702,3705,3707],{"class":692,"line":1562},[690,3696,3697],{"class":846},"      link",[690,3699,850],{"class":767},[690,3701,781],{"class":767},[690,3703,3704],{"class":699},"https:\u002F\u002Fdocs.example.com\u002Fapi\u002Fpayments#amount",[690,3706,858],{"class":767},[690,3708,861],{"class":767},[690,3710,3711,3714],{"class":692,"line":1574},[690,3712,3713],{"class":767},"    }",[690,3715,869],{"class":846},[690,3717,3718],{"class":692,"line":1580},[690,3719,1577],{"class":767},[690,3721,3722],{"class":692,"line":2201},[690,3723,794],{"emptyLinePlaceholder":793},[690,3725,3726,3728,3731,3733,3735,3738,3740,3742],{"class":692,"line":2206},[690,3727,939],{"class":803},[690,3729,3730],{"class":771}," result",[690,3732,831],{"class":767},[690,3734,1431],{"class":763},[690,3736,3737],{"class":834}," chargeCard",[690,3739,837],{"class":846},[690,3741,3043],{"class":771},[690,3743,869],{"class":846},[690,3745,3746],{"class":692,"line":2239},[690,3747,794],{"emptyLinePlaceholder":793},[690,3749,3750,3752,3754,3756,3759,3761,3764,3766],{"class":692,"line":2254},[690,3751,3604],{"class":763},[690,3753,2508],{"class":846},[690,3755,3335],{"class":767},[690,3757,3758],{"class":771},"result",[690,3760,956],{"class":767},[690,3762,3763],{"class":771},"success",[690,3765,2584],{"class":846},[690,3767,840],{"class":767},[690,3769,3770,3773,3775,3778,3780,3783,3786,3788,3791,3794,3797,3799,3801,3804,3807],{"class":692,"line":2259},[690,3771,3772],{"class":771},"    log",[690,3774,956],{"class":767},[690,3776,3777],{"class":834},"error",[690,3779,837],{"class":846},[690,3781,3782],{"class":767},"new",[690,3784,3785],{"class":834}," Error",[690,3787,837],{"class":846},[690,3789,3790],{"class":767},"`",[690,3792,3793],{"class":699},"Payment declined: ",[690,3795,3796],{"class":767},"${",[690,3798,3758],{"class":771},[690,3800,956],{"class":767},[690,3802,3803],{"class":771},"reason",[690,3805,3806],{"class":767},"}`",[690,3808,2198],{"class":846},[690,3810,3811,3813,3815,3817],{"class":692,"line":2265},[690,3812,3627],{"class":763},[690,3814,3481],{"class":834},[690,3816,837],{"class":846},[690,3818,840],{"class":767},[690,3820,3821,3823,3825,3828],{"class":692,"line":2275},[690,3822,3638],{"class":846},[690,3824,850],{"class":767},[690,3826,3827],{"class":2106}," 402",[690,3829,861],{"class":767},[690,3831,3832,3834,3836,3838,3841,3843],{"class":692,"line":2296},[690,3833,3649],{"class":846},[690,3835,850],{"class":767},[690,3837,781],{"class":767},[690,3839,3840],{"class":699},"Payment declined",[690,3842,858],{"class":767},[690,3844,861],{"class":767},[690,3846,3847,3849,3851,3854,3857,3859,3861,3863,3865,3867],{"class":692,"line":2307},[690,3848,3665],{"class":846},[690,3850,850],{"class":767},[690,3852,3853],{"class":767}," `",[690,3855,3856],{"class":699},"Card declined by issuer: ",[690,3858,3796],{"class":767},[690,3860,3758],{"class":771},[690,3862,956],{"class":767},[690,3864,3803],{"class":771},[690,3866,3806],{"class":767},[690,3868,861],{"class":767},[690,3870,3871,3873,3875,3877,3880,3882],{"class":692,"line":2327},[690,3872,3681],{"class":846},[690,3874,850],{"class":767},[690,3876,781],{"class":767},[690,3878,3879],{"class":699},"Try a different payment method or contact your bank",[690,3881,858],{"class":767},[690,3883,861],{"class":767},[690,3885,3886,3888],{"class":692,"line":2345},[690,3887,3713],{"class":767},[690,3889,869],{"class":846},[690,3891,3892],{"class":692,"line":2367},[690,3893,1577],{"class":767},[690,3895,3896],{"class":692,"line":2375},[690,3897,794],{"emptyLinePlaceholder":793},[690,3899,3900,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920],{"class":692,"line":2380},[690,3901,986],{"class":763},[690,3903,989],{"class":771},[690,3905,956],{"class":767},[690,3907,994],{"class":834},[690,3909,837],{"class":846},[690,3911,964],{"class":767},[690,3913,3121],{"class":846},[690,3915,850],{"class":767},[690,3917,1210],{"class":1209},[690,3919,775],{"class":767},[690,3921,869],{"class":846},[690,3923,3924,3926],{"class":692,"line":2385},[690,3925,828],{"class":767},[690,3927,869],{"class":771},[604,3929,3930,3932,3933,3936],{},[608,3931,614],{}," catches ",[608,3934,3935],{},"EvlogError"," and returns a structured JSON response (like Nitro does for Nuxt):",[680,3938,3942],{"className":3939,"code":3940,"filename":3941,"language":994,"meta":686,"style":686},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"EvlogError\",\n  \"message\": \"Payment declined\",\n  \"status\": 402,\n  \"data\": {\n    \"why\": \"Card declined by issuer: insufficient_funds\",\n    \"fix\": \"Try a different payment method or contact your bank\"\n  }\n}\n","Response (402)",[608,3943,3944,3948,3970,3989,4004,4017,4037,4054,4058],{"__ignoreMap":686},[690,3945,3946],{"class":692,"line":693},[690,3947,840],{"class":767},[690,3949,3950,3953,3956,3959,3961,3964,3966,3968],{"class":692,"line":790},[690,3951,3952],{"class":767},"  \"",[690,3954,3955],{"class":803},"name",[690,3957,3958],{"class":767},"\"",[690,3960,850],{"class":767},[690,3962,3963],{"class":767}," \"",[690,3965,3935],{"class":699},[690,3967,3958],{"class":767},[690,3969,861],{"class":767},[690,3971,3972,3974,3977,3979,3981,3983,3985,3987],{"class":692,"line":797},[690,3973,3952],{"class":767},[690,3975,3976],{"class":803},"message",[690,3978,3958],{"class":767},[690,3980,850],{"class":767},[690,3982,3963],{"class":767},[690,3984,3840],{"class":699},[690,3986,3958],{"class":767},[690,3988,861],{"class":767},[690,3990,3991,3993,3996,3998,4000,4002],{"class":692,"line":843},[690,3992,3952],{"class":767},[690,3994,3995],{"class":803},"status",[690,3997,3958],{"class":767},[690,3999,850],{"class":767},[690,4001,3827],{"class":2106},[690,4003,861],{"class":767},[690,4005,4006,4008,4011,4013,4015],{"class":692,"line":864},[690,4007,3952],{"class":767},[690,4009,4010],{"class":803},"data",[690,4012,3958],{"class":767},[690,4014,850],{"class":767},[690,4016,934],{"class":767},[690,4018,4019,4022,4024,4026,4028,4030,4033,4035],{"class":692,"line":983},[690,4020,4021],{"class":767},"    \"",[690,4023,3448],{"class":696},[690,4025,3958],{"class":767},[690,4027,850],{"class":767},[690,4029,3963],{"class":767},[690,4031,4032],{"class":699},"Card declined by issuer: insufficient_funds",[690,4034,3958],{"class":767},[690,4036,861],{"class":767},[690,4038,4039,4041,4043,4045,4047,4049,4051],{"class":692,"line":1017},[690,4040,4021],{"class":767},[690,4042,3451],{"class":696},[690,4044,3958],{"class":767},[690,4046,850],{"class":767},[690,4048,3963],{"class":767},[690,4050,3879],{"class":699},[690,4052,4053],{"class":767},"\"\n",[690,4055,4056],{"class":692,"line":1507},[690,4057,1577],{"class":767},[690,4059,4060],{"class":692,"line":1515},[690,4061,4062],{"class":767},"}\n",[604,4064,4065],{},"In the terminal, the error renders inside the wide event: error block first, then request context. Colors and tree connectors render in the terminal; the example below omits ANSI for readability.",[680,4067,4070],{"className":682,"code":4068,"filename":4069,"language":685,"meta":686,"style":686},"ERROR [app] POST \u002Fapi\u002Fpayment\u002Fprocess 402 in 12ms\n  ├─ error: Payment declined\n  │     at app\u002Fapi\u002Fpayment\u002Fprocess\u002Froute.ts:336\n  │   ❯ 336 ┃ throw createError({ message: 'Payment declined', ... })\n  │     Why: Card declined by issuer: insufficient_funds\n  │     Fix: Try a different payment method or contact your bank\n  │     stack (3 frames hidden in node_modules)\n  └─ payment: amount=4999\n","Terminal output",[608,4071,4072,4080,4093,4104,4127,4149,4181,4205],{"__ignoreMap":686},[690,4073,4074,4077],{"class":692,"line":693},[690,4075,4076],{"class":696},"ERROR",[690,4078,4079],{"class":771}," [app] POST \u002Fapi\u002Fpayment\u002Fprocess 402 in 12ms\n",[690,4081,4082,4084,4087,4090],{"class":692,"line":790},[690,4083,3174],{"class":696},[690,4085,4086],{"class":699}," error:",[690,4088,4089],{"class":699}," Payment",[690,4091,4092],{"class":699}," declined\n",[690,4094,4095,4098,4101],{"class":692,"line":797},[690,4096,4097],{"class":696},"  │",[690,4099,4100],{"class":699},"     at",[690,4102,4103],{"class":699}," app\u002Fapi\u002Fpayment\u002Fprocess\u002Froute.ts:336\n",[690,4105,4106,4108,4111,4114,4117,4120,4122,4124],{"class":692,"line":843},[690,4107,4097],{"class":696},[690,4109,4110],{"class":699},"   ❯",[690,4112,4113],{"class":2106}," 336",[690,4115,4116],{"class":699}," ┃",[690,4118,4119],{"class":699}," throw",[690,4121,3481],{"class":699},[690,4123,837],{"class":767},[690,4125,4126],{"class":771},"{ message: 'Payment declined', ... })\n",[690,4128,4129,4131,4134,4137,4140,4143,4146],{"class":692,"line":864},[690,4130,4097],{"class":696},[690,4132,4133],{"class":699},"     Why:",[690,4135,4136],{"class":699}," Card",[690,4138,4139],{"class":699}," declined",[690,4141,4142],{"class":699}," by",[690,4144,4145],{"class":699}," issuer:",[690,4147,4148],{"class":699}," insufficient_funds\n",[690,4150,4151,4153,4156,4159,4162,4165,4167,4169,4172,4175,4178],{"class":692,"line":983},[690,4152,4097],{"class":696},[690,4154,4155],{"class":699},"     Fix:",[690,4157,4158],{"class":699}," Try",[690,4160,4161],{"class":699}," a",[690,4163,4164],{"class":699}," different",[690,4166,3031],{"class":699},[690,4168,3069],{"class":699},[690,4170,4171],{"class":699}," or",[690,4173,4174],{"class":699}," contact",[690,4176,4177],{"class":699}," your",[690,4179,4180],{"class":699}," bank\n",[690,4182,4183,4185,4188,4191,4194,4197,4200,4203],{"class":692,"line":1017},[690,4184,4097],{"class":696},[690,4186,4187],{"class":699},"     stack",[690,4189,4190],{"class":771}," (3 ",[690,4192,4193],{"class":699},"frames",[690,4195,4196],{"class":699}," hidden",[690,4198,4199],{"class":699}," in",[690,4201,4202],{"class":699}," node_modules",[690,4204,869],{"class":767},[690,4206,4207,4209,4211,4214],{"class":692,"line":1507},[690,4208,3226],{"class":696},[690,4210,3212],{"class":699},[690,4212,4213],{"class":699}," amount=",[690,4215,4216],{"class":2106},"4999\n",[672,4218,4220],{"id":4219},"parsing-errors-on-the-client","Parsing Errors on the Client",[604,4222,3441,4223,4226,4227,4229,4230,4233],{},[608,4224,4225],{},"parseError"," to extract the structured fields from any error, whether it's a fetch response, an ",[608,4228,3935],{},", or a plain ",[608,4231,4232],{},"Error"," object:",[680,4235,4240],{"className":4236,"code":4237,"filename":4238,"language":4239,"meta":686,"style":686},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'use client'\nimport { parseError } from 'evlog'\n\nasync function handleSubmit(formData: FormData) {\n  try {\n    const res = await fetch('\u002Fapi\u002Fpayment\u002Fprocess', {\n      method: 'POST',\n      body: JSON.stringify({ amount: Number(formData.get('amount')) }),\n    })\n    if (!res.ok) throw { data: await res.json(), status: res.status }\n  } catch (error) {\n    const { message, status, why, fix, link } = parseError(error)\n    \u002F\u002F message: \"Payment declined\"\n    \u002F\u002F why: \"Card declined by issuer: insufficient_funds\"\n    \u002F\u002F fix: \"Try a different payment method or contact your bank\"\n  }\n}\n","app\u002Fcomponents\u002FPaymentForm.tsx","tsx",[608,4241,4242,4251,4270,4274,4298,4305,4332,4348,4399,4405,4458,4473,4512,4517,4522,4527,4531],{"__ignoreMap":686},[690,4243,4244,4246,4249],{"class":692,"line":693},[690,4245,858],{"class":767},[690,4247,4248],{"class":699},"use client",[690,4250,787],{"class":767},[690,4252,4253,4255,4257,4260,4262,4264,4266,4268],{"class":692,"line":790},[690,4254,764],{"class":763},[690,4256,768],{"class":767},[690,4258,4259],{"class":771}," parseError",[690,4261,775],{"class":767},[690,4263,778],{"class":763},[690,4265,781],{"class":767},[690,4267,1940],{"class":699},[690,4269,787],{"class":767},[690,4271,4272],{"class":692,"line":797},[690,4273,794],{"emptyLinePlaceholder":793},[690,4275,4276,4278,4281,4284,4286,4289,4291,4294,4296],{"class":692,"line":843},[690,4277,925],{"class":803},[690,4279,4280],{"class":803}," function",[690,4282,4283],{"class":834}," handleSubmit",[690,4285,837],{"class":767},[690,4287,4288],{"class":2511},"formData",[690,4290,850],{"class":767},[690,4292,4293],{"class":696}," FormData",[690,4295,2515],{"class":767},[690,4297,934],{"class":767},[690,4299,4300,4303],{"class":692,"line":864},[690,4301,4302],{"class":763},"  try",[690,4304,934],{"class":767},[690,4306,4307,4309,4312,4314,4316,4319,4321,4323,4326,4328,4330],{"class":692,"line":983},[690,4308,2525],{"class":803},[690,4310,4311],{"class":771}," res",[690,4313,831],{"class":767},[690,4315,1431],{"class":763},[690,4317,4318],{"class":834}," fetch",[690,4320,837],{"class":846},[690,4322,858],{"class":767},[690,4324,4325],{"class":699},"\u002Fapi\u002Fpayment\u002Fprocess",[690,4327,858],{"class":767},[690,4329,812],{"class":767},[690,4331,934],{"class":767},[690,4333,4334,4337,4339,4341,4344,4346],{"class":692,"line":1017},[690,4335,4336],{"class":846},"      method",[690,4338,850],{"class":767},[690,4340,781],{"class":767},[690,4342,4343],{"class":699},"POST",[690,4345,858],{"class":767},[690,4347,861],{"class":767},[690,4349,4350,4353,4355,4358,4360,4362,4364,4366,4368,4370,4373,4375,4377,4379,4382,4384,4386,4388,4390,4393,4395,4397],{"class":692,"line":1507},[690,4351,4352],{"class":846},"      body",[690,4354,850],{"class":767},[690,4356,4357],{"class":771}," JSON",[690,4359,956],{"class":767},[690,4361,1702],{"class":834},[690,4363,837],{"class":846},[690,4365,964],{"class":767},[690,4367,3580],{"class":846},[690,4369,850],{"class":767},[690,4371,4372],{"class":834}," Number",[690,4374,837],{"class":846},[690,4376,4288],{"class":771},[690,4378,956],{"class":767},[690,4380,4381],{"class":834},"get",[690,4383,837],{"class":846},[690,4385,858],{"class":767},[690,4387,3589],{"class":699},[690,4389,858],{"class":767},[690,4391,4392],{"class":846},")) ",[690,4394,828],{"class":767},[690,4396,2515],{"class":846},[690,4398,861],{"class":767},[690,4400,4401,4403],{"class":692,"line":1515},[690,4402,3713],{"class":767},[690,4404,869],{"class":846},[690,4406,4407,4409,4411,4413,4416,4418,4421,4423,4426,4428,4431,4433,4435,4437,4439,4441,4443,4445,4447,4449,4451,4453,4455],{"class":692,"line":1520},[690,4408,2571],{"class":763},[690,4410,2508],{"class":846},[690,4412,3335],{"class":767},[690,4414,4415],{"class":771},"res",[690,4417,956],{"class":767},[690,4419,4420],{"class":771},"ok",[690,4422,2584],{"class":846},[690,4424,4425],{"class":763},"throw",[690,4427,768],{"class":767},[690,4429,4430],{"class":846}," data",[690,4432,850],{"class":767},[690,4434,1431],{"class":763},[690,4436,4311],{"class":771},[690,4438,956],{"class":767},[690,4440,994],{"class":834},[690,4442,1322],{"class":846},[690,4444,812],{"class":767},[690,4446,2313],{"class":846},[690,4448,850],{"class":767},[690,4450,4311],{"class":771},[690,4452,956],{"class":767},[690,4454,3995],{"class":771},[690,4456,4457],{"class":767}," }\n",[690,4459,4460,4462,4465,4467,4469,4471],{"class":692,"line":1527},[690,4461,1510],{"class":767},[690,4463,4464],{"class":763}," catch",[690,4466,2508],{"class":846},[690,4468,3777],{"class":771},[690,4470,2584],{"class":846},[690,4472,840],{"class":767},[690,4474,4475,4477,4479,4481,4483,4485,4487,4490,4492,4495,4497,4500,4502,4504,4506,4508,4510],{"class":692,"line":1539},[690,4476,2525],{"class":803},[690,4478,768],{"class":767},[690,4480,1001],{"class":771},[690,4482,812],{"class":767},[690,4484,2313],{"class":771},[690,4486,812],{"class":767},[690,4488,4489],{"class":771}," why",[690,4491,812],{"class":767},[690,4493,4494],{"class":771}," fix",[690,4496,812],{"class":767},[690,4498,4499],{"class":771}," link",[690,4501,775],{"class":767},[690,4503,831],{"class":767},[690,4505,4259],{"class":834},[690,4507,837],{"class":846},[690,4509,3777],{"class":771},[690,4511,869],{"class":846},[690,4513,4514],{"class":692,"line":1549},[690,4515,4516],{"class":1552},"    \u002F\u002F message: \"Payment declined\"\n",[690,4518,4519],{"class":692,"line":1556},[690,4520,4521],{"class":1552},"    \u002F\u002F why: \"Card declined by issuer: insufficient_funds\"\n",[690,4523,4524],{"class":692,"line":1562},[690,4525,4526],{"class":1552},"    \u002F\u002F fix: \"Try a different payment method or contact your bank\"\n",[690,4528,4529],{"class":692,"line":1574},[690,4530,1577],{"class":767},[690,4532,4533],{"class":692,"line":1580},[690,4534,4062],{"class":767},[604,4536,4537,4539,4540,4543,4544,4547],{},[608,4538,4225],{}," normalizes any error shape into a flat ",[608,4541,4542],{},"{ message, status, why?, fix?, link? }"," object, so your UI code never has to dig through nested ",[608,4545,4546],{},"data.data"," or check for different error formats.",[668,4549,543],{"id":4550},"configuration-1",[1042,4552,4553,4554,4557,4558,1626,4560,1626,4562,1626,4564,4566],{"color":1044,"icon":84},"See the ",[657,4555,4556],{"href":544},"Configuration reference"," for the full list of shared options (",[608,4559,1685],{},[608,4561,1694],{},[608,4563,1662],{},[608,4565,1699],{},", middleware options, etc.).",[604,4568,4569,4570,4572],{},"The ",[608,4571,610],{}," factory accepts the following options:",[1707,4574,4575,4587],{},[1710,4576,4577],{},[1713,4578,4579,4581,4583,4585],{},[1716,4580,1718],{},[1716,4582,1721],{},[1716,4584,1724],{},[1716,4586,1727],{},[1729,4588,4589,4608,4625,4645,4663,4682,4701,4720,4739,4757],{},[1713,4590,4591,4595,4600,4605],{},[1734,4592,4593],{},[608,4594,1688],{},[1734,4596,4597],{},[608,4598,4599],{},"string",[1734,4601,4602],{},[608,4603,4604],{},"'app'",[1734,4606,4607],{},"Service name shown in logs",[1713,4609,4610,4615,4619,4622],{},[1734,4611,4612],{},[608,4613,4614],{},"environment",[1734,4616,4617],{},[608,4618,4599],{},[1734,4620,4621],{},"Auto-detected",[1734,4623,4624],{},"Environment name",[1713,4626,4627,4632,4637,4642],{},[1734,4628,4629],{},[608,4630,4631],{},"include",[1734,4633,4634],{},[608,4635,4636],{},"string[]",[1734,4638,4639],{},[608,4640,4641],{},"undefined",[1734,4643,4644],{},"Route patterns to log",[1713,4646,4647,4652,4656,4660],{},[1734,4648,4649],{},[608,4650,4651],{},"exclude",[1734,4653,4654],{},[608,4655,4636],{},[1734,4657,4658],{},[608,4659,4641],{},[1734,4661,4662],{},"Route patterns to exclude",[1713,4664,4665,4670,4675,4679],{},[1734,4666,4667],{},[608,4668,4669],{},"routes",[1734,4671,4672],{},[608,4673,4674],{},"Record\u003Cstring, RouteConfig>",[1734,4676,4677],{},[608,4678,4641],{},[1734,4680,4681],{},"Route-specific service configuration",[1713,4683,4684,4689,4694,4698],{},[1734,4685,4686],{},[608,4687,4688],{},"sampling.rates",[1734,4690,4691],{},[608,4692,4693],{},"object",[1734,4695,4696],{},[608,4697,4641],{},[1734,4699,4700],{},"Head sampling rates per log level",[1713,4702,4703,4708,4713,4717],{},[1734,4704,4705],{},[608,4706,4707],{},"sampling.keep",[1734,4709,4710],{},[608,4711,4712],{},"array",[1734,4714,4715],{},[608,4716,4641],{},[1734,4718,4719],{},"Tail sampling conditions",[1713,4721,4722,4727,4732,4736],{},[1734,4723,4724],{},[608,4725,4726],{},"keep",[1734,4728,4729],{},[608,4730,4731],{},"(ctx: TailSamplingContext) => void",[1734,4733,4734],{},[608,4735,4641],{},[1734,4737,4738],{},"Custom tail sampling callback",[1713,4740,4741,4745,4750,4754],{},[1734,4742,4743],{},[608,4744,1086],{},[1734,4746,4747],{},[608,4748,4749],{},"DrainFunction",[1734,4751,4752],{},[608,4753,4641],{},[1734,4755,4756],{},"Drain adapter for external services",[1713,4758,4759,4764,4769,4773],{},[1734,4760,4761],{},[608,4762,4763],{},"enrich",[1734,4765,4766],{},[608,4767,4768],{},"(ctx: EnrichContext) => void",[1734,4770,4771],{},[608,4772,4641],{},[1734,4774,4775],{},"Event enrichment callback",[668,4777,4779],{"id":4778},"tail-sampling","Tail Sampling",[604,4781,4782],{},"Combine rule-based and custom tail sampling to always capture what matters, even when head sampling drops most logs:",[680,4784,4786],{"className":753,"code":4785,"filename":755,"language":756,"meta":686,"style":686},"export const { withEvlog, useLogger } = createEvlog({\n  service: 'my-app',\n  sampling: {\n    rates: { info: 10 }, \u002F\u002F Only keep 10% of info logs\n    keep: [\n      { status: 400 },              \u002F\u002F Always keep 4xx\u002F5xx\n      { duration: 1000 },           \u002F\u002F Always keep slow requests\n      { path: '\u002Fapi\u002Fcritical\u002F**' }, \u002F\u002F Always keep critical paths\n    ],\n  },\n  \u002F\u002F Custom: always keep premium user requests\n  keep: (ctx) => {\n    const user = ctx.context.user as { premium?: boolean } | undefined\n    if (user?.premium) ctx.shouldKeep = true\n  },\n})\n",[608,4787,4788,4813,4827,4835,4854,4862,4877,4891,4909,4915,4919,4924,4940,4974,4998,5002],{"__ignoreMap":686},[690,4789,4790,4792,4794,4796,4798,4800,4803,4805,4807,4809,4811],{"class":692,"line":693},[690,4791,800],{"class":763},[690,4793,804],{"class":803},[690,4795,768],{"class":767},[690,4797,809],{"class":771},[690,4799,812],{"class":767},[690,4801,4802],{"class":771}," useLogger ",[690,4804,828],{"class":767},[690,4806,831],{"class":767},[690,4808,772],{"class":834},[690,4810,837],{"class":771},[690,4812,840],{"class":767},[690,4814,4815,4817,4819,4821,4823,4825],{"class":692,"line":790},[690,4816,847],{"class":846},[690,4818,850],{"class":767},[690,4820,781],{"class":767},[690,4822,855],{"class":699},[690,4824,858],{"class":767},[690,4826,861],{"class":767},[690,4828,4829,4831,4833],{"class":692,"line":797},[690,4830,2268],{"class":846},[690,4832,850],{"class":767},[690,4834,934],{"class":767},[690,4836,4837,4839,4841,4843,4845,4847,4849,4851],{"class":692,"line":843},[690,4838,2278],{"class":846},[690,4840,850],{"class":767},[690,4842,768],{"class":767},[690,4844,2285],{"class":846},[690,4846,850],{"class":767},[690,4848,2290],{"class":2106},[690,4850,2321],{"class":767},[690,4852,4853],{"class":1552}," \u002F\u002F Only keep 10% of info logs\n",[690,4855,4856,4858,4860],{"class":692,"line":864},[690,4857,2299],{"class":846},[690,4859,850],{"class":767},[690,4861,2304],{"class":771},[690,4863,4864,4866,4868,4870,4872,4874],{"class":692,"line":983},[690,4865,2310],{"class":767},[690,4867,2313],{"class":846},[690,4869,850],{"class":767},[690,4871,2318],{"class":2106},[690,4873,2321],{"class":767},[690,4875,4876],{"class":1552},"              \u002F\u002F Always keep 4xx\u002F5xx\n",[690,4878,4879,4881,4883,4885,4887,4889],{"class":692,"line":1017},[690,4880,2310],{"class":767},[690,4882,2332],{"class":846},[690,4884,850],{"class":767},[690,4886,2337],{"class":2106},[690,4888,2321],{"class":767},[690,4890,2342],{"class":1552},[690,4892,4893,4895,4897,4899,4901,4903,4905,4907],{"class":692,"line":1507},[690,4894,2310],{"class":767},[690,4896,2350],{"class":846},[690,4898,850],{"class":767},[690,4900,781],{"class":767},[690,4902,2357],{"class":699},[690,4904,858],{"class":767},[690,4906,2321],{"class":767},[690,4908,2364],{"class":1552},[690,4910,4911,4913],{"class":692,"line":1515},[690,4912,2370],{"class":771},[690,4914,861],{"class":767},[690,4916,4917],{"class":692,"line":1520},[690,4918,1895],{"class":767},[690,4920,4921],{"class":692,"line":1527},[690,4922,4923],{"class":1552},"  \u002F\u002F Custom: always keep premium user requests\n",[690,4925,4926,4928,4930,4932,4934,4936,4938],{"class":692,"line":1539},[690,4927,2503],{"class":834},[690,4929,850],{"class":767},[690,4931,2508],{"class":767},[690,4933,2512],{"class":2511},[690,4935,2515],{"class":767},[690,4937,931],{"class":803},[690,4939,934],{"class":767},[690,4941,4942,4944,4946,4948,4950,4952,4954,4956,4958,4960,4962,4964,4966,4968,4970,4972],{"class":692,"line":1549},[690,4943,2525],{"class":803},[690,4945,2528],{"class":771},[690,4947,831],{"class":767},[690,4949,2533],{"class":771},[690,4951,956],{"class":767},[690,4953,2538],{"class":771},[690,4955,956],{"class":767},[690,4957,2543],{"class":771},[690,4959,2546],{"class":763},[690,4961,768],{"class":767},[690,4963,2551],{"class":846},[690,4965,2554],{"class":767},[690,4967,2557],{"class":696},[690,4969,775],{"class":767},[690,4971,2562],{"class":767},[690,4973,2565],{"class":696},[690,4975,4976,4978,4980,4982,4984,4986,4988,4990,4992,4994,4996],{"class":692,"line":1556},[690,4977,2571],{"class":763},[690,4979,2508],{"class":846},[690,4981,2543],{"class":771},[690,4983,2578],{"class":767},[690,4985,2581],{"class":771},[690,4987,2584],{"class":846},[690,4989,2512],{"class":771},[690,4991,956],{"class":767},[690,4993,2591],{"class":771},[690,4995,831],{"class":767},[690,4997,2596],{"class":1209},[690,4999,5000],{"class":692,"line":1562},[690,5001,1895],{"class":767},[690,5003,5004,5006],{"class":692,"line":1574},[690,5005,828],{"class":767},[690,5007,869],{"class":771},[604,5009,4569,5010,5012],{},[608,5011,4726],{}," rules use OR logic: any match forces the event through regardless of head sampling.",[668,5014,374],{"id":5015},"middleware",[604,5017,5018,5019,1613,5022,5025,5026,5028],{},"Set ",[608,5020,5021],{},"x-request-id",[608,5023,5024],{},"x-evlog-start"," headers so ",[608,5027,614],{}," can correlate timing across the middleware -> handler chain:",[680,5030,5033],{"className":753,"code":5031,"filename":5032,"language":756,"meta":686,"style":686},"import { evlogMiddleware } from 'evlog\u002Fnext'\n\nexport const proxy = evlogMiddleware()\n\nexport const config = {\n  matcher: ['\u002Fapi\u002F:path*'],\n}\n","proxy.ts",[608,5034,5035,5054,5058,5073,5077,5090,5110],{"__ignoreMap":686},[690,5036,5037,5039,5041,5044,5046,5048,5050,5052],{"class":692,"line":693},[690,5038,764],{"class":763},[690,5040,768],{"class":767},[690,5042,5043],{"class":771}," evlogMiddleware",[690,5045,775],{"class":767},[690,5047,778],{"class":763},[690,5049,781],{"class":767},[690,5051,784],{"class":699},[690,5053,787],{"class":767},[690,5055,5056],{"class":692,"line":790},[690,5057,794],{"emptyLinePlaceholder":793},[690,5059,5060,5062,5064,5067,5069,5071],{"class":692,"line":797},[690,5061,800],{"class":763},[690,5063,804],{"class":803},[690,5065,5066],{"class":771}," proxy ",[690,5068,918],{"class":767},[690,5070,5043],{"class":834},[690,5072,948],{"class":771},[690,5074,5075],{"class":692,"line":843},[690,5076,794],{"emptyLinePlaceholder":793},[690,5078,5079,5081,5083,5086,5088],{"class":692,"line":864},[690,5080,800],{"class":763},[690,5082,804],{"class":803},[690,5084,5085],{"class":771}," config ",[690,5087,918],{"class":767},[690,5089,934],{"class":767},[690,5091,5092,5095,5097,5099,5101,5104,5106,5108],{"class":692,"line":983},[690,5093,5094],{"class":846},"  matcher",[690,5096,850],{"class":767},[690,5098,1868],{"class":771},[690,5100,858],{"class":767},[690,5102,5103],{"class":699},"\u002Fapi\u002F:path*",[690,5105,858],{"class":767},[690,5107,1888],{"class":771},[690,5109,861],{"class":767},[690,5111,5112],{"class":692,"line":1017},[690,5113,4062],{"class":767},[1042,5115,5116,5117,5120,5121,5123,5124,5126],{"color":1044,"icon":13},"Older versions of Next.js use ",[608,5118,5119],{},"middleware.ts"," instead of ",[608,5122,5032],{},". The evlog middleware works with both, so just import from ",[608,5125,784],{}," regardless.",[668,5128,5130],{"id":5129},"server-actions","Server Actions",[604,5132,5133,5135],{},[608,5134,614],{}," also works with Server Actions. Wrap your action to get full request-scoped logging:",[680,5137,5140],{"className":753,"code":5138,"filename":5139,"language":756,"meta":686,"style":686},"'use server'\nimport { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const checkout = withEvlog(async (formData: FormData) => {\n  const log = useLogger()\n  log.set({ action: 'checkout', cartId: formData.get('cartId') })\n  \u002F\u002F ...\n})\n","app\u002Factions\u002Fcheckout.ts",[608,5141,5142,5151,5173,5177,5208,5220,5272,5277],{"__ignoreMap":686},[690,5143,5144,5146,5149],{"class":692,"line":693},[690,5145,858],{"class":767},[690,5147,5148],{"class":699},"use server",[690,5150,787],{"class":767},[690,5152,5153,5155,5157,5159,5161,5163,5165,5167,5169,5171],{"class":692,"line":790},[690,5154,764],{"class":763},[690,5156,768],{"class":767},[690,5158,809],{"class":771},[690,5160,812],{"class":767},[690,5162,815],{"class":771},[690,5164,775],{"class":767},[690,5166,778],{"class":763},[690,5168,781],{"class":767},[690,5170,900],{"class":699},[690,5172,787],{"class":767},[690,5174,5175],{"class":692,"line":797},[690,5176,794],{"emptyLinePlaceholder":793},[690,5178,5179,5181,5183,5186,5188,5190,5192,5194,5196,5198,5200,5202,5204,5206],{"class":692,"line":843},[690,5180,800],{"class":763},[690,5182,804],{"class":803},[690,5184,5185],{"class":771}," checkout ",[690,5187,918],{"class":767},[690,5189,809],{"class":834},[690,5191,837],{"class":771},[690,5193,925],{"class":803},[690,5195,2508],{"class":767},[690,5197,4288],{"class":2511},[690,5199,850],{"class":767},[690,5201,4293],{"class":696},[690,5203,2515],{"class":767},[690,5205,931],{"class":803},[690,5207,934],{"class":767},[690,5209,5210,5212,5214,5216,5218],{"class":692,"line":864},[690,5211,939],{"class":803},[690,5213,820],{"class":771},[690,5215,831],{"class":767},[690,5217,815],{"class":834},[690,5219,948],{"class":846},[690,5221,5222,5224,5226,5228,5230,5232,5234,5236,5238,5241,5243,5245,5248,5250,5253,5255,5257,5259,5261,5264,5266,5268,5270],{"class":692,"line":983},[690,5223,953],{"class":771},[690,5225,956],{"class":767},[690,5227,959],{"class":834},[690,5229,837],{"class":846},[690,5231,964],{"class":767},[690,5233,967],{"class":846},[690,5235,850],{"class":767},[690,5237,781],{"class":767},[690,5239,5240],{"class":699},"checkout",[690,5242,858],{"class":767},[690,5244,812],{"class":767},[690,5246,5247],{"class":846}," cartId",[690,5249,850],{"class":767},[690,5251,5252],{"class":771}," formData",[690,5254,956],{"class":767},[690,5256,4381],{"class":834},[690,5258,837],{"class":846},[690,5260,858],{"class":767},[690,5262,5263],{"class":699},"cartId",[690,5265,858],{"class":767},[690,5267,2584],{"class":846},[690,5269,828],{"class":767},[690,5271,869],{"class":846},[690,5273,5274],{"class":692,"line":1017},[690,5275,5276],{"class":1552},"  \u002F\u002F ...\n",[690,5278,5279,5281],{"class":692,"line":1507},[690,5280,828],{"class":767},[690,5282,869],{"class":771},[668,5284,5286],{"id":5285},"client-provider","Client Provider",[604,5288,5289,5290,5293],{},"Wrap your root layout with ",[608,5291,5292],{},"EvlogProvider"," to enable client-side logging and its drain:",[680,5295,5298],{"className":4236,"code":5296,"filename":5297,"language":4239,"meta":686,"style":686},"import { EvlogProvider } from 'evlog\u002Fnext\u002Fclient'\n\nexport default function Layout({ children }: { children: React.ReactNode }) {\n  return (\n    \u003Chtml lang=\"en\">\n      \u003Cbody>\n        \u003CEvlogProvider service=\"my-app\" transport={{ enabled: true }}>\n          {children}\n        \u003C\u002FEvlogProvider>\n      \u003C\u002Fbody>\n    \u003C\u002Fhtml>\n  )\n}\n","app\u002Flayout.tsx",[608,5299,5300,5320,5324,5364,5371,5394,5403,5436,5446,5455,5464,5473,5478],{"__ignoreMap":686},[690,5301,5302,5304,5306,5309,5311,5313,5315,5318],{"class":692,"line":693},[690,5303,764],{"class":763},[690,5305,768],{"class":767},[690,5307,5308],{"class":771}," EvlogProvider",[690,5310,775],{"class":767},[690,5312,778],{"class":763},[690,5314,781],{"class":767},[690,5316,5317],{"class":699},"evlog\u002Fnext\u002Fclient",[690,5319,787],{"class":767},[690,5321,5322],{"class":692,"line":790},[690,5323,794],{"emptyLinePlaceholder":793},[690,5325,5326,5328,5331,5333,5336,5339,5342,5345,5347,5349,5351,5354,5356,5359,5362],{"class":692,"line":797},[690,5327,800],{"class":763},[690,5329,5330],{"class":763}," default",[690,5332,4280],{"class":803},[690,5334,5335],{"class":834}," Layout",[690,5337,5338],{"class":767},"({",[690,5340,5341],{"class":2511}," children",[690,5343,5344],{"class":767}," }:",[690,5346,768],{"class":767},[690,5348,5341],{"class":846},[690,5350,850],{"class":767},[690,5352,5353],{"class":696}," React",[690,5355,956],{"class":767},[690,5357,5358],{"class":696},"ReactNode",[690,5360,5361],{"class":767}," })",[690,5363,934],{"class":767},[690,5365,5366,5368],{"class":692,"line":843},[690,5367,986],{"class":763},[690,5369,5370],{"class":846}," (\n",[690,5372,5373,5376,5379,5382,5384,5386,5389,5391],{"class":692,"line":864},[690,5374,5375],{"class":767},"    \u003C",[690,5377,5378],{"class":846},"html",[690,5380,5381],{"class":803}," lang",[690,5383,918],{"class":767},[690,5385,3958],{"class":767},[690,5387,5388],{"class":699},"en",[690,5390,3958],{"class":767},[690,5392,5393],{"class":767},">\n",[690,5395,5396,5399,5401],{"class":692,"line":983},[690,5397,5398],{"class":767},"      \u003C",[690,5400,3043],{"class":846},[690,5402,5393],{"class":767},[690,5404,5405,5408,5410,5412,5414,5416,5418,5420,5423,5426,5429,5431,5433],{"class":692,"line":1017},[690,5406,5407],{"class":767},"        \u003C",[690,5409,5292],{"class":696},[690,5411,2416],{"class":803},[690,5413,918],{"class":767},[690,5415,3958],{"class":767},[690,5417,855],{"class":699},[690,5419,3958],{"class":767},[690,5421,5422],{"class":803}," transport",[690,5424,5425],{"class":767},"={{",[690,5427,5428],{"class":846}," enabled",[690,5430,850],{"class":767},[690,5432,1210],{"class":1209},[690,5434,5435],{"class":767}," }}>\n",[690,5437,5438,5441,5444],{"class":692,"line":1507},[690,5439,5440],{"class":767},"          {",[690,5442,5443],{"class":771},"children",[690,5445,4062],{"class":767},[690,5447,5448,5451,5453],{"class":692,"line":1515},[690,5449,5450],{"class":767},"        \u003C\u002F",[690,5452,5292],{"class":696},[690,5454,5393],{"class":767},[690,5456,5457,5460,5462],{"class":692,"line":1520},[690,5458,5459],{"class":767},"      \u003C\u002F",[690,5461,3043],{"class":846},[690,5463,5393],{"class":767},[690,5465,5466,5469,5471],{"class":692,"line":1527},[690,5467,5468],{"class":767},"    \u003C\u002F",[690,5470,5378],{"class":846},[690,5472,5393],{"class":767},[690,5474,5475],{"class":692,"line":1539},[690,5476,5477],{"class":846},"  )\n",[690,5479,5480],{"class":692,"line":1549},[690,5481,4062],{"class":767},[668,5483,327],{"id":5484},"client-logging",[604,5486,3441,5487,5490],{},[608,5488,5489],{},"log"," in any client component. Identity is preserved across all logs and transported to the server:",[680,5492,5495],{"className":4236,"code":5493,"filename":5494,"language":4239,"meta":686,"style":686},"'use client'\nimport { log, setIdentity, clearIdentity } from 'evlog\u002Fnext\u002Fclient'\n\nexport function Dashboard({ user }: { user: { id: string } }) {\n  \u002F\u002F Set identity once - all subsequent logs include it\n  useEffect(() => {\n    setIdentity({ userId: user.id })\n    return () => clearIdentity()\n  }, [user.id])\n\n  return (\n    \u003Cbutton onClick={() => log.info({ action: 'export_clicked', format: 'csv' })}>\n      Export\n    \u003C\u002Fbutton>\n  )\n}\n","app\u002Fcomponents\u002FDashboard.tsx",[608,5496,5497,5505,5533,5537,5573,5578,5591,5616,5629,5645,5649,5655,5712,5717,5725,5729],{"__ignoreMap":686},[690,5498,5499,5501,5503],{"class":692,"line":693},[690,5500,858],{"class":767},[690,5502,4248],{"class":699},[690,5504,787],{"class":767},[690,5506,5507,5509,5511,5513,5515,5518,5520,5523,5525,5527,5529,5531],{"class":692,"line":790},[690,5508,764],{"class":763},[690,5510,768],{"class":767},[690,5512,820],{"class":771},[690,5514,812],{"class":767},[690,5516,5517],{"class":771}," setIdentity",[690,5519,812],{"class":767},[690,5521,5522],{"class":771}," clearIdentity",[690,5524,775],{"class":767},[690,5526,778],{"class":763},[690,5528,781],{"class":767},[690,5530,5317],{"class":699},[690,5532,787],{"class":767},[690,5534,5535],{"class":692,"line":797},[690,5536,794],{"emptyLinePlaceholder":793},[690,5538,5539,5541,5543,5546,5548,5550,5552,5554,5556,5558,5560,5562,5564,5567,5569,5571],{"class":692,"line":843},[690,5540,800],{"class":763},[690,5542,4280],{"class":803},[690,5544,5545],{"class":834}," Dashboard",[690,5547,5338],{"class":767},[690,5549,2528],{"class":2511},[690,5551,5344],{"class":767},[690,5553,768],{"class":767},[690,5555,2528],{"class":846},[690,5557,850],{"class":767},[690,5559,768],{"class":767},[690,5561,2901],{"class":846},[690,5563,850],{"class":767},[690,5565,5566],{"class":696}," string",[690,5568,775],{"class":767},[690,5570,5361],{"class":767},[690,5572,934],{"class":767},[690,5574,5575],{"class":692,"line":864},[690,5576,5577],{"class":1552},"  \u002F\u002F Set identity once - all subsequent logs include it\n",[690,5579,5580,5583,5585,5587,5589],{"class":692,"line":983},[690,5581,5582],{"class":834},"  useEffect",[690,5584,837],{"class":846},[690,5586,1322],{"class":767},[690,5588,931],{"class":803},[690,5590,934],{"class":767},[690,5592,5593,5596,5598,5600,5603,5605,5607,5609,5612,5614],{"class":692,"line":1017},[690,5594,5595],{"class":834},"    setIdentity",[690,5597,837],{"class":846},[690,5599,964],{"class":767},[690,5601,5602],{"class":846}," userId",[690,5604,850],{"class":767},[690,5606,2528],{"class":771},[690,5608,956],{"class":767},[690,5610,5611],{"class":771},"id",[690,5613,775],{"class":767},[690,5615,869],{"class":846},[690,5617,5618,5621,5623,5625,5627],{"class":692,"line":1507},[690,5619,5620],{"class":763},"    return",[690,5622,928],{"class":767},[690,5624,931],{"class":803},[690,5626,5522],{"class":834},[690,5628,948],{"class":846},[690,5630,5631,5634,5636,5638,5640,5642],{"class":692,"line":1515},[690,5632,5633],{"class":767},"  },",[690,5635,1868],{"class":846},[690,5637,2543],{"class":771},[690,5639,956],{"class":767},[690,5641,5611],{"class":771},[690,5643,5644],{"class":846},"])\n",[690,5646,5647],{"class":692,"line":1520},[690,5648,794],{"emptyLinePlaceholder":793},[690,5650,5651,5653],{"class":692,"line":1527},[690,5652,986],{"class":763},[690,5654,5370],{"class":846},[690,5656,5657,5659,5662,5665,5668,5670,5672,5674,5676,5678,5680,5682,5684,5686,5689,5691,5693,5696,5698,5700,5703,5705,5707,5709],{"class":692,"line":1539},[690,5658,5375],{"class":767},[690,5660,5661],{"class":846},"button",[690,5663,5664],{"class":803}," onClick",[690,5666,5667],{"class":767},"={()",[690,5669,931],{"class":803},[690,5671,820],{"class":771},[690,5673,956],{"class":767},[690,5675,1044],{"class":834},[690,5677,837],{"class":771},[690,5679,964],{"class":767},[690,5681,967],{"class":846},[690,5683,850],{"class":767},[690,5685,781],{"class":767},[690,5687,5688],{"class":699},"export_clicked",[690,5690,858],{"class":767},[690,5692,812],{"class":767},[690,5694,5695],{"class":846}," format",[690,5697,850],{"class":767},[690,5699,781],{"class":767},[690,5701,5702],{"class":699},"csv",[690,5704,858],{"class":767},[690,5706,775],{"class":767},[690,5708,2515],{"class":771},[690,5710,5711],{"class":767},"}>\n",[690,5713,5714],{"class":692,"line":1549},[690,5715,5716],{"class":771},"      Export\n",[690,5718,5719,5721,5723],{"class":692,"line":1556},[690,5720,5468],{"class":767},[690,5722,5661],{"class":846},[690,5724,5393],{"class":767},[690,5726,5727],{"class":692,"line":1562},[690,5728,5477],{"class":846},[690,5730,5731],{"class":692,"line":1574},[690,5732,4062],{"class":767},[668,5734,5736],{"id":5735},"http-drain","HTTP drain",[604,5738,5739,5740,5742],{},"For advanced use cases, send structured ",[608,5741,2084],{}," events directly from the browser to a custom endpoint:",[680,5744,5747],{"className":753,"code":5745,"filename":5746,"language":756,"meta":686,"style":686},"import { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: '\u002Fapi\u002Fevlog\u002Fhttp-ingest' },\n  pipeline: { batch: { size: 10, intervalMs: 5000 } },\n})\n\ndrain(drainEvent)\nawait drain.flush()\n","lib\u002Fhttp-drain.ts",[608,5748,5749,5769,5773,5787,5809,5842,5848,5852,5859],{"__ignoreMap":686},[690,5750,5751,5753,5755,5758,5760,5762,5764,5767],{"class":692,"line":693},[690,5752,764],{"class":763},[690,5754,768],{"class":767},[690,5756,5757],{"class":771}," createHttpLogDrain",[690,5759,775],{"class":767},[690,5761,778],{"class":763},[690,5763,781],{"class":767},[690,5765,5766],{"class":699},"evlog\u002Fhttp",[690,5768,787],{"class":767},[690,5770,5771],{"class":692,"line":790},[690,5772,794],{"emptyLinePlaceholder":793},[690,5774,5775,5777,5779,5781,5783,5785],{"class":692,"line":797},[690,5776,2039],{"class":803},[690,5778,2139],{"class":771},[690,5780,918],{"class":767},[690,5782,5757],{"class":834},[690,5784,837],{"class":771},[690,5786,840],{"class":767},[690,5788,5789,5791,5793,5795,5798,5800,5802,5805,5807],{"class":692,"line":843},[690,5790,1315],{"class":846},[690,5792,850],{"class":767},[690,5794,768],{"class":767},[690,5796,5797],{"class":846}," endpoint",[690,5799,850],{"class":767},[690,5801,781],{"class":767},[690,5803,5804],{"class":699},"\u002Fapi\u002Fevlog\u002Fhttp-ingest",[690,5806,858],{"class":767},[690,5808,2293],{"class":767},[690,5810,5811,5814,5816,5818,5820,5822,5824,5826,5828,5830,5832,5834,5836,5838,5840],{"class":692,"line":864},[690,5812,5813],{"class":846},"  pipeline",[690,5815,850],{"class":767},[690,5817,768],{"class":767},[690,5819,2094],{"class":846},[690,5821,850],{"class":767},[690,5823,768],{"class":767},[690,5825,2101],{"class":846},[690,5827,850],{"class":767},[690,5829,2290],{"class":2106},[690,5831,812],{"class":767},[690,5833,2112],{"class":846},[690,5835,850],{"class":767},[690,5837,2117],{"class":2106},[690,5839,775],{"class":767},[690,5841,2293],{"class":767},[690,5843,5844,5846],{"class":692,"line":983},[690,5845,828],{"class":767},[690,5847,869],{"class":771},[690,5849,5850],{"class":692,"line":1017},[690,5851,794],{"emptyLinePlaceholder":793},[690,5853,5854,5856],{"class":692,"line":1507},[690,5855,1086],{"class":834},[690,5857,5858],{"class":771},"(drainEvent)\n",[690,5860,5861,5864,5867,5869,5872],{"class":692,"line":1515},[690,5862,5863],{"class":763},"await",[690,5865,5866],{"class":771}," drain",[690,5868,956],{"class":767},[690,5870,5871],{"class":834},"flush",[690,5873,948],{"class":771},[604,5875,5876],{},"The server endpoint receives batched events:",[680,5878,5881],{"className":753,"code":5879,"filename":5880,"language":756,"meta":686,"style":686},"export async function POST(request: Request) {\n  const events = await request.json()\n  \u002F\u002F Forward to your drain pipeline, Axiom, etc.\n  return new Response(null, { status: 204 })\n}\n","app\u002Fapi\u002Fevlog\u002Fhttp-ingest\u002Froute.ts",[608,5882,5883,5906,5925,5930,5957],{"__ignoreMap":686},[690,5884,5885,5887,5889,5891,5894,5896,5898,5900,5902,5904],{"class":692,"line":693},[690,5886,800],{"class":763},[690,5888,3349],{"class":803},[690,5890,4280],{"class":803},[690,5892,5893],{"class":834}," POST",[690,5895,837],{"class":767},[690,5897,2825],{"class":2511},[690,5899,850],{"class":767},[690,5901,2830],{"class":696},[690,5903,2515],{"class":767},[690,5905,934],{"class":767},[690,5907,5908,5910,5913,5915,5917,5919,5921,5923],{"class":692,"line":790},[690,5909,939],{"class":803},[690,5911,5912],{"class":771}," events",[690,5914,831],{"class":767},[690,5916,1431],{"class":763},[690,5918,2862],{"class":771},[690,5920,956],{"class":767},[690,5922,994],{"class":834},[690,5924,948],{"class":846},[690,5926,5927],{"class":692,"line":797},[690,5928,5929],{"class":1552},"  \u002F\u002F Forward to your drain pipeline, Axiom, etc.\n",[690,5931,5932,5934,5937,5939,5941,5944,5946,5948,5950,5953,5955],{"class":692,"line":843},[690,5933,986],{"class":763},[690,5935,5936],{"class":767}," new",[690,5938,989],{"class":834},[690,5940,837],{"class":846},[690,5942,5943],{"class":767},"null,",[690,5945,768],{"class":767},[690,5947,2313],{"class":846},[690,5949,850],{"class":767},[690,5951,5952],{"class":2106}," 204",[690,5954,775],{"class":767},[690,5956,869],{"class":846},[690,5958,5959],{"class":692,"line":864},[690,5960,4062],{"class":767},[668,5962,5964],{"id":5963},"run-locally","Run Locally",[680,5966,5969],{"className":682,"code":5967,"filename":5968,"language":685,"meta":686,"style":686},"git clone https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog.git\ncd evlog\u002Fexamples\u002Fnextjs\npnpm install\npnpm run dev\n","Terminal",[608,5970,5971,5982,5990,5997],{"__ignoreMap":686},[690,5972,5973,5976,5979],{"class":692,"line":693},[690,5974,5975],{"class":696},"git",[690,5977,5978],{"class":699}," clone",[690,5980,5981],{"class":699}," https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog.git\n",[690,5983,5984,5987],{"class":692,"line":790},[690,5985,5986],{"class":834},"cd",[690,5988,5989],{"class":699}," evlog\u002Fexamples\u002Fnextjs\n",[690,5991,5992,5994],{"class":692,"line":797},[690,5993,684],{"class":696},[690,5995,5996],{"class":699}," install\n",[690,5998,5999,6001,6004],{"class":692,"line":843},[690,6000,684],{"class":696},[690,6002,6003],{"class":699}," run",[690,6005,6006],{"class":699}," dev\n",[604,6008,6009,6010,6014],{},"Open ",[657,6011,6012],{"href":6012,"rel":6013},"http:\u002F\u002Flocalhost:3000",[661]," to explore the example.",[6016,6017,6018],"card-group",{},[6019,6020,6024],"card",{"icon":6021,"title":6022,"to":6023},"i-simple-icons-github","Source Code","https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fnextjs","Browse the complete Next.js example source on GitHub.",[668,6026,6028],{"id":6027},"next-steps","Next Steps",[604,6030,6031,6032,6034],{},"Deepen your ",[1053,6033,245],{}," integration:",[629,6036,6037,6042,6047,6052],{},[632,6038,6039,6041],{},[657,6040,51],{"href":52},": Design comprehensive events with context layering",[632,6043,6044,6046],{},[657,6045,148],{"href":153},": Send logs to Axiom, Sentry, PostHog, and more",[632,6048,6049,6051],{},[657,6050,66],{"href":67},": Control log volume with head and tail sampling",[632,6053,6054,6056,6057,1626,6059,3452,6061,6063],{},[657,6055,56],{"href":57},": Throw errors with ",[608,6058,3448],{},[608,6060,3451],{},[608,6062,3455],{}," fields",[6065,6066,6067],"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .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":686,"searchDepth":790,"depth":790,"links":6069},[6070,6075,6081,6082,6083,6085,6088,6089,6090,6091,6092,6093,6094,6095,6096],{"id":670,"depth":790,"text":25,"children":6071},[6072,6073,6074],{"id":674,"depth":797,"text":675},{"id":749,"depth":797,"text":750},{"id":872,"depth":797,"text":873},{"id":1024,"depth":790,"text":1025,"children":6076},[6077,6078,6079,6080],{"id":1089,"depth":797,"text":1090},{"id":1333,"depth":797,"text":1334},{"id":1350,"depth":797,"text":1351},{"id":1674,"depth":797,"text":543},{"id":1904,"depth":790,"text":1905},{"id":2768,"depth":790,"text":51},{"id":3235,"depth":790,"text":6084},"Background work (log.fork)",{"id":3437,"depth":790,"text":3438,"children":6086},[6087],{"id":4219,"depth":797,"text":4220},{"id":4550,"depth":790,"text":543},{"id":4778,"depth":790,"text":4779},{"id":5015,"depth":790,"text":374},{"id":5129,"depth":790,"text":5130},{"id":5285,"depth":790,"text":5286},{"id":5484,"depth":790,"text":327},{"id":5735,"depth":790,"text":5736},{"id":5963,"depth":790,"text":5964},{"id":6027,"depth":790,"text":6028},"Wide events, structured errors, drain pipeline, tail sampling, route-based services, error handling, and client-side logging in Next.js applications.","md",[6100],{"label":6022,"icon":6021,"to":6023,"color":2743,"variant":6101},"subtle",{},{"title":245,"icon":248},{"title":245,"description":6097},"gFYQtJjJKLEJZbW3V7p7IMtsNNBI0cJRmGg6aBkq4tI",[6107,6109],{"title":240,"path":241,"stem":242,"description":6108,"icon":243,"children":-1},"Add the Nuxt module and every server route emits one wide event. `useLogger(event)` and `parseError` are auto-imported, `createError` comes from `evlog`.",{"title":250,"path":251,"stem":252,"description":6110,"icon":253,"children":-1},"Wire the handle and handleError hooks once, and every SvelteKit request carries a logger on `event.locals.log` until the response ends.",1789076910862]