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