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