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