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