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