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