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