[{"data":1,"prerenderedAt":3791},["ShallowReactive",2],{"navigation_docs":3,"-reference-vs-other-loggers":529,"-reference-vs-other-loggers-surround":3786},[4,29,76,122,304,436,495],{"title":5,"path":6,"stem":7,"children":8,"page":28},"Start","\u002Fstart","1.start",[9,13,18,23],{"title":10,"path":11,"stem":12},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction",{"title":14,"path":15,"stem":16,"icon":17},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":19,"path":20,"stem":21,"icon":22},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":24,"path":25,"stem":26,"icon":27},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":30,"path":31,"stem":32,"children":33,"page":28},"Learn","\u002Flearn","2.learn",[34,38,43,48,53,58,62,67,72],{"title":35,"path":36,"stem":37},"Learn evlog","\u002Flearn\u002Foverview","2.learn\u002F0.overview",{"title":39,"path":40,"stem":41,"icon":42},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":44,"path":45,"stem":46,"icon":47},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":49,"path":50,"stem":51,"icon":52},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":54,"path":55,"stem":56,"icon":57},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":59,"path":60,"stem":61},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling",{"title":63,"path":64,"stem":65,"icon":66},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":68,"path":69,"stem":70,"icon":71},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":73,"path":74,"stem":75},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs",{"title":77,"path":78,"stem":79,"children":80,"page":28},"CLI","\u002Fcli","3.cli",[81,85,90,95,99,103,108,113,118],{"title":82,"path":83,"stem":84},"evlog CLI","\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":86,"path":87,"stem":88,"icon":89},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":91,"path":92,"stem":93,"icon":94},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":96,"path":97,"stem":98},"Map rules","\u002Fcli\u002Frules","3.cli\u002F3.rules",{"title":100,"path":101,"stem":102},"Map scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121},"evlog agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents",{"title":123,"path":124,"stem":125,"children":126,"page":28},"Integrate","\u002Fintegrate","4.integrate",[127,132,216],{"title":128,"path":129,"stem":130,"icon":131},"Overview","\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":28},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,141,171,196],{"title":128,"path":138,"stem":139,"icon":140},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview","i-lucide-list",{"title":142,"path":143,"stem":144,"children":145,"page":28},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[146,151,156,161,166],{"title":147,"path":148,"stem":149,"icon":150},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":152,"path":153,"stem":154,"icon":155},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":157,"path":158,"stem":159,"icon":160},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":162,"path":163,"stem":164,"icon":165},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":167,"path":168,"stem":169,"icon":170},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":172,"path":173,"stem":174,"children":175,"page":28},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[176,181,186,191],{"title":177,"path":178,"stem":179,"icon":180},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":182,"path":183,"stem":184,"icon":185},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":187,"path":188,"stem":189,"icon":190},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":192,"path":193,"stem":194,"icon":195},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":197,"path":198,"stem":199,"children":200,"page":28},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[201,206,211],{"title":202,"path":203,"stem":204,"icon":205},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":207,"path":208,"stem":209,"icon":210},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":212,"path":213,"stem":214,"icon":215},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":217,"path":218,"stem":219,"children":220,"page":28},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[221,225,230,235,240,245,250,255,260,265,270,275,280,285,289,294,299],{"title":128,"path":222,"stem":223,"icon":224},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":226,"path":227,"stem":228,"icon":229},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":231,"path":232,"stem":233,"icon":234},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":236,"path":237,"stem":238,"icon":239},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":241,"path":242,"stem":243,"icon":244},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":246,"path":247,"stem":248,"icon":249},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":251,"path":252,"stem":253,"icon":254},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":256,"path":257,"stem":258,"icon":259},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":261,"path":262,"stem":263,"icon":264},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":266,"path":267,"stem":268,"icon":269},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":271,"path":272,"stem":273,"icon":274},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":276,"path":277,"stem":278,"icon":279},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":281,"path":282,"stem":283,"icon":284},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":286,"path":287,"stem":288,"icon":71},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":290,"path":291,"stem":292,"icon":293},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":295,"path":296,"stem":297,"icon":298},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":300,"path":301,"stem":302,"icon":303},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":305,"path":306,"stem":307,"children":308,"page":28},"Use Cases","\u002Fuse-cases","5.use-cases",[309,312,317,346,374,407,427,432],{"title":305,"path":310,"stem":311},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":313,"path":314,"stem":315,"icon":316},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":318,"icon":319,"path":320,"stem":321,"children":322,"page":28},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[323,326,331,336,341],{"title":128,"path":324,"stem":325,"icon":140},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":327,"path":328,"stem":329,"icon":330},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":332,"path":333,"stem":334,"icon":335},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":337,"path":338,"stem":339,"icon":340},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":342,"path":343,"stem":344,"icon":345},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":28},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[352,355,360,365,369],{"title":128,"path":353,"stem":354,"icon":140},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":361,"path":362,"stem":363,"icon":364},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":366,"path":367,"stem":368,"icon":316},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":370,"path":371,"stem":372,"icon":373},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":28},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[380,383,388,393,398,402],{"title":128,"path":381,"stem":382,"icon":140},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":384,"path":385,"stem":386,"icon":387},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":389,"path":390,"stem":391,"icon":392},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":394,"path":395,"stem":396,"icon":397},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":399,"path":400,"stem":401,"icon":376},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":403,"path":404,"stem":405,"icon":406},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes","i-lucide-book-open",{"title":342,"icon":373,"path":408,"stem":409,"children":410,"page":28},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[411,414,419,423],{"title":128,"path":412,"stem":413,"icon":140},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":415,"path":416,"stem":417,"icon":418},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":420,"path":421,"stem":422},"Telemetry Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest",{"title":424,"path":425,"stem":426,"icon":406},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":428,"path":429,"stem":430,"icon":431},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":433,"path":434,"stem":435},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve",{"title":437,"path":438,"stem":439,"children":440,"page":28},"Extend","\u002Fextend","6.extend",[441,445,450,455,459,464,468,472,476,481,486,491],{"title":128,"path":442,"stem":443,"icon":444},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":446,"path":447,"stem":448,"icon":449},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":451,"path":452,"stem":453,"icon":454},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":456,"path":457,"stem":458,"icon":449},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":460,"path":461,"stem":462,"icon":463},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":403,"path":465,"stem":466,"icon":467},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":469,"path":470,"stem":471},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":473,"path":474,"stem":475,"icon":431},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":477,"path":478,"stem":479,"icon":480},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling","i-lucide-filter",{"title":482,"path":483,"stem":484,"icon":485},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":487,"path":488,"stem":489,"icon":490},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":492,"path":493,"stem":494},"Drain Pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline",{"title":424,"path":496,"stem":497,"children":498,"page":28},"\u002Freference","7.reference",[499,504,507,512,516,521,525],{"title":500,"path":501,"stem":502,"icon":503},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":370,"path":505,"stem":506,"icon":373},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":508,"path":509,"stem":510,"icon":511},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":513,"path":514,"stem":515,"icon":376},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":517,"path":518,"stem":519,"icon":520},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":522,"path":523,"stem":524,"icon":431},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":526,"path":527,"stem":528},"Log cost","\u002Freference\u002Fcost","7.reference\u002F7.cost",{"id":530,"title":531,"body":532,"description":3775,"extension":3776,"links":3777,"meta":3782,"navigation":3783,"path":518,"seo":3784,"stem":519,"__hash__":3785},"docs\u002F7.reference\u002F5.vs-other-loggers.md","evlog vs pino, winston, consola",{"type":533,"value":534,"toc":3754},"minimark",[535,552,557,619,623,630,640,645,923,927,1210,1214,1403,1423,1439,1443,1446,1453,1463,1595,1606,1616,1637,1658,1662,1693,1699,1710,1714,1730,1734,1745,3228,3231,3639,3642,3689,3693,3696,3719,3723,3750],[536,537,538,539,543,544,547,548,551],"p",{},"evlog is a fully-featured general-purpose logger first, with wide events as a native extension of the same API. This page compares it head-to-head with the three loggers TypeScript developers usually consider (",[540,541,542],"strong",{},"pino",", ",[540,545,546],{},"winston",", and ",[540,549,550],{},"consola","), so you know exactly what you gain, what stays the same, and what (if anything) is missing today.",[553,554,556],"h2",{"id":555},"tldr","TL;DR",[558,559,560,578,589,605],"ul",{},[561,562,563,566,567,570,571,570,574,577],"li",{},[540,564,565],{},"Pick evlog over pino"," if you want the same throughput class with structured errors, redaction, and wide events built in, and you don't want to assemble ",[568,569,542],"code",{}," + ",[568,572,573],{},"pino-pretty",[568,575,576],{},"pino-http"," + custom transports yourself.",[561,579,580,583,584,588],{},[540,581,582],{},"Pick evlog over winston"," in any new TypeScript project. winston is older, slower (see ",[585,586,587],"a",{"href":505},"benchmarks","), and ships none of the modern features (typed events, redaction, structured errors, AI SDK integration).",[561,590,591,594,595,543,598,543,601,604],{},[540,592,593],{},"Pick evlog over consola"," when logs stop being something you read and start being something you query. consola renders for a person: three reporters ship (",[568,596,597],{},"fancy",[568,599,600],{},"basic",[568,602,603],{},"browser","), and structured output is a custom reporter you write. There is no pipeline, no batching, no sampling, and no request lifecycle.",[561,606,607,610,611,614,615,618],{},[540,608,609],{},"Stay on pino"," only if you emit hundreds of thousands of fire-and-forget lines per second with no context accumulation, and you have a custom transport you don't want to port. That is the one shape where ",[585,612,613],{"href":505},"the benchmarks"," put pino ahead. evlog still wins the wide event lifecycle by 7.7x, but pino can edge it on raw ",[568,616,617],{},"info('hello world')"," throughput.",[553,620,622],{"id":621},"compare-the-feature-sets","Compare the feature sets",[536,624,625,626,629],{},"Three tables instead of one wall. The ",[540,627,628],{},"Winner"," column on the right tells you who wins each row at a glance; cells use semantic words (\"Built-in\", \"Manual\", \"via X\") instead of generic \"Yes\" so you can read the level of effort without reading the spec.",[631,632,635,636,639],"callout",{"color":633,"icon":634},"info","i-lucide-info","Hover (or tap on mobile) the ",[540,637,638],{},"info icon"," next to any feature name for a one-line explanation of what the row actually compares.",[641,642,644],"h3",{"id":643},"what-you-call-in-a-handler","What you call in a handler",[646,647,648,671],"table",{},[649,650,651],"thead",{},[652,653,654,658,662,664,666,668],"tr",{},[655,656,657],"th",{},"Feature",[655,659,661],{"align":660},"center","evlog",[655,663,542],{"align":660},[655,665,550],{"align":660},[655,667,546],{"align":660},[655,669,628],{"align":670},"left",[672,673,674,696,718,740,758,782,802,822,842,862,883,903],"tbody",{},[652,675,676,684,687,689,691,693],{},[677,678,679],"td",{},[680,681,683],"feature-label",{"tip":682},"The four classic severities (debug \u002F info \u002F warn \u002F error) every logger ships, used for severity-based filtering.","Standard levels",[677,685,686],{"align":660},"Yes",[677,688,686],{"align":660},[677,690,686],{"align":660},[677,692,686],{"align":660},[677,694,695],{"align":670},"All",[652,697,698,704,707,709,711,713],{},[677,699,700],{},[680,701,703],{"tip":702},"Define extra severities like trace, notice, or fatal beyond the standard four — handy when migrating from a pipeline that depends on them.","Custom levels",[677,705,706],{"align":660},"No",[677,708,686],{"align":660},[677,710,686],{"align":660},[677,712,686],{"align":660},[677,714,715],{"align":670},[540,716,717],{},"pino, consola, winston",[652,719,720,726,728,730,733,735],{},[677,721,722],{},[680,723,725],{"tip":724},"Pass typed key\u002Fvalue objects on every log call instead of stuffing data into the message string. Required for queryable logs.","Structured fields per call",[677,727,686],{"align":660},[677,729,686],{"align":660},[677,731,732],{"align":660},"Partial",[677,734,686],{"align":660},[677,736,737],{"align":670},[540,738,739],{},"evlog, pino, winston",[652,741,742,748,750,752,754,756],{},[677,743,744],{},[680,745,747],{"tip":746},"Create a logger that inherits parent bindings (e.g. requestId, component) and auto-attaches them to every subsequent call.","Child loggers \u002F persistent bindings",[677,749,686],{"align":660},[677,751,686],{"align":660},[677,753,686],{"align":660},[677,755,686],{"align":660},[677,757,695],{"align":670},[652,759,760,766,769,772,774,777],{},[677,761,762],{},[680,763,765],{"tip":764},"Human-readable colored output during development, machine-parseable JSON in production. Switched automatically based on NODE_ENV.","Pretty in dev \u002F JSON in prod (auto)",[677,767,768],{"align":660},"Built-in",[677,770,771],{"align":660},"via pino-pretty",[677,773,768],{"align":660},[677,775,776],{"align":660},"Manual",[677,778,779],{"align":670},[540,780,781],{},"evlog, consola",[652,783,784,790,792,794,796,798],{},[677,785,786],{},[680,787,789],{"tip":788},"A separate runtime for the browser that strips Node.js APIs (process, fs) and ships a small bundle for client-side logging.","Browser-safe build",[677,791,686],{"align":660},[677,793,706],{"align":660},[677,795,686],{"align":660},[677,797,706],{"align":660},[677,799,800],{"align":670},[540,801,781],{},[652,803,804,810,812,814,816,818],{},[677,805,806],{},[680,807,809],{"tip":808},"Spin off a child wide event from the parent — used for batched operations or per-item processing inside one request, without losing correlation.","Sub-operation logger (log.fork)",[677,811,686],{"align":660},[677,813,706],{"align":660},[677,815,706],{"align":660},[677,817,706],{"align":660},[677,819,820],{"align":670},[540,821,661],{},[652,823,824,830,832,834,836,838],{},[677,825,826],{},[680,827,829],{"tip":828},"Every event carries a source field (server or client) automatically so you can split client-side errors from server-side ones in your dashboard.","Source distinction (server \u002F client)",[677,831,686],{"align":660},[677,833,706],{"align":660},[677,835,706],{"align":660},[677,837,706],{"align":660},[677,839,840],{"align":670},[540,841,661],{},[652,843,844,850,852,854,856,858],{},[677,845,846],{},[680,847,849],{"tip":848},"Toggle log levels on the fly (e.g. logger.level = 'debug') without a restart — useful for --verbose flags or hot-reload.","Runtime level mutation",[677,851,732],{"align":660},[677,853,686],{"align":660},[677,855,686],{"align":660},[677,857,686],{"align":660},[677,859,860],{"align":670},[540,861,717],{},[652,863,864,870,872,874,876,878],{},[677,865,866],{},[680,867,869],{"tip":868},"Pluggable transformers that turn typed objects (errors, requests, responses) into JSON. evlog handles common cases via redaction + createError instead of plugins.","Plugin \u002F serializer system",[677,871,706],{"align":660},[677,873,686],{"align":660},[677,875,706],{"align":660},[677,877,686],{"align":660},[677,879,880],{"align":670},[540,881,882],{},"pino, winston",[652,884,885,891,893,895,897,899],{},[677,886,887],{},[680,888,890],{"tip":889},"Accumulate context throughout a request and emit one typed event at the end — the wide-event observability pattern from Honeycomb \u002F Charity Majors.","Wide events (one per operation)",[677,892,686],{"align":660},[677,894,706],{"align":660},[677,896,706],{"align":660},[677,898,706],{"align":660},[677,900,901],{"align":670},[540,902,661],{},[652,904,905,911,913,915,917,919],{},[677,906,907],{},[680,908,910],{"tip":909},"Errors carry why (root cause), fix (actionable next step), and link (docs URL) fields that travel from server to client.","Structured errors (why \u002F fix \u002F link)",[677,912,686],{"align":660},[677,914,706],{"align":660},[677,916,706],{"align":660},[677,918,706],{"align":660},[677,920,921],{"align":670},[540,922,661],{},[641,924,926],{"id":925},"what-runs-in-production","What runs in production",[646,928,929,945],{},[649,930,931],{},[652,932,933,935,937,939,941,943],{},[655,934,657],{},[655,936,661],{"align":660},[655,938,542],{"align":660},[655,940,550],{"align":660},[655,942,546],{"align":660},[655,944,628],{"align":670},[672,946,947,967,987,1009,1030,1050,1070,1090,1110,1130,1150,1170,1190],{},[652,948,949,955,957,959,961,963],{},[677,950,951],{},[680,952,954],{"tip":953},"Automatically masks fields like password, token, email, creditCard in production output. Configurable via a redact list.","Built-in PII redaction (auto in prod)",[677,956,768],{"align":660},[677,958,776],{"align":660},[677,960,706],{"align":660},[677,962,706],{"align":660},[677,964,965],{"align":670},[540,966,661],{},[652,968,969,975,977,979,981,983],{},[677,970,971],{},[680,972,974],{"tip":973},"Drop a percentage of low-importance events at emit time (head) or based on the final outcome like errors \u002F slow requests (tail).","Head + tail sampling",[677,976,768],{"align":660},[677,978,776],{"align":660},[677,980,706],{"align":660},[677,982,706],{"align":660},[677,984,985],{"align":670},[540,986,661],{},[652,988,989,995,998,1001,1003,1005],{},[677,990,991],{},[680,992,994],{"tip":993},"Whether log shipping runs off the hot path. evlog uses fire-and-forget drains (with waitUntil on edge); pino \u002F winston use a worker thread for hard isolation.","Async I\u002FO for shipping logs",[677,996,997],{"align":660},"via drains",[677,999,1000],{"align":660},"Worker thread",[677,1002,706],{"align":660},[677,1004,1000],{"align":660},[677,1006,1007],{"align":670},[540,1008,882],{},[652,1010,1011,1017,1019,1022,1024,1026],{},[677,1012,1013],{},[680,1014,1016],{"tip":1015},"Built-in batching, exponential retry on failure, and fan-out to multiple destinations — without writing transport plumbing yourself.","Drain pipeline (batch \u002F retry \u002F fan-out)",[677,1018,768],{"align":660},[677,1020,1021],{"align":660},"via transports",[677,1023,706],{"align":660},[677,1025,1021],{"align":660},[677,1027,1028],{"align":670},[540,1029,661],{},[652,1031,1032,1038,1040,1042,1044,1046],{},[677,1033,1034],{},[680,1035,1037],{"tip":1036},"Send the same event to multiple destinations (e.g. Axiom + Sentry + your DB) in parallel without duplicating emit calls.","Multi-destination fan-out",[677,1039,686],{"align":660},[677,1041,686],{"align":660},[677,1043,706],{"align":660},[677,1045,686],{"align":660},[677,1047,1048],{"align":670},[540,1049,739],{},[652,1051,1052,1058,1060,1062,1064,1066],{},[677,1053,1054],{},[680,1055,1057],{"tip":1056},"Append-only log of security-sensitive events (auth, billing, admin actions) with a hash chain so tampering can be detected after the fact.","Audit trail (tamper-evident chain)",[677,1059,768],{"align":660},[677,1061,706],{"align":660},[677,1063,706],{"align":660},[677,1065,706],{"align":660},[677,1067,1068],{"align":670},[540,1069,661],{},[652,1071,1072,1078,1080,1082,1084,1086],{},[677,1073,1074],{},[680,1075,1077],{"tip":1076},"Auto-attach derived context like parsed user-agent, GeoIP, request size, and W3C traceparent without writing middleware.","Built-in enrichers (UA \u002F Geo \u002F Trace \u002F Size)",[677,1079,768],{"align":660},[677,1081,706],{"align":660},[677,1083,706],{"align":660},[677,1085,706],{"align":660},[677,1087,1088],{"align":670},[540,1089,661],{},[652,1091,1092,1098,1100,1102,1104,1106],{},[677,1093,1094],{},[680,1095,1097],{"tip":1096},"Strips authorization, cookie, x-api-key, set-cookie etc. before they reach an adapter — no risk of leaking auth tokens to your observability vendor.","Sensitive header filtering",[677,1099,768],{"align":660},[677,1101,776],{"align":660},[677,1103,706],{"align":660},[677,1105,776],{"align":660},[677,1107,1108],{"align":670},[540,1109,661],{},[652,1111,1112,1118,1120,1122,1124,1126],{},[677,1113,1114],{},[680,1115,1117],{"tip":1116},"Reads incoming W3C traceparent \u002F tracestate headers and propagates them through the wide event for distributed tracing correlation.","W3C trace context (traceparent)",[677,1119,768],{"align":660},[677,1121,706],{"align":660},[677,1123,706],{"align":660},[677,1125,706],{"align":660},[677,1127,1128],{"align":670},[540,1129,661],{},[652,1131,1132,1138,1140,1142,1144,1146],{},[677,1133,1134],{},[680,1135,1137],{"tip":1136},"Drop-in middleware for Vercel AI SDK that auto-tracks token usage, tool calls, streaming metrics, and cost per LLM call.","AI SDK integration (tokens \u002F tools \u002F streaming)",[677,1139,768],{"align":660},[677,1141,706],{"align":660},[677,1143,706],{"align":660},[677,1145,706],{"align":660},[677,1147,1148],{"align":670},[540,1149,661],{},[652,1151,1152,1158,1160,1162,1164,1166],{},[677,1153,1154],{},[680,1155,1157],{"tip":1156},"One-line plugin for Better Auth that emits wide events for sign-in, sign-up, password reset, session refresh, and revocation.","Better Auth integration",[677,1159,768],{"align":660},[677,1161,706],{"align":660},[677,1163,706],{"align":660},[677,1165,706],{"align":660},[677,1167,1168],{"align":670},[540,1169,661],{},[652,1171,1172,1178,1180,1182,1184,1186],{},[677,1173,1174],{},[680,1175,1177],{"tip":1176},"Store logs in your own NuxtHub-hosted database with automatic retention — no external observability vendor required.","Self-hosted storage (NuxtHub adapter)",[677,1179,768],{"align":660},[677,1181,706],{"align":660},[677,1183,706],{"align":660},[677,1185,706],{"align":660},[677,1187,1188],{"align":670},[540,1189,661],{},[652,1191,1192,1198,1200,1202,1204,1206],{},[677,1193,1194],{},[680,1195,1197],{"tip":1196},"First-class support for Cloudflare Workers and Vercel Edge with waitUntil() integration so drains finish before the runtime terminates.","Edge \u002F Workers runtime",[677,1199,768],{"align":660},[677,1201,732],{"align":660},[677,1203,706],{"align":660},[677,1205,706],{"align":660},[677,1207,1208],{"align":670},[540,1209,661],{},[641,1211,1213],{"id":1212},"what-it-costs-to-install","What it costs to install",[646,1215,1216,1232],{},[649,1217,1218],{},[652,1219,1220,1222,1224,1226,1228,1230],{},[655,1221,657],{},[655,1223,661],{"align":660},[655,1225,542],{"align":660},[655,1227,550],{"align":660},[655,1229,546],{"align":660},[655,1231,628],{"align":670},[672,1233,1234,1255,1278,1302,1323,1343,1363,1383],{},[652,1235,1236,1242,1244,1247,1249,1251],{},[677,1237,1238],{},[680,1239,1241],{"tip":1240},"evlog itself ships no production deps. Adapters lazy-load their vendor SDKs only when imported.","Zero transitive dependencies",[677,1243,686],{"align":660},[677,1245,1246],{"align":660},"1 dep",[677,1248,706],{"align":660},[677,1250,706],{"align":660},[677,1252,1253],{"align":670},[540,1254,661],{},[652,1256,1257,1263,1266,1268,1271,1274],{},[677,1258,1259],{},[680,1260,1262],{"tip":1261},"Approximate gzipped size of the core logger when imported into a server bundle. Smaller is better for cold-start time on serverless.","Bundle size (gzip)",[677,1264,1265],{"align":660},"~6 kB",[677,1267,1265],{"align":660},[677,1269,1270],{"align":660},"~12 kB",[677,1272,1273],{"align":660},"~50 kB",[677,1275,1276],{"align":670},[540,1277,661],{},[652,1279,1280,1286,1289,1292,1295,1298],{},[677,1281,1282],{},[680,1283,1285],{"tip":1284},"How many full request lifecycles (start → set\u002Fset\u002Fset → emit) the logger can complete per second on a single core. See packages\u002Fevlog\u002Fbench\u002F for the methodology.","Wide event lifecycle throughput",[677,1287,1288],{"align":660},"1.58M ops\u002Fs",[677,1290,1291],{"align":660},"206K ops\u002Fs",[677,1293,1294],{"align":660},"n\u002Fa",[677,1296,1297],{"align":660},"112K ops\u002Fs",[677,1299,1300],{"align":670},[540,1301,661],{},[652,1303,1304,1310,1312,1315,1317,1319],{},[677,1305,1306],{},[680,1307,1309],{"tip":1308},"One-line installs for Nuxt, Nitro, Next.js, SvelteKit, TanStack Start, React Router, NestJS, Express, Hono, Fastify, Elysia, Cloudflare Workers, and Vercel Edge.","Framework auto-init (13+ integrations)",[677,1311,686],{"align":660},[677,1313,1314],{"align":660},"HTTP only",[677,1316,706],{"align":660},[677,1318,706],{"align":660},[677,1320,1321],{"align":670},[540,1322,661],{},[652,1324,1325,1331,1333,1335,1337,1339],{},[677,1326,1327],{},[680,1328,1330],{"tip":1329},"Browser logger that batches client-side events and ships them to your server over HTTP, where they merge into the wide event lifecycle.","Client → server log transport",[677,1332,686],{"align":660},[677,1334,706],{"align":660},[677,1336,706],{"align":660},[677,1338,706],{"align":660},[677,1340,1341],{"align":670},[540,1342,661],{},[652,1344,1345,1351,1353,1355,1357,1359],{},[677,1346,1347],{},[680,1348,1350],{"tip":1349},"Build-time console.log → log.info rewrite so you can adopt evlog without manually editing every file.","Vite plugin (auto-replace console.log)",[677,1352,686],{"align":660},[677,1354,706],{"align":660},[677,1356,706],{"align":660},[677,1358,706],{"align":660},[677,1360,1361],{"align":670},[540,1362,661],{},[652,1364,1365,1371,1373,1375,1377,1379],{},[677,1366,1367],{},[680,1368,1370],{"tip":1369},"Skip logging entirely for paths like \u002Fhealth or \u002Fmetrics using glob patterns — keeps your noise floor low without adding middleware.","Path filtering (include \u002F exclude globs)",[677,1372,768],{"align":660},[677,1374,776],{"align":660},[677,1376,706],{"align":660},[677,1378,776],{"align":660},[677,1380,1381],{"align":670},[540,1382,661],{},[652,1384,1385,1391,1393,1395,1397,1399],{},[677,1386,1387],{},[680,1388,1390],{"tip":1389},"Bundled .skill.md files so AI coding agents write evlog code in the right style without you teaching them every time.","AI agent skills (Cursor \u002F Claude \u002F ChatGPT)",[677,1392,686],{"align":660},[677,1394,706],{"align":660},[677,1396,706],{"align":660},[677,1398,706],{"align":660},[677,1400,1401],{"align":670},[540,1402,661],{},[536,1404,1405,1406,1409,1410,1413,1414,1417,1418,1422],{},"Counted up across the three tables (33 rows total): evlog wins ",[540,1407,1408],{},"23"," rows outright, ties on ",[540,1411,1412],{},"6",", and loses ",[540,1415,1416],{},"4",": custom levels, runtime level mutation, plugin\u002Fserializer system, and async-I\u002FO on a worker thread. All four losses are documented in ",[585,1419,1421],{"href":1420},"#honest-gaps-today","Honest gaps"," below so you know what you're trading off.",[536,1424,1425,1426,1434,1435,1438],{},"See ",[585,1427,1431],{"href":1428,"rel":1429},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fpackages\u002Fevlog\u002Fbench",[1430],"nofollow",[568,1432,1433],{},"packages\u002Fevlog\u002Fbench\u002F"," for the open-source benchmarks behind the throughput numbers, and the ",[585,1436,1437],{"href":505},"Performance page"," for the full breakdown.",[553,1440,1442],{"id":1441},"honest-gaps-today","Honest gaps (today)",[536,1444,1445],{},"We'd rather you read this list than discover the limits the hard way. Each item is a potential future Linear ticket. None of them are currently blocking for the workloads we've shipped evlog on.",[641,1447,1449,1450],{"id":1448},"no-persistent-bindings-shorthand-on-log","No persistent-bindings shorthand on ",[568,1451,1452],{},"log.*",[536,1454,1455,1456,1459,1460,1462],{},"pino has ",[568,1457,1458],{},"log.child({ component: 'auth' })"," that returns a new logger inheriting both the parent's bindings and the child's. evlog's simple ",[568,1461,1452],{}," API is global; to attach persistent context you create a wide-event logger:",[1464,1465,1470],"pre",{"className":1466,"code":1467,"language":1468,"meta":1469,"style":1469},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createLogger } from 'evlog'\n\nconst log = createLogger({ component: 'auth' })\nlog.set({ userId: 42 })\nlog.emit()\n","typescript","",[568,1471,1472,1504,1511,1553,1582],{"__ignoreMap":1469},[1473,1474,1477,1481,1485,1489,1492,1495,1498,1501],"span",{"class":1475,"line":1476},"line",1,[1473,1478,1480],{"class":1479},"s7zQu","import",[1473,1482,1484],{"class":1483},"sMK4o"," {",[1473,1486,1488],{"class":1487},"sTEyZ"," createLogger",[1473,1490,1491],{"class":1483}," }",[1473,1493,1494],{"class":1479}," from",[1473,1496,1497],{"class":1483}," '",[1473,1499,661],{"class":1500},"sfazB",[1473,1502,1503],{"class":1483},"'\n",[1473,1505,1507],{"class":1475,"line":1506},2,[1473,1508,1510],{"emptyLinePlaceholder":1509},true,"\n",[1473,1512,1514,1518,1521,1524,1527,1530,1533,1537,1540,1542,1545,1548,1550],{"class":1475,"line":1513},3,[1473,1515,1517],{"class":1516},"spNyl","const",[1473,1519,1520],{"class":1487}," log ",[1473,1522,1523],{"class":1483},"=",[1473,1525,1488],{"class":1526},"s2Zo4",[1473,1528,1529],{"class":1487},"(",[1473,1531,1532],{"class":1483},"{",[1473,1534,1536],{"class":1535},"swJcz"," component",[1473,1538,1539],{"class":1483},":",[1473,1541,1497],{"class":1483},[1473,1543,1544],{"class":1500},"auth",[1473,1546,1547],{"class":1483},"'",[1473,1549,1491],{"class":1483},[1473,1551,1552],{"class":1487},")\n",[1473,1554,1556,1559,1562,1565,1567,1569,1572,1574,1578,1580],{"class":1475,"line":1555},4,[1473,1557,1558],{"class":1487},"log",[1473,1560,1561],{"class":1483},".",[1473,1563,1564],{"class":1526},"set",[1473,1566,1529],{"class":1487},[1473,1568,1532],{"class":1483},[1473,1570,1571],{"class":1535}," userId",[1473,1573,1539],{"class":1483},[1473,1575,1577],{"class":1576},"sbssI"," 42",[1473,1579,1491],{"class":1483},[1473,1581,1552],{"class":1487},[1473,1583,1585,1587,1589,1592],{"class":1475,"line":1584},5,[1473,1586,1558],{"class":1487},[1473,1588,1561],{"class":1483},[1473,1590,1591],{"class":1526},"emit",[1473,1593,1594],{"class":1487},"()\n",[536,1596,1597,1598,1601,1602,1605],{},"Or, in framework integrations, the request middleware does it for you. This works but it's not the same ergonomic shape as ",[568,1599,1600],{},"pino.child",". A ",[568,1603,1604],{},"log.child(bindings)"," shorthand is a likely next addition.",[641,1607,1609,1612,1613,1615],{"id":1608},"minlevel-is-set-once-at-startup-global-log",[568,1610,1611],{},"minLevel"," is set once at startup (global ",[568,1614,1452],{},")",[536,1617,1618,1619,1621,1622,1625,1626,1628,1629,1632,1633,1636],{},"You configure ",[568,1620,1611],{}," in ",[568,1623,1624],{},"initLogger({ minLevel: 'info' })"," and that's it for the process lifetime on the global ",[568,1627,1452],{}," API. pino lets you mutate ",[568,1630,1631],{},"logger.level = 'debug'"," at runtime (handy for ",[568,1634,1635],{},"--verbose"," flags or hot-reload).",[536,1638,1639,1640,543,1643,1646,1647,1650,1651,1654,1655,1657],{},"On ",[540,1641,1642],{},"request-scoped wide-event loggers",[568,1644,1645],{},"log.setLevel('error' | 'warn' | 'info' | 'debug')"," promotes the event level explicitly without touching the ",[568,1648,1649],{},"error"," context, which is what you want when you control the error shape yourself. Client-side ",[568,1652,1653],{},"setMinLevel()"," works the same way for the browser ",[568,1656,1558],{}," API.",[641,1659,1661],{"id":1660},"custom-levels-are-not-supported","Custom levels are not supported",[536,1663,1664,1665,1668,1669,1668,1671,1668,1674,1676,1677,543,1680,543,1683,1686,1687,1689,1690,1692],{},"evlog ships ",[568,1666,1667],{},"debug"," \u002F ",[568,1670,633],{},[568,1672,1673],{},"warn",[568,1675,1649],{}," and that's it. pino, consola, and winston all let you define ",[568,1678,1679],{},"trace",[568,1681,1682],{},"notice",[568,1684,1685],{},"fatal",", etc. We chose four levels on purpose (most teams never use more than four), but if your existing pipeline depends on ",[568,1688,1685],{}," or ",[568,1691,1679],{}," you'll need to map them onto the closest evlog level.",[641,1694,1696,1697],{"id":1695},"no-multi-stream-transport-array-on-log","No multi-stream \u002F transport array on ",[568,1698,1452],{},[536,1700,1701,1702,1705,1706,1709],{},"pino lets you pipe a single log to multiple destinations via ",[568,1703,1704],{},"pino.multistream",". evlog does the same via ",[585,1707,1708],{"href":493},"the drain pipeline"," (one drain that fans out to N adapters, with batching and retry shared across all of them). The mental model is different. If you've structured your existing code around \"stream A is debug to stdout, stream B is warn+ to a file, stream C is error to Sentry\", you'll rebuild that as drain-level routing instead.",[641,1711,1713],{"id":1712},"no-formatter-serializer-plugin-system","No formatter \u002F serializer plugin system",[536,1715,1455,1716,1719,1720,570,1723,1726,1727,1561],{},[568,1717,1718],{},"serializers"," for converting common types (errors, requests, responses) into JSON. evlog handles the common cases via the redaction layer and the built-in error serialization (",[568,1721,1722],{},"createError",[568,1724,1725],{},"parseError","); for anything custom (e.g. masking a particular field or transforming a payload), you write it inside a custom drain or before calling ",[568,1728,1729],{},"log.set",[553,1731,1733],{"id":1732},"migrating-from","Migrating from",[536,1735,1736,1737,1740,1741,1744],{},"Pick the tab that matches your current logger. Each tab shows the ",[540,1738,1739],{},"before"," code in that library's own API. Underneath the tabs is the single ",[540,1742,1743],{},"after"," snippet, the same evlog code regardless of where you came from.",[1746,1747,1748,2185,2650,2962],"code-group",{},[1464,1749,1751],{"className":1466,"code":1750,"filename":542,"language":1468,"meta":1469,"style":1469},"import pino from 'pino'\n\nconst log = pino({ name: 'checkout' })\nconst child = log.child({ flow: 'checkout' })\n\nchild.info({ event: 'checkout_started' })\n\ntry {\n  const cart = await getCart(userId)\n  child.info({ cart: { items: cart.items.length, total: cart.total } }, 'cart loaded')\n\n  const charge = await stripe.charge(cart.total)\n  child.info({ stripe: { chargeId: charge.id } }, 'charge ok')\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  child.error({ err }, 'checkout failed')\n  throw err\n}\n",[568,1752,1753,1769,1773,1804,1840,1844,1873,1878,1887,1912,1978,1983,2014,2058,2063,2088,2123,2129,2143,2170,2179],{"__ignoreMap":1469},[1473,1754,1755,1757,1760,1763,1765,1767],{"class":1475,"line":1476},[1473,1756,1480],{"class":1479},[1473,1758,1759],{"class":1487}," pino ",[1473,1761,1762],{"class":1479},"from",[1473,1764,1497],{"class":1483},[1473,1766,542],{"class":1500},[1473,1768,1503],{"class":1483},[1473,1770,1771],{"class":1475,"line":1506},[1473,1772,1510],{"emptyLinePlaceholder":1509},[1473,1774,1775,1777,1779,1781,1784,1786,1788,1791,1793,1795,1798,1800,1802],{"class":1475,"line":1513},[1473,1776,1517],{"class":1516},[1473,1778,1520],{"class":1487},[1473,1780,1523],{"class":1483},[1473,1782,1783],{"class":1526}," pino",[1473,1785,1529],{"class":1487},[1473,1787,1532],{"class":1483},[1473,1789,1790],{"class":1535}," name",[1473,1792,1539],{"class":1483},[1473,1794,1497],{"class":1483},[1473,1796,1797],{"class":1500},"checkout",[1473,1799,1547],{"class":1483},[1473,1801,1491],{"class":1483},[1473,1803,1552],{"class":1487},[1473,1805,1806,1808,1811,1813,1816,1818,1821,1823,1825,1828,1830,1832,1834,1836,1838],{"class":1475,"line":1555},[1473,1807,1517],{"class":1516},[1473,1809,1810],{"class":1487}," child ",[1473,1812,1523],{"class":1483},[1473,1814,1815],{"class":1487}," log",[1473,1817,1561],{"class":1483},[1473,1819,1820],{"class":1526},"child",[1473,1822,1529],{"class":1487},[1473,1824,1532],{"class":1483},[1473,1826,1827],{"class":1535}," flow",[1473,1829,1539],{"class":1483},[1473,1831,1497],{"class":1483},[1473,1833,1797],{"class":1500},[1473,1835,1547],{"class":1483},[1473,1837,1491],{"class":1483},[1473,1839,1552],{"class":1487},[1473,1841,1842],{"class":1475,"line":1584},[1473,1843,1510],{"emptyLinePlaceholder":1509},[1473,1845,1847,1849,1851,1853,1855,1857,1860,1862,1864,1867,1869,1871],{"class":1475,"line":1846},6,[1473,1848,1820],{"class":1487},[1473,1850,1561],{"class":1483},[1473,1852,633],{"class":1526},[1473,1854,1529],{"class":1487},[1473,1856,1532],{"class":1483},[1473,1858,1859],{"class":1535}," event",[1473,1861,1539],{"class":1483},[1473,1863,1497],{"class":1483},[1473,1865,1866],{"class":1500},"checkout_started",[1473,1868,1547],{"class":1483},[1473,1870,1491],{"class":1483},[1473,1872,1552],{"class":1487},[1473,1874,1876],{"class":1475,"line":1875},7,[1473,1877,1510],{"emptyLinePlaceholder":1509},[1473,1879,1881,1884],{"class":1475,"line":1880},8,[1473,1882,1883],{"class":1479},"try",[1473,1885,1886],{"class":1483}," {\n",[1473,1888,1890,1893,1896,1899,1902,1905,1907,1910],{"class":1475,"line":1889},9,[1473,1891,1892],{"class":1516},"  const",[1473,1894,1895],{"class":1487}," cart",[1473,1897,1898],{"class":1483}," =",[1473,1900,1901],{"class":1479}," await",[1473,1903,1904],{"class":1526}," getCart",[1473,1906,1529],{"class":1535},[1473,1908,1909],{"class":1487},"userId",[1473,1911,1552],{"class":1535},[1473,1913,1915,1918,1920,1922,1924,1926,1928,1930,1932,1935,1937,1939,1941,1944,1946,1949,1952,1955,1957,1959,1961,1964,1966,1969,1971,1974,1976],{"class":1475,"line":1914},10,[1473,1916,1917],{"class":1487},"  child",[1473,1919,1561],{"class":1483},[1473,1921,633],{"class":1526},[1473,1923,1529],{"class":1535},[1473,1925,1532],{"class":1483},[1473,1927,1895],{"class":1535},[1473,1929,1539],{"class":1483},[1473,1931,1484],{"class":1483},[1473,1933,1934],{"class":1535}," items",[1473,1936,1539],{"class":1483},[1473,1938,1895],{"class":1487},[1473,1940,1561],{"class":1483},[1473,1942,1943],{"class":1487},"items",[1473,1945,1561],{"class":1483},[1473,1947,1948],{"class":1487},"length",[1473,1950,1951],{"class":1483},",",[1473,1953,1954],{"class":1535}," total",[1473,1956,1539],{"class":1483},[1473,1958,1895],{"class":1487},[1473,1960,1561],{"class":1483},[1473,1962,1963],{"class":1487},"total",[1473,1965,1491],{"class":1483},[1473,1967,1968],{"class":1483}," },",[1473,1970,1497],{"class":1483},[1473,1972,1973],{"class":1500},"cart loaded",[1473,1975,1547],{"class":1483},[1473,1977,1552],{"class":1535},[1473,1979,1981],{"class":1475,"line":1980},11,[1473,1982,1510],{"emptyLinePlaceholder":1509},[1473,1984,1986,1988,1991,1993,1995,1998,2000,2003,2005,2008,2010,2012],{"class":1475,"line":1985},12,[1473,1987,1892],{"class":1516},[1473,1989,1990],{"class":1487}," charge",[1473,1992,1898],{"class":1483},[1473,1994,1901],{"class":1479},[1473,1996,1997],{"class":1487}," stripe",[1473,1999,1561],{"class":1483},[1473,2001,2002],{"class":1526},"charge",[1473,2004,1529],{"class":1535},[1473,2006,2007],{"class":1487},"cart",[1473,2009,1561],{"class":1483},[1473,2011,1963],{"class":1487},[1473,2013,1552],{"class":1535},[1473,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2036,2038,2040,2042,2045,2047,2049,2051,2054,2056],{"class":1475,"line":2016},13,[1473,2018,1917],{"class":1487},[1473,2020,1561],{"class":1483},[1473,2022,633],{"class":1526},[1473,2024,1529],{"class":1535},[1473,2026,1532],{"class":1483},[1473,2028,1997],{"class":1535},[1473,2030,1539],{"class":1483},[1473,2032,1484],{"class":1483},[1473,2034,2035],{"class":1535}," chargeId",[1473,2037,1539],{"class":1483},[1473,2039,1990],{"class":1487},[1473,2041,1561],{"class":1483},[1473,2043,2044],{"class":1487},"id",[1473,2046,1491],{"class":1483},[1473,2048,1968],{"class":1483},[1473,2050,1497],{"class":1483},[1473,2052,2053],{"class":1500},"charge ok",[1473,2055,1547],{"class":1483},[1473,2057,1552],{"class":1535},[1473,2059,2061],{"class":1475,"line":2060},14,[1473,2062,1510],{"emptyLinePlaceholder":1509},[1473,2064,2066,2069,2072,2075,2077,2079,2082,2085],{"class":1475,"line":2065},15,[1473,2067,2068],{"class":1479},"  if",[1473,2070,2071],{"class":1535}," (",[1473,2073,2074],{"class":1483},"!",[1473,2076,2002],{"class":1487},[1473,2078,1561],{"class":1483},[1473,2080,2081],{"class":1487},"success",[1473,2083,2084],{"class":1535},") ",[1473,2086,2087],{"class":1483},"{\n",[1473,2089,2091,2094,2097,2100,2102,2105,2108,2111,2113,2115,2118,2121],{"class":1475,"line":2090},16,[1473,2092,2093],{"class":1479},"    throw",[1473,2095,2096],{"class":1483}," new",[1473,2098,2099],{"class":1526}," Error",[1473,2101,1529],{"class":1535},[1473,2103,2104],{"class":1483},"`",[1473,2106,2107],{"class":1500},"Payment failed: ",[1473,2109,2110],{"class":1483},"${",[1473,2112,2002],{"class":1487},[1473,2114,1561],{"class":1483},[1473,2116,2117],{"class":1487},"decline_reason",[1473,2119,2120],{"class":1483},"}`",[1473,2122,1552],{"class":1535},[1473,2124,2126],{"class":1475,"line":2125},17,[1473,2127,2128],{"class":1483},"  }\n",[1473,2130,2132,2135,2138,2141],{"class":1475,"line":2131},18,[1473,2133,2134],{"class":1483},"}",[1473,2136,2137],{"class":1479}," catch",[1473,2139,2140],{"class":1487}," (err) ",[1473,2142,2087],{"class":1483},[1473,2144,2146,2148,2150,2152,2154,2156,2159,2161,2163,2166,2168],{"class":1475,"line":2145},19,[1473,2147,1917],{"class":1487},[1473,2149,1561],{"class":1483},[1473,2151,1649],{"class":1526},[1473,2153,1529],{"class":1535},[1473,2155,1532],{"class":1483},[1473,2157,2158],{"class":1487}," err",[1473,2160,1968],{"class":1483},[1473,2162,1497],{"class":1483},[1473,2164,2165],{"class":1500},"checkout failed",[1473,2167,1547],{"class":1483},[1473,2169,1552],{"class":1535},[1473,2171,2173,2176],{"class":1475,"line":2172},20,[1473,2174,2175],{"class":1479},"  throw",[1473,2177,2178],{"class":1487}," err\n",[1473,2180,2182],{"class":1475,"line":2181},21,[1473,2183,2184],{"class":1483},"}\n",[1464,2186,2188],{"className":1466,"code":2187,"filename":546,"language":1468,"meta":1469,"style":1469},"import { createLogger as createWinston, format, transports } from 'winston'\n\nconst log = createWinston({\n  defaultMeta: { service: 'checkout' },\n  format: format.combine(format.timestamp(), format.json()),\n  transports: [new transports.Console()],\n})\n\nlog.info({ event: 'checkout_started', flow: 'checkout' })\n\ntry {\n  const cart = await getCart(userId)\n  log.info({ flow: 'checkout', cart: { items: cart.items.length, total: cart.total } })\n\n  const charge = await stripe.charge(cart.total)\n  log.info({ flow: 'checkout', stripe: { chargeId: charge.id } })\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  log.error({ flow: 'checkout', err })\n  throw err\n}\n",[568,2189,2190,2224,2228,2242,2265,2305,2330,2336,2340,2378,2382,2388,2406,2469,2473,2499,2545,2549,2567,2593,2597,2607,2638,2645],{"__ignoreMap":1469},[1473,2191,2192,2194,2196,2198,2201,2204,2206,2209,2211,2214,2216,2218,2220,2222],{"class":1475,"line":1476},[1473,2193,1480],{"class":1479},[1473,2195,1484],{"class":1483},[1473,2197,1488],{"class":1487},[1473,2199,2200],{"class":1479}," as",[1473,2202,2203],{"class":1487}," createWinston",[1473,2205,1951],{"class":1483},[1473,2207,2208],{"class":1487}," format",[1473,2210,1951],{"class":1483},[1473,2212,2213],{"class":1487}," transports",[1473,2215,1491],{"class":1483},[1473,2217,1494],{"class":1479},[1473,2219,1497],{"class":1483},[1473,2221,546],{"class":1500},[1473,2223,1503],{"class":1483},[1473,2225,2226],{"class":1475,"line":1506},[1473,2227,1510],{"emptyLinePlaceholder":1509},[1473,2229,2230,2232,2234,2236,2238,2240],{"class":1475,"line":1513},[1473,2231,1517],{"class":1516},[1473,2233,1520],{"class":1487},[1473,2235,1523],{"class":1483},[1473,2237,2203],{"class":1526},[1473,2239,1529],{"class":1487},[1473,2241,2087],{"class":1483},[1473,2243,2244,2247,2249,2251,2254,2256,2258,2260,2262],{"class":1475,"line":1555},[1473,2245,2246],{"class":1535},"  defaultMeta",[1473,2248,1539],{"class":1483},[1473,2250,1484],{"class":1483},[1473,2252,2253],{"class":1535}," service",[1473,2255,1539],{"class":1483},[1473,2257,1497],{"class":1483},[1473,2259,1797],{"class":1500},[1473,2261,1547],{"class":1483},[1473,2263,2264],{"class":1483}," },\n",[1473,2266,2267,2270,2272,2274,2276,2279,2282,2284,2287,2290,2292,2294,2296,2299,2302],{"class":1475,"line":1584},[1473,2268,2269],{"class":1535},"  format",[1473,2271,1539],{"class":1483},[1473,2273,2208],{"class":1487},[1473,2275,1561],{"class":1483},[1473,2277,2278],{"class":1526},"combine",[1473,2280,2281],{"class":1487},"(format",[1473,2283,1561],{"class":1483},[1473,2285,2286],{"class":1526},"timestamp",[1473,2288,2289],{"class":1487},"()",[1473,2291,1951],{"class":1483},[1473,2293,2208],{"class":1487},[1473,2295,1561],{"class":1483},[1473,2297,2298],{"class":1526},"json",[1473,2300,2301],{"class":1487},"())",[1473,2303,2304],{"class":1483},",\n",[1473,2306,2307,2310,2312,2315,2318,2320,2322,2325,2328],{"class":1475,"line":1846},[1473,2308,2309],{"class":1535},"  transports",[1473,2311,1539],{"class":1483},[1473,2313,2314],{"class":1487}," [",[1473,2316,2317],{"class":1483},"new",[1473,2319,2213],{"class":1487},[1473,2321,1561],{"class":1483},[1473,2323,2324],{"class":1526},"Console",[1473,2326,2327],{"class":1487},"()]",[1473,2329,2304],{"class":1483},[1473,2331,2332,2334],{"class":1475,"line":1875},[1473,2333,2134],{"class":1483},[1473,2335,1552],{"class":1487},[1473,2337,2338],{"class":1475,"line":1880},[1473,2339,1510],{"emptyLinePlaceholder":1509},[1473,2341,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376],{"class":1475,"line":1889},[1473,2343,1558],{"class":1487},[1473,2345,1561],{"class":1483},[1473,2347,633],{"class":1526},[1473,2349,1529],{"class":1487},[1473,2351,1532],{"class":1483},[1473,2353,1859],{"class":1535},[1473,2355,1539],{"class":1483},[1473,2357,1497],{"class":1483},[1473,2359,1866],{"class":1500},[1473,2361,1547],{"class":1483},[1473,2363,1951],{"class":1483},[1473,2365,1827],{"class":1535},[1473,2367,1539],{"class":1483},[1473,2369,1497],{"class":1483},[1473,2371,1797],{"class":1500},[1473,2373,1547],{"class":1483},[1473,2375,1491],{"class":1483},[1473,2377,1552],{"class":1487},[1473,2379,2380],{"class":1475,"line":1914},[1473,2381,1510],{"emptyLinePlaceholder":1509},[1473,2383,2384,2386],{"class":1475,"line":1980},[1473,2385,1883],{"class":1479},[1473,2387,1886],{"class":1483},[1473,2389,2390,2392,2394,2396,2398,2400,2402,2404],{"class":1475,"line":1985},[1473,2391,1892],{"class":1516},[1473,2393,1895],{"class":1487},[1473,2395,1898],{"class":1483},[1473,2397,1901],{"class":1479},[1473,2399,1904],{"class":1526},[1473,2401,1529],{"class":1535},[1473,2403,1909],{"class":1487},[1473,2405,1552],{"class":1535},[1473,2407,2408,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455,2457,2459,2461,2463,2465,2467],{"class":1475,"line":2016},[1473,2409,2410],{"class":1487},"  log",[1473,2412,1561],{"class":1483},[1473,2414,633],{"class":1526},[1473,2416,1529],{"class":1535},[1473,2418,1532],{"class":1483},[1473,2420,1827],{"class":1535},[1473,2422,1539],{"class":1483},[1473,2424,1497],{"class":1483},[1473,2426,1797],{"class":1500},[1473,2428,1547],{"class":1483},[1473,2430,1951],{"class":1483},[1473,2432,1895],{"class":1535},[1473,2434,1539],{"class":1483},[1473,2436,1484],{"class":1483},[1473,2438,1934],{"class":1535},[1473,2440,1539],{"class":1483},[1473,2442,1895],{"class":1487},[1473,2444,1561],{"class":1483},[1473,2446,1943],{"class":1487},[1473,2448,1561],{"class":1483},[1473,2450,1948],{"class":1487},[1473,2452,1951],{"class":1483},[1473,2454,1954],{"class":1535},[1473,2456,1539],{"class":1483},[1473,2458,1895],{"class":1487},[1473,2460,1561],{"class":1483},[1473,2462,1963],{"class":1487},[1473,2464,1491],{"class":1483},[1473,2466,1491],{"class":1483},[1473,2468,1552],{"class":1535},[1473,2470,2471],{"class":1475,"line":2060},[1473,2472,1510],{"emptyLinePlaceholder":1509},[1473,2474,2475,2477,2479,2481,2483,2485,2487,2489,2491,2493,2495,2497],{"class":1475,"line":2065},[1473,2476,1892],{"class":1516},[1473,2478,1990],{"class":1487},[1473,2480,1898],{"class":1483},[1473,2482,1901],{"class":1479},[1473,2484,1997],{"class":1487},[1473,2486,1561],{"class":1483},[1473,2488,2002],{"class":1526},[1473,2490,1529],{"class":1535},[1473,2492,2007],{"class":1487},[1473,2494,1561],{"class":1483},[1473,2496,1963],{"class":1487},[1473,2498,1552],{"class":1535},[1473,2500,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541,2543],{"class":1475,"line":2090},[1473,2502,2410],{"class":1487},[1473,2504,1561],{"class":1483},[1473,2506,633],{"class":1526},[1473,2508,1529],{"class":1535},[1473,2510,1532],{"class":1483},[1473,2512,1827],{"class":1535},[1473,2514,1539],{"class":1483},[1473,2516,1497],{"class":1483},[1473,2518,1797],{"class":1500},[1473,2520,1547],{"class":1483},[1473,2522,1951],{"class":1483},[1473,2524,1997],{"class":1535},[1473,2526,1539],{"class":1483},[1473,2528,1484],{"class":1483},[1473,2530,2035],{"class":1535},[1473,2532,1539],{"class":1483},[1473,2534,1990],{"class":1487},[1473,2536,1561],{"class":1483},[1473,2538,2044],{"class":1487},[1473,2540,1491],{"class":1483},[1473,2542,1491],{"class":1483},[1473,2544,1552],{"class":1535},[1473,2546,2547],{"class":1475,"line":2125},[1473,2548,1510],{"emptyLinePlaceholder":1509},[1473,2550,2551,2553,2555,2557,2559,2561,2563,2565],{"class":1475,"line":2131},[1473,2552,2068],{"class":1479},[1473,2554,2071],{"class":1535},[1473,2556,2074],{"class":1483},[1473,2558,2002],{"class":1487},[1473,2560,1561],{"class":1483},[1473,2562,2081],{"class":1487},[1473,2564,2084],{"class":1535},[1473,2566,2087],{"class":1483},[1473,2568,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591],{"class":1475,"line":2145},[1473,2570,2093],{"class":1479},[1473,2572,2096],{"class":1483},[1473,2574,2099],{"class":1526},[1473,2576,1529],{"class":1535},[1473,2578,2104],{"class":1483},[1473,2580,2107],{"class":1500},[1473,2582,2110],{"class":1483},[1473,2584,2002],{"class":1487},[1473,2586,1561],{"class":1483},[1473,2588,2117],{"class":1487},[1473,2590,2120],{"class":1483},[1473,2592,1552],{"class":1535},[1473,2594,2595],{"class":1475,"line":2172},[1473,2596,2128],{"class":1483},[1473,2598,2599,2601,2603,2605],{"class":1475,"line":2181},[1473,2600,2134],{"class":1483},[1473,2602,2137],{"class":1479},[1473,2604,2140],{"class":1487},[1473,2606,2087],{"class":1483},[1473,2608,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636],{"class":1475,"line":2609},22,[1473,2611,2410],{"class":1487},[1473,2613,1561],{"class":1483},[1473,2615,1649],{"class":1526},[1473,2617,1529],{"class":1535},[1473,2619,1532],{"class":1483},[1473,2621,1827],{"class":1535},[1473,2623,1539],{"class":1483},[1473,2625,1497],{"class":1483},[1473,2627,1797],{"class":1500},[1473,2629,1547],{"class":1483},[1473,2631,1951],{"class":1483},[1473,2633,2158],{"class":1487},[1473,2635,1491],{"class":1483},[1473,2637,1552],{"class":1535},[1473,2639,2641,2643],{"class":1475,"line":2640},23,[1473,2642,2175],{"class":1479},[1473,2644,2178],{"class":1487},[1473,2646,2648],{"class":1475,"line":2647},24,[1473,2649,2184],{"class":1483},[1464,2651,2653],{"className":1466,"code":2652,"filename":550,"language":1468,"meta":1469,"style":1469},"import { consola } from 'consola'\n\nconst log = consola.withTag('checkout')\n\nlog.info('Starting checkout flow')\n\ntry {\n  const cart = await getCart(userId)\n  log.info('cart loaded', { items: cart.items.length, total: cart.total })\n\n  const charge = await stripe.charge(cart.total)\n  log.info('charge ok', { chargeId: charge.id })\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  log.error('checkout failed', err)\n  throw err\n}\n",[568,2654,2655,2674,2678,2703,2707,2726,2730,2736,2754,2804,2808,2834,2868,2872,2890,2916,2920,2930,2952,2958],{"__ignoreMap":1469},[1473,2656,2657,2659,2661,2664,2666,2668,2670,2672],{"class":1475,"line":1476},[1473,2658,1480],{"class":1479},[1473,2660,1484],{"class":1483},[1473,2662,2663],{"class":1487}," consola",[1473,2665,1491],{"class":1483},[1473,2667,1494],{"class":1479},[1473,2669,1497],{"class":1483},[1473,2671,550],{"class":1500},[1473,2673,1503],{"class":1483},[1473,2675,2676],{"class":1475,"line":1506},[1473,2677,1510],{"emptyLinePlaceholder":1509},[1473,2679,2680,2682,2684,2686,2688,2690,2693,2695,2697,2699,2701],{"class":1475,"line":1513},[1473,2681,1517],{"class":1516},[1473,2683,1520],{"class":1487},[1473,2685,1523],{"class":1483},[1473,2687,2663],{"class":1487},[1473,2689,1561],{"class":1483},[1473,2691,2692],{"class":1526},"withTag",[1473,2694,1529],{"class":1487},[1473,2696,1547],{"class":1483},[1473,2698,1797],{"class":1500},[1473,2700,1547],{"class":1483},[1473,2702,1552],{"class":1487},[1473,2704,2705],{"class":1475,"line":1555},[1473,2706,1510],{"emptyLinePlaceholder":1509},[1473,2708,2709,2711,2713,2715,2717,2719,2722,2724],{"class":1475,"line":1584},[1473,2710,1558],{"class":1487},[1473,2712,1561],{"class":1483},[1473,2714,633],{"class":1526},[1473,2716,1529],{"class":1487},[1473,2718,1547],{"class":1483},[1473,2720,2721],{"class":1500},"Starting checkout flow",[1473,2723,1547],{"class":1483},[1473,2725,1552],{"class":1487},[1473,2727,2728],{"class":1475,"line":1846},[1473,2729,1510],{"emptyLinePlaceholder":1509},[1473,2731,2732,2734],{"class":1475,"line":1875},[1473,2733,1883],{"class":1479},[1473,2735,1886],{"class":1483},[1473,2737,2738,2740,2742,2744,2746,2748,2750,2752],{"class":1475,"line":1880},[1473,2739,1892],{"class":1516},[1473,2741,1895],{"class":1487},[1473,2743,1898],{"class":1483},[1473,2745,1901],{"class":1479},[1473,2747,1904],{"class":1526},[1473,2749,1529],{"class":1535},[1473,2751,1909],{"class":1487},[1473,2753,1552],{"class":1535},[1473,2755,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800,2802],{"class":1475,"line":1889},[1473,2757,2410],{"class":1487},[1473,2759,1561],{"class":1483},[1473,2761,633],{"class":1526},[1473,2763,1529],{"class":1535},[1473,2765,1547],{"class":1483},[1473,2767,1973],{"class":1500},[1473,2769,1547],{"class":1483},[1473,2771,1951],{"class":1483},[1473,2773,1484],{"class":1483},[1473,2775,1934],{"class":1535},[1473,2777,1539],{"class":1483},[1473,2779,1895],{"class":1487},[1473,2781,1561],{"class":1483},[1473,2783,1943],{"class":1487},[1473,2785,1561],{"class":1483},[1473,2787,1948],{"class":1487},[1473,2789,1951],{"class":1483},[1473,2791,1954],{"class":1535},[1473,2793,1539],{"class":1483},[1473,2795,1895],{"class":1487},[1473,2797,1561],{"class":1483},[1473,2799,1963],{"class":1487},[1473,2801,1491],{"class":1483},[1473,2803,1552],{"class":1535},[1473,2805,2806],{"class":1475,"line":1914},[1473,2807,1510],{"emptyLinePlaceholder":1509},[1473,2809,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832],{"class":1475,"line":1980},[1473,2811,1892],{"class":1516},[1473,2813,1990],{"class":1487},[1473,2815,1898],{"class":1483},[1473,2817,1901],{"class":1479},[1473,2819,1997],{"class":1487},[1473,2821,1561],{"class":1483},[1473,2823,2002],{"class":1526},[1473,2825,1529],{"class":1535},[1473,2827,2007],{"class":1487},[1473,2829,1561],{"class":1483},[1473,2831,1963],{"class":1487},[1473,2833,1552],{"class":1535},[1473,2835,2836,2838,2840,2842,2844,2846,2848,2850,2852,2854,2856,2858,2860,2862,2864,2866],{"class":1475,"line":1985},[1473,2837,2410],{"class":1487},[1473,2839,1561],{"class":1483},[1473,2841,633],{"class":1526},[1473,2843,1529],{"class":1535},[1473,2845,1547],{"class":1483},[1473,2847,2053],{"class":1500},[1473,2849,1547],{"class":1483},[1473,2851,1951],{"class":1483},[1473,2853,1484],{"class":1483},[1473,2855,2035],{"class":1535},[1473,2857,1539],{"class":1483},[1473,2859,1990],{"class":1487},[1473,2861,1561],{"class":1483},[1473,2863,2044],{"class":1487},[1473,2865,1491],{"class":1483},[1473,2867,1552],{"class":1535},[1473,2869,2870],{"class":1475,"line":2016},[1473,2871,1510],{"emptyLinePlaceholder":1509},[1473,2873,2874,2876,2878,2880,2882,2884,2886,2888],{"class":1475,"line":2060},[1473,2875,2068],{"class":1479},[1473,2877,2071],{"class":1535},[1473,2879,2074],{"class":1483},[1473,2881,2002],{"class":1487},[1473,2883,1561],{"class":1483},[1473,2885,2081],{"class":1487},[1473,2887,2084],{"class":1535},[1473,2889,2087],{"class":1483},[1473,2891,2892,2894,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914],{"class":1475,"line":2065},[1473,2893,2093],{"class":1479},[1473,2895,2096],{"class":1483},[1473,2897,2099],{"class":1526},[1473,2899,1529],{"class":1535},[1473,2901,2104],{"class":1483},[1473,2903,2107],{"class":1500},[1473,2905,2110],{"class":1483},[1473,2907,2002],{"class":1487},[1473,2909,1561],{"class":1483},[1473,2911,2117],{"class":1487},[1473,2913,2120],{"class":1483},[1473,2915,1552],{"class":1535},[1473,2917,2918],{"class":1475,"line":2090},[1473,2919,2128],{"class":1483},[1473,2921,2922,2924,2926,2928],{"class":1475,"line":2125},[1473,2923,2134],{"class":1483},[1473,2925,2137],{"class":1479},[1473,2927,2140],{"class":1487},[1473,2929,2087],{"class":1483},[1473,2931,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950],{"class":1475,"line":2131},[1473,2933,2410],{"class":1487},[1473,2935,1561],{"class":1483},[1473,2937,1649],{"class":1526},[1473,2939,1529],{"class":1535},[1473,2941,1547],{"class":1483},[1473,2943,2165],{"class":1500},[1473,2945,1547],{"class":1483},[1473,2947,1951],{"class":1483},[1473,2949,2158],{"class":1487},[1473,2951,1552],{"class":1535},[1473,2953,2954,2956],{"class":1475,"line":2145},[1473,2955,2175],{"class":1479},[1473,2957,2178],{"class":1487},[1473,2959,2960],{"class":1475,"line":2172},[1473,2961,2184],{"class":1483},[1464,2963,2966],{"className":1466,"code":2964,"filename":2965,"language":1468,"meta":1469,"style":1469},"console.log('[checkout] Starting checkout flow')\n\ntry {\n  const cart = await getCart(userId)\n  console.log('[checkout] cart loaded', { items: cart.items.length, total: cart.total })\n\n  const charge = await stripe.charge(cart.total)\n  console.log('[checkout] charge ok', { chargeId: charge.id })\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  console.error('[checkout] failed', err)\n  throw err\n}\n","console.log",[568,2967,2968,2988,2992,2998,3016,3068,3072,3098,3133,3137,3155,3181,3185,3195,3218,3224],{"__ignoreMap":1469},[1473,2969,2970,2973,2975,2977,2979,2981,2984,2986],{"class":1475,"line":1476},[1473,2971,2972],{"class":1487},"console",[1473,2974,1561],{"class":1483},[1473,2976,1558],{"class":1526},[1473,2978,1529],{"class":1487},[1473,2980,1547],{"class":1483},[1473,2982,2983],{"class":1500},"[checkout] Starting checkout flow",[1473,2985,1547],{"class":1483},[1473,2987,1552],{"class":1487},[1473,2989,2990],{"class":1475,"line":1506},[1473,2991,1510],{"emptyLinePlaceholder":1509},[1473,2993,2994,2996],{"class":1475,"line":1513},[1473,2995,1883],{"class":1479},[1473,2997,1886],{"class":1483},[1473,2999,3000,3002,3004,3006,3008,3010,3012,3014],{"class":1475,"line":1555},[1473,3001,1892],{"class":1516},[1473,3003,1895],{"class":1487},[1473,3005,1898],{"class":1483},[1473,3007,1901],{"class":1479},[1473,3009,1904],{"class":1526},[1473,3011,1529],{"class":1535},[1473,3013,1909],{"class":1487},[1473,3015,1552],{"class":1535},[1473,3017,3018,3021,3023,3025,3027,3029,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066],{"class":1475,"line":1584},[1473,3019,3020],{"class":1487},"  console",[1473,3022,1561],{"class":1483},[1473,3024,1558],{"class":1526},[1473,3026,1529],{"class":1535},[1473,3028,1547],{"class":1483},[1473,3030,3031],{"class":1500},"[checkout] cart loaded",[1473,3033,1547],{"class":1483},[1473,3035,1951],{"class":1483},[1473,3037,1484],{"class":1483},[1473,3039,1934],{"class":1535},[1473,3041,1539],{"class":1483},[1473,3043,1895],{"class":1487},[1473,3045,1561],{"class":1483},[1473,3047,1943],{"class":1487},[1473,3049,1561],{"class":1483},[1473,3051,1948],{"class":1487},[1473,3053,1951],{"class":1483},[1473,3055,1954],{"class":1535},[1473,3057,1539],{"class":1483},[1473,3059,1895],{"class":1487},[1473,3061,1561],{"class":1483},[1473,3063,1963],{"class":1487},[1473,3065,1491],{"class":1483},[1473,3067,1552],{"class":1535},[1473,3069,3070],{"class":1475,"line":1846},[1473,3071,1510],{"emptyLinePlaceholder":1509},[1473,3073,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092,3094,3096],{"class":1475,"line":1875},[1473,3075,1892],{"class":1516},[1473,3077,1990],{"class":1487},[1473,3079,1898],{"class":1483},[1473,3081,1901],{"class":1479},[1473,3083,1997],{"class":1487},[1473,3085,1561],{"class":1483},[1473,3087,2002],{"class":1526},[1473,3089,1529],{"class":1535},[1473,3091,2007],{"class":1487},[1473,3093,1561],{"class":1483},[1473,3095,1963],{"class":1487},[1473,3097,1552],{"class":1535},[1473,3099,3100,3102,3104,3106,3108,3110,3113,3115,3117,3119,3121,3123,3125,3127,3129,3131],{"class":1475,"line":1880},[1473,3101,3020],{"class":1487},[1473,3103,1561],{"class":1483},[1473,3105,1558],{"class":1526},[1473,3107,1529],{"class":1535},[1473,3109,1547],{"class":1483},[1473,3111,3112],{"class":1500},"[checkout] charge ok",[1473,3114,1547],{"class":1483},[1473,3116,1951],{"class":1483},[1473,3118,1484],{"class":1483},[1473,3120,2035],{"class":1535},[1473,3122,1539],{"class":1483},[1473,3124,1990],{"class":1487},[1473,3126,1561],{"class":1483},[1473,3128,2044],{"class":1487},[1473,3130,1491],{"class":1483},[1473,3132,1552],{"class":1535},[1473,3134,3135],{"class":1475,"line":1889},[1473,3136,1510],{"emptyLinePlaceholder":1509},[1473,3138,3139,3141,3143,3145,3147,3149,3151,3153],{"class":1475,"line":1914},[1473,3140,2068],{"class":1479},[1473,3142,2071],{"class":1535},[1473,3144,2074],{"class":1483},[1473,3146,2002],{"class":1487},[1473,3148,1561],{"class":1483},[1473,3150,2081],{"class":1487},[1473,3152,2084],{"class":1535},[1473,3154,2087],{"class":1483},[1473,3156,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175,3177,3179],{"class":1475,"line":1980},[1473,3158,2093],{"class":1479},[1473,3160,2096],{"class":1483},[1473,3162,2099],{"class":1526},[1473,3164,1529],{"class":1535},[1473,3166,2104],{"class":1483},[1473,3168,2107],{"class":1500},[1473,3170,2110],{"class":1483},[1473,3172,2002],{"class":1487},[1473,3174,1561],{"class":1483},[1473,3176,2117],{"class":1487},[1473,3178,2120],{"class":1483},[1473,3180,1552],{"class":1535},[1473,3182,3183],{"class":1475,"line":1985},[1473,3184,2128],{"class":1483},[1473,3186,3187,3189,3191,3193],{"class":1475,"line":2016},[1473,3188,2134],{"class":1483},[1473,3190,2137],{"class":1479},[1473,3192,2140],{"class":1487},[1473,3194,2087],{"class":1483},[1473,3196,3197,3199,3201,3203,3205,3207,3210,3212,3214,3216],{"class":1475,"line":2060},[1473,3198,3020],{"class":1487},[1473,3200,1561],{"class":1483},[1473,3202,1649],{"class":1526},[1473,3204,1529],{"class":1535},[1473,3206,1547],{"class":1483},[1473,3208,3209],{"class":1500},"[checkout] failed",[1473,3211,1547],{"class":1483},[1473,3213,1951],{"class":1483},[1473,3215,2158],{"class":1487},[1473,3217,1552],{"class":1535},[1473,3219,3220,3222],{"class":1475,"line":2065},[1473,3221,2175],{"class":1479},[1473,3223,2178],{"class":1487},[1473,3225,3226],{"class":1475,"line":2090},[1473,3227,2184],{"class":1483},[536,3229,3230],{},"All four become this, the same code whatever the source library:",[1464,3232,3235],{"className":1466,"code":3233,"filename":3234,"language":1468,"meta":1469,"style":1469},"import { initLogger, createLogger, createError } from 'evlog'\n\ninitLogger({ env: { service: 'checkout' } })\n\nconst log = createLogger({ flow: 'checkout' })\n\ntry {\n  const cart = await getCart(userId)\n  log.set({ cart: { items: cart.items.length, total: cart.total } })\n\n  const charge = await stripe.charge(cart.total)\n  log.set({ stripe: { chargeId: charge.id } })\n\n  if (!charge.success) {\n    throw createError({\n      message: 'Payment failed',\n      status: 402,\n      why: charge.decline_reason,\n      fix: 'Try a different payment method',\n    })\n  }\n} catch (err) {\n  log.error(err as Error)\n  throw err\n} finally {\n  log.emit()\n}\n","After (evlog)",[568,3236,3237,3265,3269,3301,3305,3333,3337,3343,3361,3411,3415,3441,3475,3479,3497,3507,3523,3535,3550,3566,3573,3577,3587,3607,3613,3623,3634],{"__ignoreMap":1469},[1473,3238,3239,3241,3243,3246,3248,3250,3252,3255,3257,3259,3261,3263],{"class":1475,"line":1476},[1473,3240,1480],{"class":1479},[1473,3242,1484],{"class":1483},[1473,3244,3245],{"class":1487}," initLogger",[1473,3247,1951],{"class":1483},[1473,3249,1488],{"class":1487},[1473,3251,1951],{"class":1483},[1473,3253,3254],{"class":1487}," createError",[1473,3256,1491],{"class":1483},[1473,3258,1494],{"class":1479},[1473,3260,1497],{"class":1483},[1473,3262,661],{"class":1500},[1473,3264,1503],{"class":1483},[1473,3266,3267],{"class":1475,"line":1506},[1473,3268,1510],{"emptyLinePlaceholder":1509},[1473,3270,3271,3274,3276,3278,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299],{"class":1475,"line":1513},[1473,3272,3273],{"class":1526},"initLogger",[1473,3275,1529],{"class":1487},[1473,3277,1532],{"class":1483},[1473,3279,3280],{"class":1535}," env",[1473,3282,1539],{"class":1483},[1473,3284,1484],{"class":1483},[1473,3286,2253],{"class":1535},[1473,3288,1539],{"class":1483},[1473,3290,1497],{"class":1483},[1473,3292,1797],{"class":1500},[1473,3294,1547],{"class":1483},[1473,3296,1491],{"class":1483},[1473,3298,1491],{"class":1483},[1473,3300,1552],{"class":1487},[1473,3302,3303],{"class":1475,"line":1555},[1473,3304,1510],{"emptyLinePlaceholder":1509},[1473,3306,3307,3309,3311,3313,3315,3317,3319,3321,3323,3325,3327,3329,3331],{"class":1475,"line":1584},[1473,3308,1517],{"class":1516},[1473,3310,1520],{"class":1487},[1473,3312,1523],{"class":1483},[1473,3314,1488],{"class":1526},[1473,3316,1529],{"class":1487},[1473,3318,1532],{"class":1483},[1473,3320,1827],{"class":1535},[1473,3322,1539],{"class":1483},[1473,3324,1497],{"class":1483},[1473,3326,1797],{"class":1500},[1473,3328,1547],{"class":1483},[1473,3330,1491],{"class":1483},[1473,3332,1552],{"class":1487},[1473,3334,3335],{"class":1475,"line":1846},[1473,3336,1510],{"emptyLinePlaceholder":1509},[1473,3338,3339,3341],{"class":1475,"line":1875},[1473,3340,1883],{"class":1479},[1473,3342,1886],{"class":1483},[1473,3344,3345,3347,3349,3351,3353,3355,3357,3359],{"class":1475,"line":1880},[1473,3346,1892],{"class":1516},[1473,3348,1895],{"class":1487},[1473,3350,1898],{"class":1483},[1473,3352,1901],{"class":1479},[1473,3354,1904],{"class":1526},[1473,3356,1529],{"class":1535},[1473,3358,1909],{"class":1487},[1473,3360,1552],{"class":1535},[1473,3362,3363,3365,3367,3369,3371,3373,3375,3377,3379,3381,3383,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407,3409],{"class":1475,"line":1889},[1473,3364,2410],{"class":1487},[1473,3366,1561],{"class":1483},[1473,3368,1564],{"class":1526},[1473,3370,1529],{"class":1535},[1473,3372,1532],{"class":1483},[1473,3374,1895],{"class":1535},[1473,3376,1539],{"class":1483},[1473,3378,1484],{"class":1483},[1473,3380,1934],{"class":1535},[1473,3382,1539],{"class":1483},[1473,3384,1895],{"class":1487},[1473,3386,1561],{"class":1483},[1473,3388,1943],{"class":1487},[1473,3390,1561],{"class":1483},[1473,3392,1948],{"class":1487},[1473,3394,1951],{"class":1483},[1473,3396,1954],{"class":1535},[1473,3398,1539],{"class":1483},[1473,3400,1895],{"class":1487},[1473,3402,1561],{"class":1483},[1473,3404,1963],{"class":1487},[1473,3406,1491],{"class":1483},[1473,3408,1491],{"class":1483},[1473,3410,1552],{"class":1535},[1473,3412,3413],{"class":1475,"line":1914},[1473,3414,1510],{"emptyLinePlaceholder":1509},[1473,3416,3417,3419,3421,3423,3425,3427,3429,3431,3433,3435,3437,3439],{"class":1475,"line":1980},[1473,3418,1892],{"class":1516},[1473,3420,1990],{"class":1487},[1473,3422,1898],{"class":1483},[1473,3424,1901],{"class":1479},[1473,3426,1997],{"class":1487},[1473,3428,1561],{"class":1483},[1473,3430,2002],{"class":1526},[1473,3432,1529],{"class":1535},[1473,3434,2007],{"class":1487},[1473,3436,1561],{"class":1483},[1473,3438,1963],{"class":1487},[1473,3440,1552],{"class":1535},[1473,3442,3443,3445,3447,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473],{"class":1475,"line":1985},[1473,3444,2410],{"class":1487},[1473,3446,1561],{"class":1483},[1473,3448,1564],{"class":1526},[1473,3450,1529],{"class":1535},[1473,3452,1532],{"class":1483},[1473,3454,1997],{"class":1535},[1473,3456,1539],{"class":1483},[1473,3458,1484],{"class":1483},[1473,3460,2035],{"class":1535},[1473,3462,1539],{"class":1483},[1473,3464,1990],{"class":1487},[1473,3466,1561],{"class":1483},[1473,3468,2044],{"class":1487},[1473,3470,1491],{"class":1483},[1473,3472,1491],{"class":1483},[1473,3474,1552],{"class":1535},[1473,3476,3477],{"class":1475,"line":2016},[1473,3478,1510],{"emptyLinePlaceholder":1509},[1473,3480,3481,3483,3485,3487,3489,3491,3493,3495],{"class":1475,"line":2060},[1473,3482,2068],{"class":1479},[1473,3484,2071],{"class":1535},[1473,3486,2074],{"class":1483},[1473,3488,2002],{"class":1487},[1473,3490,1561],{"class":1483},[1473,3492,2081],{"class":1487},[1473,3494,2084],{"class":1535},[1473,3496,2087],{"class":1483},[1473,3498,3499,3501,3503,3505],{"class":1475,"line":2065},[1473,3500,2093],{"class":1479},[1473,3502,3254],{"class":1526},[1473,3504,1529],{"class":1535},[1473,3506,2087],{"class":1483},[1473,3508,3509,3512,3514,3516,3519,3521],{"class":1475,"line":2090},[1473,3510,3511],{"class":1535},"      message",[1473,3513,1539],{"class":1483},[1473,3515,1497],{"class":1483},[1473,3517,3518],{"class":1500},"Payment failed",[1473,3520,1547],{"class":1483},[1473,3522,2304],{"class":1483},[1473,3524,3525,3528,3530,3533],{"class":1475,"line":2125},[1473,3526,3527],{"class":1535},"      status",[1473,3529,1539],{"class":1483},[1473,3531,3532],{"class":1576}," 402",[1473,3534,2304],{"class":1483},[1473,3536,3537,3540,3542,3544,3546,3548],{"class":1475,"line":2131},[1473,3538,3539],{"class":1535},"      why",[1473,3541,1539],{"class":1483},[1473,3543,1990],{"class":1487},[1473,3545,1561],{"class":1483},[1473,3547,2117],{"class":1487},[1473,3549,2304],{"class":1483},[1473,3551,3552,3555,3557,3559,3562,3564],{"class":1475,"line":2145},[1473,3553,3554],{"class":1535},"      fix",[1473,3556,1539],{"class":1483},[1473,3558,1497],{"class":1483},[1473,3560,3561],{"class":1500},"Try a different payment method",[1473,3563,1547],{"class":1483},[1473,3565,2304],{"class":1483},[1473,3567,3568,3571],{"class":1475,"line":2172},[1473,3569,3570],{"class":1483},"    }",[1473,3572,1552],{"class":1535},[1473,3574,3575],{"class":1475,"line":2181},[1473,3576,2128],{"class":1483},[1473,3578,3579,3581,3583,3585],{"class":1475,"line":2609},[1473,3580,2134],{"class":1483},[1473,3582,2137],{"class":1479},[1473,3584,2140],{"class":1487},[1473,3586,2087],{"class":1483},[1473,3588,3589,3591,3593,3595,3597,3600,3602,3605],{"class":1475,"line":2640},[1473,3590,2410],{"class":1487},[1473,3592,1561],{"class":1483},[1473,3594,1649],{"class":1526},[1473,3596,1529],{"class":1535},[1473,3598,3599],{"class":1487},"err",[1473,3601,2200],{"class":1479},[1473,3603,2099],{"class":3604},"sBMFI",[1473,3606,1552],{"class":1535},[1473,3608,3609,3611],{"class":1475,"line":2647},[1473,3610,2175],{"class":1479},[1473,3612,2178],{"class":1487},[1473,3614,3616,3618,3621],{"class":1475,"line":3615},25,[1473,3617,2134],{"class":1483},[1473,3619,3620],{"class":1479}," finally",[1473,3622,1886],{"class":1483},[1473,3624,3626,3628,3630,3632],{"class":1475,"line":3625},26,[1473,3627,2410],{"class":1487},[1473,3629,1561],{"class":1483},[1473,3631,1591],{"class":1526},[1473,3633,1594],{"class":1535},[1473,3635,3637],{"class":1475,"line":3636},27,[1473,3638,2184],{"class":1483},[536,3640,3641],{},"Three things changed in every migration:",[558,3643,3644,3657,3677],{},[561,3645,3646,3649,3650,3652,3653,3656],{},[540,3647,3648],{},"N log lines → 1 wide event."," The 3-4 calls per request become ",[568,3651,1729],{}," accumulations and one ",[568,3654,3655],{},"log.emit"," at the end. Your dashboard gets one queryable row instead of stitching by request id.",[561,3658,3659,3669,3670,3672,3673,3676],{},[540,3660,3661,3662,3665,3666,1561],{},"Errors carry ",[568,3663,3664],{},"why"," and ",[568,3667,3668],{},"fix"," Throwing ",[568,3671,1722],{}," instead of ",[568,3674,3675],{},"new Error"," means your client (and on-call) get actionable context, not just a stack.",[561,3678,3679,3682,3683,3685,3686,3688],{},[540,3680,3681],{},"Setup is one line."," No formatter wiring, no transport assembly, no ",[568,3684,573],{}," peer dep. ",[568,3687,3273],{}," once at boot and you're done.",[553,3690,3692],{"id":3691},"reverse-direction-when-not-to-pick-evlog","Reverse direction: when not to pick evlog",[536,3694,3695],{},"Be honest with yourself. Don't switch if:",[558,3697,3698,3709,3716],{},[561,3699,3700,3701,543,3703,543,3705,3708],{},"You ship a library that's already part of the pino ecosystem (",[568,3702,576],{},[568,3704,573],{},[568,3706,3707],{},"pino-multi-stream"," plugins) and would lose tooling.",[561,3710,3711,3712,3715],{},"You have a custom pino transport (e.g. a worker-thread Datadog forwarder you wrote in 2021) you don't want to re-implement as an evlog drain. Most of the ",[585,3713,3714],{"href":138},"built-in adapters"," cover the common destinations, but custom protocols mean a port.",[561,3717,3718],{},"You log only inside CLIs and use consola purely for the pretty terminal output. evlog's pretty output is good but not consola-grade for spinners, prompts, and box renders. Use both: evlog for events that go to a drain, consola for prompts \u002F TUIs.",[553,3720,3722],{"id":3721},"next-steps","Next Steps",[558,3724,3725,3733,3738,3744],{},[561,3726,3727,3729,3730,3732],{},[585,3728,39],{"href":40},": the ",[568,3731,1452],{}," API, migration tabs, and patterns",[561,3734,3735,3737],{},[585,3736,44],{"href":45},": what unlocks when you accumulate context per operation",[561,3739,3740,3743],{},[585,3741,3742],{"href":505},"Performance Benchmarks",": the methodology behind the numbers above",[561,3745,3746,3749],{},[585,3747,3748],{"href":287},"Standalone TypeScript",": scripts, workers, and libraries without a web framework",[3751,3752,3753],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":1469,"searchDepth":1506,"depth":1506,"links":3755},[3756,3757,3762,3772,3773,3774],{"id":555,"depth":1506,"text":556},{"id":621,"depth":1506,"text":622,"children":3758},[3759,3760,3761],{"id":643,"depth":1513,"text":644},{"id":925,"depth":1513,"text":926},{"id":1212,"depth":1513,"text":1213},{"id":1441,"depth":1506,"text":1442,"children":3763},[3764,3766,3768,3769,3771],{"id":1448,"depth":1513,"text":3765},"No persistent-bindings shorthand on log.*",{"id":1608,"depth":1513,"text":3767},"minLevel is set once at startup (global log.*)",{"id":1660,"depth":1513,"text":1661},{"id":1695,"depth":1513,"text":3770},"No multi-stream \u002F transport array on log.*",{"id":1712,"depth":1513,"text":1713},{"id":1732,"depth":1506,"text":1733},{"id":3691,"depth":1506,"text":3692},{"id":3721,"depth":1506,"text":3722},"evlog is compared against pino, winston, and consola, with a feature matrix, the gaps we have not closed, and migration snippets.","md",[3778,3781],{"label":3742,"icon":373,"to":505,"color":3779,"variant":3780},"neutral","subtle",{"label":39,"icon":42,"to":40,"color":3779,"variant":3780},{},{"title":517,"icon":520},{"title":531,"description":3775},"Rz7Do9XGZjNr9d8Jblzb01xx3I2qOWSKMbi2IFBqRdc",[3787,3789],{"title":513,"path":514,"stem":515,"description":3788,"icon":376,"children":-1},"Security guidelines, data sanitization, and production tips for evlog. Learn what not to log and how to protect sensitive data.",{"title":522,"path":523,"stem":524,"description":3790,"icon":431,"children":-1},"AI-assisted code review and evlog adoption using Agent Skills. Let AI review your logging patterns and guide migration to wide events.",1786799450921]