[{"data":1,"prerenderedAt":2976},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-self-hosted-memory":534,"-integrate-adapters-self-hosted-memory-surround":2971},[4,30,80,128,308,440,499],{"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},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113,118,123],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":94,"path":95,"stem":96,"icon":97},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":99,"path":100,"stem":101,"icon":102},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":104,"path":105,"stem":106,"icon":107},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":109,"path":110,"stem":111,"icon":112},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":114,"path":115,"stem":116,"icon":117},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":119,"path":120,"stem":121,"icon":122},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":124,"path":125,"stem":126,"icon":127},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":129,"path":130,"stem":131,"children":132,"page":29},"Integrate","\u002Fintegrate","4.integrate",[133,137,220],{"title":36,"path":134,"stem":135,"icon":136},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[142,145,175,200],{"title":36,"path":143,"stem":144,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":146,"path":147,"stem":148,"children":149,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[150,155,160,165,170],{"title":151,"path":152,"stem":153,"icon":154},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":156,"path":157,"stem":158,"icon":159},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":161,"path":162,"stem":163,"icon":164},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":166,"path":167,"stem":168,"icon":169},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":171,"path":172,"stem":173,"icon":174},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[180,185,190,195],{"title":181,"path":182,"stem":183,"icon":184},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":186,"path":187,"stem":188,"icon":189},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":191,"path":192,"stem":193,"icon":194},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":196,"path":197,"stem":198,"icon":199},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":201,"path":202,"stem":203,"children":204,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[205,210,215],{"title":206,"path":207,"stem":208,"icon":209},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":211,"path":212,"stem":213,"icon":214},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":216,"path":217,"stem":218,"icon":219},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":221,"path":222,"stem":223,"children":224,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[225,229,234,239,244,249,254,259,264,269,274,279,284,289,293,298,303],{"title":36,"path":226,"stem":227,"icon":228},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":230,"path":231,"stem":232,"icon":233},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":235,"path":236,"stem":237,"icon":238},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":240,"path":241,"stem":242,"icon":243},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":245,"path":246,"stem":247,"icon":248},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":250,"path":251,"stem":252,"icon":253},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":255,"path":256,"stem":257,"icon":258},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":260,"path":261,"stem":262,"icon":263},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":265,"path":266,"stem":267,"icon":268},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":270,"path":271,"stem":272,"icon":273},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":275,"path":276,"stem":277,"icon":278},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":280,"path":281,"stem":282,"icon":283},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":285,"path":286,"stem":287,"icon":288},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":290,"path":291,"stem":292,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":294,"path":295,"stem":296,"icon":297},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":299,"path":300,"stem":301,"icon":302},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":304,"path":305,"stem":306,"icon":307},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":309,"path":310,"stem":311,"children":312,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[313,316,321,350,377,409,430,435],{"title":36,"path":314,"stem":315,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":317,"path":318,"stem":319,"icon":320},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":322,"icon":323,"path":324,"stem":325,"children":326,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[327,330,335,340,345],{"title":36,"path":328,"stem":329,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":331,"path":332,"stem":333,"icon":334},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":336,"path":337,"stem":338,"icon":339},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":341,"path":342,"stem":343,"icon":344},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":346,"path":347,"stem":348,"icon":349},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":351,"icon":352,"path":353,"stem":354,"children":355,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[356,359,364,369,373],{"title":36,"path":357,"stem":358,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":360,"path":361,"stem":362,"icon":363},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":365,"path":366,"stem":367,"icon":368},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":370,"path":371,"stem":372,"icon":320},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":374,"path":375,"stem":376,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":378,"icon":379,"path":380,"stem":381,"children":382,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[383,386,391,396,401,405],{"title":36,"path":384,"stem":385,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":387,"path":388,"stem":389,"icon":390},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":392,"path":393,"stem":394,"icon":395},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":397,"path":398,"stem":399,"icon":400},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":402,"path":403,"stem":404,"icon":379},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":406,"path":407,"stem":408,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":346,"icon":107,"path":410,"stem":411,"children":412,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[413,416,421,426],{"title":36,"path":414,"stem":415,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":417,"path":418,"stem":419,"icon":420},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":422,"path":423,"stem":424,"icon":425},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":427,"path":428,"stem":429,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":431,"path":432,"stem":433,"icon":434},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":436,"path":437,"stem":438,"icon":439},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":441,"path":442,"stem":443,"children":444,"page":29},"Extend","\u002Fextend","6.extend",[445,449,454,459,463,468,472,476,480,484,489,494],{"title":36,"path":446,"stem":447,"icon":448},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":450,"path":451,"stem":452,"icon":453},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":455,"path":456,"stem":457,"icon":458},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":460,"path":461,"stem":462,"icon":453},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":464,"path":465,"stem":466,"icon":467},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":406,"path":469,"stem":470,"icon":471},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":473,"path":474,"stem":475,"icon":448},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":477,"path":478,"stem":479,"icon":434},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":481,"path":482,"stem":483,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":485,"path":486,"stem":487,"icon":488},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":490,"path":491,"stem":492,"icon":493},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":495,"path":496,"stem":497,"icon":498},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":427,"path":500,"stem":501,"children":502,"page":29},"\u002Freference","7.reference",[503,508,511,516,520,525,529],{"title":504,"path":505,"stem":506,"icon":507},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":374,"path":509,"stem":510,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":512,"path":513,"stem":514,"icon":515},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":517,"path":518,"stem":519,"icon":379},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":521,"path":522,"stem":523,"icon":524},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":526,"path":527,"stem":528,"icon":434},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":530,"path":531,"stem":532,"icon":533},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"id":535,"title":536,"body":537,"description":2959,"extension":2960,"links":2961,"meta":2967,"navigation":2968,"path":217,"seo":2969,"stem":218,"__hash__":2970},"docs\u002F4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory.md","Memory Adapter",{"type":538,"value":539,"toc":2938},"minimark",[540,559,566,612,616,619,668,671,1453,1457,1464,1612,1639,1648,1651,1655,1720,1786,1790,1827,1834,1838,1841,2018,2022,2030,2294,2300,2403,2407,2410,2588,2592,2602,2611,2622,2626,2629,2802,2808,2903,2907,2934],[541,542,543,544,548,549,553,554,558],"p",{},"The Memory adapter stores wide events in a module-level ring buffer. Unlike the ",[545,546,547],"a",{"href":207},"File System adapter",", it has ",[550,551,552],"strong",{},"zero runtime dependencies"," and runs anywhere — including Cloudflare Workers (workerd), Deno Deploy, and other edge runtimes that don't expose Node's ",[555,556,557],"code",{},"fs"," module.",[541,560,561,562,565],{},"The primary use case is ",[550,563,564],{},"local dev agent access",": wire the drain during development, expose a lightweight HTTP endpoint, and let your AI agent fetch structured logs over HTTP without any external tooling.",[567,568,571,574,599],"prompt",{":actions":569,"description":570,"icon":219},"[\"copy\",\"cursor\",\"claude\"]","Add the memory drain adapter",[541,572,573],{},"Add the memory drain adapter to store evlog wide events in an in-memory ring buffer.",[575,576,577,581,584,587,590,593,596],"ol",{},[578,579,580],"li",{},"Identify which framework I'm using and follow its evlog integration pattern",[578,582,583],{},"Install evlog if not already installed",[578,585,586],{},"Import createMemoryDrain and readMemoryLogs from 'evlog\u002Fmemory'",[578,588,589],{},"Wire createMemoryDrain() into my framework's drain configuration",[578,591,592],{},"Expose a dev-only HTTP endpoint that returns readMemoryLogs() as JSON",[578,594,595],{},"Agents can now hit that endpoint to retrieve structured logs over HTTP",[578,597,598],{},"Optionally configure maxEvents (default 1000) or use named stores",[541,600,601,602,607,608],{},"Adapter docs: ",[545,603,604],{"href":604,"rel":605},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory",[606],"nofollow","\nFramework setup: ",[545,609,610],{"href":610,"rel":611},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Foverview",[606],[613,614,20],"h2",{"id":615},"installation",[541,617,618],{},"The Memory adapter comes bundled with evlog:",[620,621,627],"pre",{"className":622,"code":623,"filename":624,"language":625,"meta":626,"style":626},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createMemoryDrain, readMemoryLogs } from 'evlog\u002Fmemory'\n","src\u002Findex.ts","typescript","",[555,628,629],{"__ignoreMap":626},[630,631,634,638,642,646,649,652,655,658,661,665],"span",{"class":632,"line":633},"line",1,[630,635,637],{"class":636},"s7zQu","import",[630,639,641],{"class":640},"sMK4o"," {",[630,643,645],{"class":644},"sTEyZ"," createMemoryDrain",[630,647,648],{"class":640},",",[630,650,651],{"class":644}," readMemoryLogs",[630,653,654],{"class":640}," }",[630,656,657],{"class":636}," from",[630,659,660],{"class":640}," '",[630,662,664],{"class":663},"sfazB","evlog\u002Fmemory",[630,666,667],{"class":640},"'\n",[613,669,25],{"id":670},"quick-start",[672,673,674,905,998,1126,1200,1278,1352,1405],"code-group",{},[620,675,678],{"className":622,"code":676,"filename":677,"language":625,"meta":626,"style":626},"\u002F\u002F src\u002Findex.ts\nimport { Hono } from 'hono'\nimport { evlog } from 'evlog\u002Fhono'\nimport { createMemoryDrain, readMemoryLogs } from 'evlog\u002Fmemory'\n\nconst app = new Hono()\n\napp.use(evlog({ drain: createMemoryDrain() }))\n\n\u002F\u002F Dev-only endpoint — restrict or remove in production\napp.get('\u002F_evlog\u002Flogs', (c) => {\n  return c.json(readMemoryLogs())\n})\n","Hono (Cloudflare Workers)",[555,679,680,686,707,728,751,758,780,785,826,831,837,875,897],{"__ignoreMap":626},[630,681,682],{"class":632,"line":633},[630,683,685],{"class":684},"sHwdD","\u002F\u002F src\u002Findex.ts\n",[630,687,689,691,693,696,698,700,702,705],{"class":632,"line":688},2,[630,690,637],{"class":636},[630,692,641],{"class":640},[630,694,695],{"class":644}," Hono",[630,697,654],{"class":640},[630,699,657],{"class":636},[630,701,660],{"class":640},[630,703,704],{"class":663},"hono",[630,706,667],{"class":640},[630,708,710,712,714,717,719,721,723,726],{"class":632,"line":709},3,[630,711,637],{"class":636},[630,713,641],{"class":640},[630,715,716],{"class":644}," evlog",[630,718,654],{"class":640},[630,720,657],{"class":636},[630,722,660],{"class":640},[630,724,725],{"class":663},"evlog\u002Fhono",[630,727,667],{"class":640},[630,729,731,733,735,737,739,741,743,745,747,749],{"class":632,"line":730},4,[630,732,637],{"class":636},[630,734,641],{"class":640},[630,736,645],{"class":644},[630,738,648],{"class":640},[630,740,651],{"class":644},[630,742,654],{"class":640},[630,744,657],{"class":636},[630,746,660],{"class":640},[630,748,664],{"class":663},[630,750,667],{"class":640},[630,752,754],{"class":632,"line":753},5,[630,755,757],{"emptyLinePlaceholder":756},true,"\n",[630,759,761,765,768,771,774,777],{"class":632,"line":760},6,[630,762,764],{"class":763},"spNyl","const",[630,766,767],{"class":644}," app ",[630,769,770],{"class":640},"=",[630,772,773],{"class":640}," new",[630,775,695],{"class":776},"s2Zo4",[630,778,779],{"class":644},"()\n",[630,781,783],{"class":632,"line":782},7,[630,784,757],{"emptyLinePlaceholder":756},[630,786,788,791,794,797,800,803,805,808,812,815,817,820,823],{"class":632,"line":787},8,[630,789,790],{"class":644},"app",[630,792,793],{"class":640},".",[630,795,796],{"class":776},"use",[630,798,799],{"class":644},"(",[630,801,802],{"class":776},"evlog",[630,804,799],{"class":644},[630,806,807],{"class":640},"{",[630,809,811],{"class":810},"swJcz"," drain",[630,813,814],{"class":640},":",[630,816,645],{"class":776},[630,818,819],{"class":644},"() ",[630,821,822],{"class":640},"}",[630,824,825],{"class":644},"))\n",[630,827,829],{"class":632,"line":828},9,[630,830,757],{"emptyLinePlaceholder":756},[630,832,834],{"class":632,"line":833},10,[630,835,836],{"class":684},"\u002F\u002F Dev-only endpoint — restrict or remove in production\n",[630,838,840,842,844,847,849,852,855,857,859,862,866,869,872],{"class":632,"line":839},11,[630,841,790],{"class":644},[630,843,793],{"class":640},[630,845,846],{"class":776},"get",[630,848,799],{"class":644},[630,850,851],{"class":640},"'",[630,853,854],{"class":663},"\u002F_evlog\u002Flogs",[630,856,851],{"class":640},[630,858,648],{"class":640},[630,860,861],{"class":640}," (",[630,863,865],{"class":864},"sHdIc","c",[630,867,868],{"class":640},")",[630,870,871],{"class":763}," =>",[630,873,874],{"class":640}," {\n",[630,876,878,881,884,886,889,891,894],{"class":632,"line":877},12,[630,879,880],{"class":636},"  return",[630,882,883],{"class":644}," c",[630,885,793],{"class":640},[630,887,888],{"class":776},"json",[630,890,799],{"class":810},[630,892,893],{"class":776},"readMemoryLogs",[630,895,896],{"class":810},"())\n",[630,898,900,902],{"class":632,"line":899},13,[630,901,822],{"class":640},[630,903,904],{"class":644},")\n",[620,906,909],{"className":622,"code":907,"filename":908,"language":625,"meta":626,"style":626},"\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\nimport { createMemoryDrain } from 'evlog\u002Fmemory'\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', createMemoryDrain())\n})\n","Nuxt \u002F Nitro",[555,910,911,916,934,938,962,992],{"__ignoreMap":626},[630,912,913],{"class":632,"line":633},[630,914,915],{"class":684},"\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[630,917,918,920,922,924,926,928,930,932],{"class":632,"line":688},[630,919,637],{"class":636},[630,921,641],{"class":640},[630,923,645],{"class":644},[630,925,654],{"class":640},[630,927,657],{"class":636},[630,929,660],{"class":640},[630,931,664],{"class":663},[630,933,667],{"class":640},[630,935,936],{"class":632,"line":709},[630,937,757],{"emptyLinePlaceholder":756},[630,939,940,943,946,949,951,953,956,958,960],{"class":632,"line":730},[630,941,942],{"class":636},"export",[630,944,945],{"class":636}," default",[630,947,948],{"class":776}," defineNitroPlugin",[630,950,799],{"class":644},[630,952,799],{"class":640},[630,954,955],{"class":864},"nitroApp",[630,957,868],{"class":640},[630,959,871],{"class":763},[630,961,874],{"class":640},[630,963,964,967,969,972,974,977,979,981,984,986,988,990],{"class":632,"line":753},[630,965,966],{"class":644},"  nitroApp",[630,968,793],{"class":640},[630,970,971],{"class":644},"hooks",[630,973,793],{"class":640},[630,975,976],{"class":776},"hook",[630,978,799],{"class":810},[630,980,851],{"class":640},[630,982,983],{"class":663},"evlog:drain",[630,985,851],{"class":640},[630,987,648],{"class":640},[630,989,645],{"class":776},[630,991,896],{"class":810},[630,993,994,996],{"class":632,"line":760},[630,995,822],{"class":640},[630,997,904],{"class":644},[620,999,1001],{"className":622,"code":1000,"filename":235,"language":625,"meta":626,"style":626},"\u002F\u002F lib\u002Fevlog.ts\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createMemoryDrain } from 'evlog\u002Fmemory'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain: createMemoryDrain(),\n})\n",[555,1002,1003,1008,1028,1046,1050,1089,1106,1120],{"__ignoreMap":626},[630,1004,1005],{"class":632,"line":633},[630,1006,1007],{"class":684},"\u002F\u002F lib\u002Fevlog.ts\n",[630,1009,1010,1012,1014,1017,1019,1021,1023,1026],{"class":632,"line":688},[630,1011,637],{"class":636},[630,1013,641],{"class":640},[630,1015,1016],{"class":644}," createEvlog",[630,1018,654],{"class":640},[630,1020,657],{"class":636},[630,1022,660],{"class":640},[630,1024,1025],{"class":663},"evlog\u002Fnext",[630,1027,667],{"class":640},[630,1029,1030,1032,1034,1036,1038,1040,1042,1044],{"class":632,"line":709},[630,1031,637],{"class":636},[630,1033,641],{"class":640},[630,1035,645],{"class":644},[630,1037,654],{"class":640},[630,1039,657],{"class":636},[630,1041,660],{"class":640},[630,1043,664],{"class":663},[630,1045,667],{"class":640},[630,1047,1048],{"class":632,"line":730},[630,1049,757],{"emptyLinePlaceholder":756},[630,1051,1052,1054,1057,1059,1062,1064,1067,1069,1072,1074,1077,1079,1082,1084,1086],{"class":632,"line":753},[630,1053,942],{"class":636},[630,1055,1056],{"class":763}," const",[630,1058,641],{"class":640},[630,1060,1061],{"class":644}," withEvlog",[630,1063,648],{"class":640},[630,1065,1066],{"class":644}," useLogger",[630,1068,648],{"class":640},[630,1070,1071],{"class":644}," log",[630,1073,648],{"class":640},[630,1075,1076],{"class":644}," createError ",[630,1078,822],{"class":640},[630,1080,1081],{"class":640}," =",[630,1083,1016],{"class":776},[630,1085,799],{"class":644},[630,1087,1088],{"class":640},"{\n",[630,1090,1091,1094,1096,1098,1101,1103],{"class":632,"line":760},[630,1092,1093],{"class":810},"  service",[630,1095,814],{"class":640},[630,1097,660],{"class":640},[630,1099,1100],{"class":663},"my-app",[630,1102,851],{"class":640},[630,1104,1105],{"class":640},",\n",[630,1107,1108,1111,1113,1115,1118],{"class":632,"line":782},[630,1109,1110],{"class":810},"  drain",[630,1112,814],{"class":640},[630,1114,645],{"class":776},[630,1116,1117],{"class":644},"()",[630,1119,1105],{"class":640},[630,1121,1122,1124],{"class":632,"line":787},[630,1123,822],{"class":640},[630,1125,904],{"class":644},[620,1127,1129],{"className":622,"code":1128,"filename":260,"language":625,"meta":626,"style":626},"import { evlog } from 'evlog\u002Fexpress'\nimport { createMemoryDrain } from 'evlog\u002Fmemory'\n\napp.use(evlog({ drain: createMemoryDrain() }))\n",[555,1130,1131,1150,1168,1172],{"__ignoreMap":626},[630,1132,1133,1135,1137,1139,1141,1143,1145,1148],{"class":632,"line":633},[630,1134,637],{"class":636},[630,1136,641],{"class":640},[630,1138,716],{"class":644},[630,1140,654],{"class":640},[630,1142,657],{"class":636},[630,1144,660],{"class":640},[630,1146,1147],{"class":663},"evlog\u002Fexpress",[630,1149,667],{"class":640},[630,1151,1152,1154,1156,1158,1160,1162,1164,1166],{"class":632,"line":688},[630,1153,637],{"class":636},[630,1155,641],{"class":640},[630,1157,645],{"class":644},[630,1159,654],{"class":640},[630,1161,657],{"class":636},[630,1163,660],{"class":640},[630,1165,664],{"class":663},[630,1167,667],{"class":640},[630,1169,1170],{"class":632,"line":709},[630,1171,757],{"emptyLinePlaceholder":756},[630,1173,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198],{"class":632,"line":730},[630,1175,790],{"class":644},[630,1177,793],{"class":640},[630,1179,796],{"class":776},[630,1181,799],{"class":644},[630,1183,802],{"class":776},[630,1185,799],{"class":644},[630,1187,807],{"class":640},[630,1189,811],{"class":810},[630,1191,814],{"class":640},[630,1193,645],{"class":776},[630,1195,819],{"class":644},[630,1197,822],{"class":640},[630,1199,825],{"class":644},[620,1201,1203],{"className":622,"code":1202,"filename":270,"language":625,"meta":626,"style":626},"import { evlog } from 'evlog\u002Ffastify'\nimport { createMemoryDrain } from 'evlog\u002Fmemory'\n\nawait app.register(evlog, { drain: createMemoryDrain() })\n",[555,1204,1205,1224,1242,1246],{"__ignoreMap":626},[630,1206,1207,1209,1211,1213,1215,1217,1219,1222],{"class":632,"line":633},[630,1208,637],{"class":636},[630,1210,641],{"class":640},[630,1212,716],{"class":644},[630,1214,654],{"class":640},[630,1216,657],{"class":636},[630,1218,660],{"class":640},[630,1220,1221],{"class":663},"evlog\u002Ffastify",[630,1223,667],{"class":640},[630,1225,1226,1228,1230,1232,1234,1236,1238,1240],{"class":632,"line":688},[630,1227,637],{"class":636},[630,1229,641],{"class":640},[630,1231,645],{"class":644},[630,1233,654],{"class":640},[630,1235,657],{"class":636},[630,1237,660],{"class":640},[630,1239,664],{"class":663},[630,1241,667],{"class":640},[630,1243,1244],{"class":632,"line":709},[630,1245,757],{"emptyLinePlaceholder":756},[630,1247,1248,1251,1254,1256,1259,1262,1264,1266,1268,1270,1272,1274,1276],{"class":632,"line":730},[630,1249,1250],{"class":636},"await",[630,1252,1253],{"class":644}," app",[630,1255,793],{"class":640},[630,1257,1258],{"class":776},"register",[630,1260,1261],{"class":644},"(evlog",[630,1263,648],{"class":640},[630,1265,641],{"class":640},[630,1267,811],{"class":810},[630,1269,814],{"class":640},[630,1271,645],{"class":776},[630,1273,819],{"class":644},[630,1275,822],{"class":640},[630,1277,904],{"class":644},[620,1279,1281],{"className":622,"code":1280,"filename":275,"language":625,"meta":626,"style":626},"import { evlog } from 'evlog\u002Felysia'\nimport { createMemoryDrain } from 'evlog\u002Fmemory'\n\napp.use(evlog({ drain: createMemoryDrain() }))\n",[555,1282,1283,1302,1320,1324],{"__ignoreMap":626},[630,1284,1285,1287,1289,1291,1293,1295,1297,1300],{"class":632,"line":633},[630,1286,637],{"class":636},[630,1288,641],{"class":640},[630,1290,716],{"class":644},[630,1292,654],{"class":640},[630,1294,657],{"class":636},[630,1296,660],{"class":640},[630,1298,1299],{"class":663},"evlog\u002Felysia",[630,1301,667],{"class":640},[630,1303,1304,1306,1308,1310,1312,1314,1316,1318],{"class":632,"line":688},[630,1305,637],{"class":636},[630,1307,641],{"class":640},[630,1309,645],{"class":644},[630,1311,654],{"class":640},[630,1313,657],{"class":636},[630,1315,660],{"class":640},[630,1317,664],{"class":663},[630,1319,667],{"class":640},[630,1321,1322],{"class":632,"line":709},[630,1323,757],{"emptyLinePlaceholder":756},[630,1325,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350],{"class":632,"line":730},[630,1327,790],{"class":644},[630,1329,793],{"class":640},[630,1331,796],{"class":776},[630,1333,799],{"class":644},[630,1335,802],{"class":776},[630,1337,799],{"class":644},[630,1339,807],{"class":640},[630,1341,811],{"class":810},[630,1343,814],{"class":640},[630,1345,645],{"class":776},[630,1347,819],{"class":644},[630,1349,822],{"class":640},[630,1351,825],{"class":644},[620,1353,1355],{"className":622,"code":1354,"filename":255,"language":625,"meta":626,"style":626},"import { createMemoryDrain } from 'evlog\u002Fmemory'\n\nEvlogModule.forRoot({ drain: createMemoryDrain() })\n",[555,1356,1357,1375,1379],{"__ignoreMap":626},[630,1358,1359,1361,1363,1365,1367,1369,1371,1373],{"class":632,"line":633},[630,1360,637],{"class":636},[630,1362,641],{"class":640},[630,1364,645],{"class":644},[630,1366,654],{"class":640},[630,1368,657],{"class":636},[630,1370,660],{"class":640},[630,1372,664],{"class":663},[630,1374,667],{"class":640},[630,1376,1377],{"class":632,"line":688},[630,1378,757],{"emptyLinePlaceholder":756},[630,1380,1381,1384,1386,1389,1391,1393,1395,1397,1399,1401,1403],{"class":632,"line":709},[630,1382,1383],{"class":644},"EvlogModule",[630,1385,793],{"class":640},[630,1387,1388],{"class":776},"forRoot",[630,1390,799],{"class":644},[630,1392,807],{"class":640},[630,1394,811],{"class":810},[630,1396,814],{"class":640},[630,1398,645],{"class":776},[630,1400,819],{"class":644},[630,1402,822],{"class":640},[630,1404,904],{"class":644},[620,1406,1408],{"className":622,"code":1407,"filename":290,"language":625,"meta":626,"style":626},"import { createMemoryDrain } from 'evlog\u002Fmemory'\n\ninitLogger({ drain: createMemoryDrain() })\n",[555,1409,1410,1428,1432],{"__ignoreMap":626},[630,1411,1412,1414,1416,1418,1420,1422,1424,1426],{"class":632,"line":633},[630,1413,637],{"class":636},[630,1415,641],{"class":640},[630,1417,645],{"class":644},[630,1419,654],{"class":640},[630,1421,657],{"class":636},[630,1423,660],{"class":640},[630,1425,664],{"class":663},[630,1427,667],{"class":640},[630,1429,1430],{"class":632,"line":688},[630,1431,757],{"emptyLinePlaceholder":756},[630,1433,1434,1437,1439,1441,1443,1445,1447,1449,1451],{"class":632,"line":709},[630,1435,1436],{"class":776},"initLogger",[630,1438,799],{"class":644},[630,1440,807],{"class":640},[630,1442,811],{"class":810},[630,1444,814],{"class":640},[630,1446,645],{"class":776},[630,1448,819],{"class":644},[630,1450,822],{"class":640},[630,1452,904],{"class":644},[613,1454,1456],{"id":1455},"agent-access-via-http","Agent Access via HTTP",[541,1458,1459,1460,1463],{},"Expose a route so agents can retrieve structured logs during a local dev session. Use ",[555,1461,1462],{},"parseReadMemoryLogsQuery"," to let agents pass filter params directly as query strings:",[620,1465,1468],{"className":622,"code":1466,"filename":1467,"language":625,"meta":626,"style":626},"import { readMemoryLogs, parseReadMemoryLogsQuery } from 'evlog\u002Fmemory'\n\n\u002F\u002F Restrict to dev — agents hit this endpoint to retrieve logs\nif (process.env.NODE_ENV !== 'production') {\n  app.get('\u002F_evlog\u002Flogs', (c) => {\n    return c.json(readMemoryLogs(parseReadMemoryLogsQuery(c.req.query())))\n  })\n}\n","src\u002Findex.ts (Hono)",[555,1469,1470,1493,1497,1502,1535,1564,1600,1607],{"__ignoreMap":626},[630,1471,1472,1474,1476,1478,1480,1483,1485,1487,1489,1491],{"class":632,"line":633},[630,1473,637],{"class":636},[630,1475,641],{"class":640},[630,1477,651],{"class":644},[630,1479,648],{"class":640},[630,1481,1482],{"class":644}," parseReadMemoryLogsQuery",[630,1484,654],{"class":640},[630,1486,657],{"class":636},[630,1488,660],{"class":640},[630,1490,664],{"class":663},[630,1492,667],{"class":640},[630,1494,1495],{"class":632,"line":688},[630,1496,757],{"emptyLinePlaceholder":756},[630,1498,1499],{"class":632,"line":709},[630,1500,1501],{"class":684},"\u002F\u002F Restrict to dev — agents hit this endpoint to retrieve logs\n",[630,1503,1504,1507,1510,1512,1515,1517,1520,1523,1525,1528,1530,1533],{"class":632,"line":730},[630,1505,1506],{"class":636},"if",[630,1508,1509],{"class":644}," (process",[630,1511,793],{"class":640},[630,1513,1514],{"class":644},"env",[630,1516,793],{"class":640},[630,1518,1519],{"class":644},"NODE_ENV ",[630,1521,1522],{"class":640},"!==",[630,1524,660],{"class":640},[630,1526,1527],{"class":663},"production",[630,1529,851],{"class":640},[630,1531,1532],{"class":644},") ",[630,1534,1088],{"class":640},[630,1536,1537,1540,1542,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562],{"class":632,"line":753},[630,1538,1539],{"class":644},"  app",[630,1541,793],{"class":640},[630,1543,846],{"class":776},[630,1545,799],{"class":810},[630,1547,851],{"class":640},[630,1549,854],{"class":663},[630,1551,851],{"class":640},[630,1553,648],{"class":640},[630,1555,861],{"class":640},[630,1557,865],{"class":864},[630,1559,868],{"class":640},[630,1561,871],{"class":763},[630,1563,874],{"class":640},[630,1565,1566,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587,1589,1592,1594,1597],{"class":632,"line":760},[630,1567,1568],{"class":636},"    return",[630,1570,883],{"class":644},[630,1572,793],{"class":640},[630,1574,888],{"class":776},[630,1576,799],{"class":810},[630,1578,893],{"class":776},[630,1580,799],{"class":810},[630,1582,1462],{"class":776},[630,1584,799],{"class":810},[630,1586,865],{"class":644},[630,1588,793],{"class":640},[630,1590,1591],{"class":644},"req",[630,1593,793],{"class":640},[630,1595,1596],{"class":776},"query",[630,1598,1599],{"class":810},"())))\n",[630,1601,1602,1605],{"class":632,"line":782},[630,1603,1604],{"class":640},"  }",[630,1606,904],{"class":810},[630,1608,1609],{"class":632,"line":787},[630,1610,1611],{"class":640},"}\n",[541,1613,1614,1615,1618,1619,1621,1622,1625,1626,1625,1629,1625,1632,1635,1636,793],{},"An agent can now call ",[555,1616,1617],{},"\u002F_evlog\u002Flogs?level=error&limit=50&since=2026-01-01T00:00:00Z"," and the query params are coerced to the correct types before being passed to ",[555,1620,893],{},". Supported query params: ",[555,1623,1624],{},"store",", ",[555,1627,1628],{},"since",[555,1630,1631],{},"until",[555,1633,1634],{},"level"," (comma-separated for multiple), ",[555,1637,1638],{},"limit",[541,1640,1641,1642,1647],{},"The response is a JSON array of ",[545,1643,1644],{"href":505},[555,1645,1646],{},"WideEvent"," objects — the same shape used by every other evlog adapter.",[613,1649,504],{"id":1650},"configuration",[1652,1653,336],"h3",{"id":1654},"options",[1656,1657,1658,1677],"table",{},[1659,1660,1661],"thead",{},[1662,1663,1664,1668,1671,1674],"tr",{},[1665,1666,1667],"th",{},"Option",[1665,1669,1670],{},"Type",[1665,1672,1673],{},"Default",[1665,1675,1676],{},"Description",[1678,1679,1680,1701],"tbody",{},[1662,1681,1682,1688,1693,1698],{},[1683,1684,1685],"td",{},[555,1686,1687],{},"maxEvents",[1683,1689,1690],{},[555,1691,1692],{},"number",[1683,1694,1695],{},[555,1696,1697],{},"1000",[1683,1699,1700],{},"Maximum events to keep in the ring buffer (oldest are dropped)",[1662,1702,1703,1707,1712,1717],{},[1683,1704,1705],{},[555,1706,1624],{},[1683,1708,1709],{},[555,1710,1711],{},"string",[1683,1713,1714],{},[555,1715,1716],{},"'default'",[1683,1718,1719],{},"Named buffer key — multiple drains sharing the same key share the same buffer",[620,1721,1724],{"className":622,"code":1722,"filename":1723,"language":625,"meta":626,"style":626},"\u002F\u002F Keep only the last 500 events\ncreateMemoryDrain({ maxEvents: 500 })\n\n\u002F\u002F Use a named store for isolation\ncreateMemoryDrain({ store: 'my-service' })\n","server\u002Fplugins\u002Fevlog-drain.ts",[555,1725,1726,1731,1753,1757,1762],{"__ignoreMap":626},[630,1727,1728],{"class":632,"line":633},[630,1729,1730],{"class":684},"\u002F\u002F Keep only the last 500 events\n",[630,1732,1733,1736,1738,1740,1743,1745,1749,1751],{"class":632,"line":688},[630,1734,1735],{"class":776},"createMemoryDrain",[630,1737,799],{"class":644},[630,1739,807],{"class":640},[630,1741,1742],{"class":810}," maxEvents",[630,1744,814],{"class":640},[630,1746,1748],{"class":1747},"sbssI"," 500",[630,1750,654],{"class":640},[630,1752,904],{"class":644},[630,1754,1755],{"class":632,"line":709},[630,1756,757],{"emptyLinePlaceholder":756},[630,1758,1759],{"class":632,"line":730},[630,1760,1761],{"class":684},"\u002F\u002F Use a named store for isolation\n",[630,1763,1764,1766,1768,1770,1773,1775,1777,1780,1782,1784],{"class":632,"line":753},[630,1765,1735],{"class":776},[630,1767,799],{"class":644},[630,1769,807],{"class":640},[630,1771,1772],{"class":810}," store",[630,1774,814],{"class":640},[630,1776,660],{"class":640},[630,1778,1779],{"class":663},"my-service",[630,1781,851],{"class":640},[630,1783,654],{"class":640},[630,1785,904],{"class":644},[1652,1787,1789],{"id":1788},"environment-variables","Environment Variables",[1656,1791,1792,1801],{},[1659,1793,1794],{},[1662,1795,1796,1799],{},[1665,1797,1798],{},"Variable",[1665,1800,1676],{},[1678,1802,1803,1815],{},[1662,1804,1805,1810],{},[1683,1806,1807],{},[555,1808,1809],{},"EVLOG_MEMORY_STORE",[1683,1811,1812,1813,868],{},"Named buffer key (default: ",[555,1814,1716],{},[1662,1816,1817,1822],{},[1683,1818,1819],{},[555,1820,1821],{},"EVLOG_MEMORY_MAX_EVENTS",[1683,1823,1824,1825,868],{},"Ring buffer size (default: ",[555,1826,1697],{},[541,1828,1829,1830,1833],{},"Configuration priority matches other adapters: overrides → ",[555,1831,1832],{},"runtimeConfig.evlog.memory"," → env vars.",[1652,1835,1837],{"id":1836},"named-stores","Named Stores",[541,1839,1840],{},"Use named stores to isolate events from different services or for testing:",[620,1842,1844],{"className":622,"code":1843,"filename":624,"language":625,"meta":626,"style":626},"import { createMemoryDrain, readMemoryLogs, clearMemoryLogs } from 'evlog\u002Fmemory'\n\n\u002F\u002F Two separate buffers\nconst authDrain = createMemoryDrain({ store: 'auth' })\nconst apiDrain = createMemoryDrain({ store: 'api' })\n\n\u002F\u002F Read from a specific store\nconst authErrors = readMemoryLogs({ store: 'auth', level: 'error' })\n\n\u002F\u002F Clear a store (useful in tests)\nclearMemoryLogs('auth')\n",[555,1845,1846,1873,1877,1882,1912,1942,1946,1951,1994,1998,2003],{"__ignoreMap":626},[630,1847,1848,1850,1852,1854,1856,1858,1860,1863,1865,1867,1869,1871],{"class":632,"line":633},[630,1849,637],{"class":636},[630,1851,641],{"class":640},[630,1853,645],{"class":644},[630,1855,648],{"class":640},[630,1857,651],{"class":644},[630,1859,648],{"class":640},[630,1861,1862],{"class":644}," clearMemoryLogs",[630,1864,654],{"class":640},[630,1866,657],{"class":636},[630,1868,660],{"class":640},[630,1870,664],{"class":663},[630,1872,667],{"class":640},[630,1874,1875],{"class":632,"line":688},[630,1876,757],{"emptyLinePlaceholder":756},[630,1878,1879],{"class":632,"line":709},[630,1880,1881],{"class":684},"\u002F\u002F Two separate buffers\n",[630,1883,1884,1886,1889,1891,1893,1895,1897,1899,1901,1903,1906,1908,1910],{"class":632,"line":730},[630,1885,764],{"class":763},[630,1887,1888],{"class":644}," authDrain ",[630,1890,770],{"class":640},[630,1892,645],{"class":776},[630,1894,799],{"class":644},[630,1896,807],{"class":640},[630,1898,1772],{"class":810},[630,1900,814],{"class":640},[630,1902,660],{"class":640},[630,1904,1905],{"class":663},"auth",[630,1907,851],{"class":640},[630,1909,654],{"class":640},[630,1911,904],{"class":644},[630,1913,1914,1916,1919,1921,1923,1925,1927,1929,1931,1933,1936,1938,1940],{"class":632,"line":753},[630,1915,764],{"class":763},[630,1917,1918],{"class":644}," apiDrain ",[630,1920,770],{"class":640},[630,1922,645],{"class":776},[630,1924,799],{"class":644},[630,1926,807],{"class":640},[630,1928,1772],{"class":810},[630,1930,814],{"class":640},[630,1932,660],{"class":640},[630,1934,1935],{"class":663},"api",[630,1937,851],{"class":640},[630,1939,654],{"class":640},[630,1941,904],{"class":644},[630,1943,1944],{"class":632,"line":760},[630,1945,757],{"emptyLinePlaceholder":756},[630,1947,1948],{"class":632,"line":782},[630,1949,1950],{"class":684},"\u002F\u002F Read from a specific store\n",[630,1952,1953,1955,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1981,1983,1985,1988,1990,1992],{"class":632,"line":787},[630,1954,764],{"class":763},[630,1956,1957],{"class":644}," authErrors ",[630,1959,770],{"class":640},[630,1961,651],{"class":776},[630,1963,799],{"class":644},[630,1965,807],{"class":640},[630,1967,1772],{"class":810},[630,1969,814],{"class":640},[630,1971,660],{"class":640},[630,1973,1905],{"class":663},[630,1975,851],{"class":640},[630,1977,648],{"class":640},[630,1979,1980],{"class":810}," level",[630,1982,814],{"class":640},[630,1984,660],{"class":640},[630,1986,1987],{"class":663},"error",[630,1989,851],{"class":640},[630,1991,654],{"class":640},[630,1993,904],{"class":644},[630,1995,1996],{"class":632,"line":828},[630,1997,757],{"emptyLinePlaceholder":756},[630,1999,2000],{"class":632,"line":833},[630,2001,2002],{"class":684},"\u002F\u002F Clear a store (useful in tests)\n",[630,2004,2005,2008,2010,2012,2014,2016],{"class":632,"line":839},[630,2006,2007],{"class":776},"clearMemoryLogs",[630,2009,799],{"class":644},[630,2011,851],{"class":640},[630,2013,1905],{"class":663},[630,2015,851],{"class":640},[630,2017,904],{"class":644},[613,2019,2021],{"id":2020},"querying","Querying",[541,2023,2024,2026,2027,814],{},[555,2025,893],{}," supports the same filtering options as ",[555,2028,2029],{},"readFsLogs",[620,2031,2033],{"className":622,"code":2032,"filename":624,"language":625,"meta":626,"style":626},"import { readMemoryLogs } from 'evlog\u002Fmemory'\n\n\u002F\u002F All events\nconst all = readMemoryLogs()\n\n\u002F\u002F Errors only\nconst errors = readMemoryLogs({ level: 'error' })\n\n\u002F\u002F Last 10 minutes\nconst recent = readMemoryLogs({\n  since: new Date(Date.now() - 10 * 60 * 1000),\n})\n\n\u002F\u002F Custom predicate\nconst slow = readMemoryLogs({\n  filter: e => (e.durationMs ?? 0) > 1000,\n})\n\n\u002F\u002F Most recent 50 events\nconst latest = readMemoryLogs({ limit: 50 })\n",[555,2034,2035,2053,2057,2062,2075,2079,2084,2113,2117,2122,2137,2180,2186,2190,2196,2212,2248,2255,2260,2266],{"__ignoreMap":626},[630,2036,2037,2039,2041,2043,2045,2047,2049,2051],{"class":632,"line":633},[630,2038,637],{"class":636},[630,2040,641],{"class":640},[630,2042,651],{"class":644},[630,2044,654],{"class":640},[630,2046,657],{"class":636},[630,2048,660],{"class":640},[630,2050,664],{"class":663},[630,2052,667],{"class":640},[630,2054,2055],{"class":632,"line":688},[630,2056,757],{"emptyLinePlaceholder":756},[630,2058,2059],{"class":632,"line":709},[630,2060,2061],{"class":684},"\u002F\u002F All events\n",[630,2063,2064,2066,2069,2071,2073],{"class":632,"line":730},[630,2065,764],{"class":763},[630,2067,2068],{"class":644}," all ",[630,2070,770],{"class":640},[630,2072,651],{"class":776},[630,2074,779],{"class":644},[630,2076,2077],{"class":632,"line":753},[630,2078,757],{"emptyLinePlaceholder":756},[630,2080,2081],{"class":632,"line":760},[630,2082,2083],{"class":684},"\u002F\u002F Errors only\n",[630,2085,2086,2088,2091,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111],{"class":632,"line":782},[630,2087,764],{"class":763},[630,2089,2090],{"class":644}," errors ",[630,2092,770],{"class":640},[630,2094,651],{"class":776},[630,2096,799],{"class":644},[630,2098,807],{"class":640},[630,2100,1980],{"class":810},[630,2102,814],{"class":640},[630,2104,660],{"class":640},[630,2106,1987],{"class":663},[630,2108,851],{"class":640},[630,2110,654],{"class":640},[630,2112,904],{"class":644},[630,2114,2115],{"class":632,"line":787},[630,2116,757],{"emptyLinePlaceholder":756},[630,2118,2119],{"class":632,"line":828},[630,2120,2121],{"class":684},"\u002F\u002F Last 10 minutes\n",[630,2123,2124,2126,2129,2131,2133,2135],{"class":632,"line":833},[630,2125,764],{"class":763},[630,2127,2128],{"class":644}," recent ",[630,2130,770],{"class":640},[630,2132,651],{"class":776},[630,2134,799],{"class":644},[630,2136,1088],{"class":640},[630,2138,2139,2142,2144,2146,2149,2152,2154,2157,2159,2162,2165,2168,2171,2173,2176,2178],{"class":632,"line":839},[630,2140,2141],{"class":810},"  since",[630,2143,814],{"class":640},[630,2145,773],{"class":640},[630,2147,2148],{"class":776}," Date",[630,2150,2151],{"class":644},"(Date",[630,2153,793],{"class":640},[630,2155,2156],{"class":776},"now",[630,2158,819],{"class":644},[630,2160,2161],{"class":640},"-",[630,2163,2164],{"class":1747}," 10",[630,2166,2167],{"class":640}," *",[630,2169,2170],{"class":1747}," 60",[630,2172,2167],{"class":640},[630,2174,2175],{"class":1747}," 1000",[630,2177,868],{"class":644},[630,2179,1105],{"class":640},[630,2181,2182,2184],{"class":632,"line":877},[630,2183,822],{"class":640},[630,2185,904],{"class":644},[630,2187,2188],{"class":632,"line":899},[630,2189,757],{"emptyLinePlaceholder":756},[630,2191,2193],{"class":632,"line":2192},14,[630,2194,2195],{"class":684},"\u002F\u002F Custom predicate\n",[630,2197,2199,2201,2204,2206,2208,2210],{"class":632,"line":2198},15,[630,2200,764],{"class":763},[630,2202,2203],{"class":644}," slow ",[630,2205,770],{"class":640},[630,2207,651],{"class":776},[630,2209,799],{"class":644},[630,2211,1088],{"class":640},[630,2213,2215,2218,2220,2223,2225,2228,2230,2233,2236,2239,2241,2244,2246],{"class":632,"line":2214},16,[630,2216,2217],{"class":776},"  filter",[630,2219,814],{"class":640},[630,2221,2222],{"class":864}," e",[630,2224,871],{"class":763},[630,2226,2227],{"class":644}," (e",[630,2229,793],{"class":640},[630,2231,2232],{"class":644},"durationMs ",[630,2234,2235],{"class":640},"??",[630,2237,2238],{"class":1747}," 0",[630,2240,1532],{"class":644},[630,2242,2243],{"class":640},">",[630,2245,2175],{"class":1747},[630,2247,1105],{"class":640},[630,2249,2251,2253],{"class":632,"line":2250},17,[630,2252,822],{"class":640},[630,2254,904],{"class":644},[630,2256,2258],{"class":632,"line":2257},18,[630,2259,757],{"emptyLinePlaceholder":756},[630,2261,2263],{"class":632,"line":2262},19,[630,2264,2265],{"class":684},"\u002F\u002F Most recent 50 events\n",[630,2267,2269,2271,2274,2276,2278,2280,2282,2285,2287,2290,2292],{"class":632,"line":2268},20,[630,2270,764],{"class":763},[630,2272,2273],{"class":644}," latest ",[630,2275,770],{"class":640},[630,2277,651],{"class":776},[630,2279,799],{"class":644},[630,2281,807],{"class":640},[630,2283,2284],{"class":810}," limit",[630,2286,814],{"class":640},[630,2288,2289],{"class":1747}," 50",[630,2291,654],{"class":640},[630,2293,904],{"class":644},[1652,2295,2297,2299],{"id":2296},"readmemorylogs-options",[555,2298,893],{}," Options",[1656,2301,2302,2312],{},[1659,2303,2304],{},[1662,2305,2306,2308,2310],{},[1665,2307,1667],{},[1665,2309,1670],{},[1665,2311,1676],{},[1678,2313,2314,2329,2346,2361,2375,2390],{},[1662,2315,2316,2320,2324],{},[1683,2317,2318],{},[555,2319,1624],{},[1683,2321,2322],{},[555,2323,1711],{},[1683,2325,2326,2327,868],{},"Named store to read from (default: ",[555,2328,1716],{},[1662,2330,2331,2335,2340],{},[1683,2332,2333],{},[555,2334,1628],{},[1683,2336,2337],{},[555,2338,2339],{},"Date | string",[1683,2341,2342,2343],{},"Only events with ",[555,2344,2345],{},"timestamp >= since",[1662,2347,2348,2352,2356],{},[1683,2349,2350],{},[555,2351,1631],{},[1683,2353,2354],{},[555,2355,2339],{},[1683,2357,2342,2358],{},[555,2359,2360],{},"timestamp \u003C= until",[1662,2362,2363,2367,2372],{},[1683,2364,2365],{},[555,2366,1634],{},[1683,2368,2369],{},[555,2370,2371],{},"LogLevel | LogLevel[]",[1683,2373,2374],{},"Filter by level",[1662,2376,2377,2382,2387],{},[1683,2378,2379],{},[555,2380,2381],{},"filter",[1683,2383,2384],{},[555,2385,2386],{},"(event) => boolean",[1683,2388,2389],{},"Custom predicate",[1662,2391,2392,2396,2400],{},[1683,2393,2394],{},[555,2395,1638],{},[1683,2397,2398],{},[555,2399,1692],{},[1683,2401,2402],{},"Return at most N most-recent matching events",[613,2404,2406],{"id":2405},"combining-with-network-drains","Combining with Network Drains",[541,2408,2409],{},"Use the memory adapter locally while sending to an observability platform in production:",[620,2411,2413],{"className":622,"code":2412,"filename":1723,"language":625,"meta":626,"style":626},"import { createMemoryDrain } from 'evlog\u002Fmemory'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst memory = createMemoryDrain()\nconst axiom = createAxiomDrain()\n\nconst drain = async (ctx) => {\n  if (process.env.NODE_ENV === 'development') {\n    await memory(ctx)\n  } else {\n    await axiom(ctx)\n  }\n}\n",[555,2414,2415,2433,2453,2457,2470,2483,2487,2510,2543,2557,2566,2579,2584],{"__ignoreMap":626},[630,2416,2417,2419,2421,2423,2425,2427,2429,2431],{"class":632,"line":633},[630,2418,637],{"class":636},[630,2420,641],{"class":640},[630,2422,645],{"class":644},[630,2424,654],{"class":640},[630,2426,657],{"class":636},[630,2428,660],{"class":640},[630,2430,664],{"class":663},[630,2432,667],{"class":640},[630,2434,2435,2437,2439,2442,2444,2446,2448,2451],{"class":632,"line":688},[630,2436,637],{"class":636},[630,2438,641],{"class":640},[630,2440,2441],{"class":644}," createAxiomDrain",[630,2443,654],{"class":640},[630,2445,657],{"class":636},[630,2447,660],{"class":640},[630,2449,2450],{"class":663},"evlog\u002Faxiom",[630,2452,667],{"class":640},[630,2454,2455],{"class":632,"line":709},[630,2456,757],{"emptyLinePlaceholder":756},[630,2458,2459,2461,2464,2466,2468],{"class":632,"line":730},[630,2460,764],{"class":763},[630,2462,2463],{"class":644}," memory ",[630,2465,770],{"class":640},[630,2467,645],{"class":776},[630,2469,779],{"class":644},[630,2471,2472,2474,2477,2479,2481],{"class":632,"line":753},[630,2473,764],{"class":763},[630,2475,2476],{"class":644}," axiom ",[630,2478,770],{"class":640},[630,2480,2441],{"class":776},[630,2482,779],{"class":644},[630,2484,2485],{"class":632,"line":760},[630,2486,757],{"emptyLinePlaceholder":756},[630,2488,2489,2491,2494,2496,2499,2501,2504,2506,2508],{"class":632,"line":782},[630,2490,764],{"class":763},[630,2492,2493],{"class":644}," drain ",[630,2495,770],{"class":640},[630,2497,2498],{"class":763}," async",[630,2500,861],{"class":640},[630,2502,2503],{"class":864},"ctx",[630,2505,868],{"class":640},[630,2507,871],{"class":763},[630,2509,874],{"class":640},[630,2511,2512,2515,2517,2520,2522,2524,2526,2529,2532,2534,2537,2539,2541],{"class":632,"line":787},[630,2513,2514],{"class":636},"  if",[630,2516,861],{"class":810},[630,2518,2519],{"class":644},"process",[630,2521,793],{"class":640},[630,2523,1514],{"class":644},[630,2525,793],{"class":640},[630,2527,2528],{"class":644},"NODE_ENV",[630,2530,2531],{"class":640}," ===",[630,2533,660],{"class":640},[630,2535,2536],{"class":663},"development",[630,2538,851],{"class":640},[630,2540,1532],{"class":810},[630,2542,1088],{"class":640},[630,2544,2545,2548,2551,2553,2555],{"class":632,"line":828},[630,2546,2547],{"class":636},"    await",[630,2549,2550],{"class":776}," memory",[630,2552,799],{"class":810},[630,2554,2503],{"class":644},[630,2556,904],{"class":810},[630,2558,2559,2561,2564],{"class":632,"line":833},[630,2560,1604],{"class":640},[630,2562,2563],{"class":636}," else",[630,2565,874],{"class":640},[630,2567,2568,2570,2573,2575,2577],{"class":632,"line":839},[630,2569,2547],{"class":636},[630,2571,2572],{"class":776}," axiom",[630,2574,799],{"class":810},[630,2576,2503],{"class":644},[630,2578,904],{"class":810},[630,2580,2581],{"class":632,"line":877},[630,2582,2583],{"class":640},"  }\n",[630,2585,2586],{"class":632,"line":899},[630,2587,1611],{"class":640},[613,2589,2591],{"id":2590},"ring-buffer-behaviour","Ring Buffer Behaviour",[541,2593,2594,2595,2598,2599,2601],{},"The buffer is ",[550,2596,2597],{},"bounded",": once it reaches ",[555,2600,1687],{},", the oldest events are discarded to make room for incoming ones. This means memory usage stays constant regardless of how long the service runs.",[620,2603,2609],{"className":2604,"code":2606,"filename":2607,"language":2608,"meta":626},[2605],"language-text","Write events 1–5 → [1, 2, 3, 4, 5]\nWrite event  6   → [2, 3, 4, 5, 6]  (1 is dropped)\nWrite events 7–8 → [4, 5, 6, 7, 8]\n","Ring buffer (maxEvents: 5)","text",[555,2610,2606],{"__ignoreMap":626},[2612,2613,2616,2617,2619,2620,793],"callout",{"color":2614,"icon":2615},"warning","i-lucide-triangle-alert","The in-memory buffer is lost when the worker\u002Fprocess restarts. For persistent storage, use the ",[545,2618,547],{"href":207}," (Node-based runtimes) or ",[545,2621,211],{"href":212},[613,2623,2625],{"id":2624},"direct-api-usage","Direct API Usage",[541,2627,2628],{},"For advanced use cases, call the underlying helpers directly:",[620,2630,2632],{"className":622,"code":2631,"filename":624,"language":625,"meta":626,"style":626},"import { writeToMemory, readMemoryLogs, clearMemoryLogs, parseReadMemoryLogsQuery } from 'evlog\u002Fmemory'\n\n\u002F\u002F Write events directly (skips the drain pipeline)\nwriteToMemory([event], { store: 'default', maxEvents: 1000 })\n\n\u002F\u002F Read the current buffer\nconst events = readMemoryLogs()\n\n\u002F\u002F Parse HTTP query params into ReadMemoryLogsOptions\nconst opts = parseReadMemoryLogsQuery({ level: 'error', limit: '50' })\n\u002F\u002F → { level: 'error', limit: 50 }\n\n\u002F\u002F Reset for tests\nclearMemoryLogs()\n",[555,2633,2634,2665,2669,2674,2709,2713,2718,2731,2735,2740,2782,2787,2791,2796],{"__ignoreMap":626},[630,2635,2636,2638,2640,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661,2663],{"class":632,"line":633},[630,2637,637],{"class":636},[630,2639,641],{"class":640},[630,2641,2642],{"class":644}," writeToMemory",[630,2644,648],{"class":640},[630,2646,651],{"class":644},[630,2648,648],{"class":640},[630,2650,1862],{"class":644},[630,2652,648],{"class":640},[630,2654,1482],{"class":644},[630,2656,654],{"class":640},[630,2658,657],{"class":636},[630,2660,660],{"class":640},[630,2662,664],{"class":663},[630,2664,667],{"class":640},[630,2666,2667],{"class":632,"line":688},[630,2668,757],{"emptyLinePlaceholder":756},[630,2670,2671],{"class":632,"line":709},[630,2672,2673],{"class":684},"\u002F\u002F Write events directly (skips the drain pipeline)\n",[630,2675,2676,2679,2682,2684,2686,2688,2690,2692,2695,2697,2699,2701,2703,2705,2707],{"class":632,"line":730},[630,2677,2678],{"class":776},"writeToMemory",[630,2680,2681],{"class":644},"([event]",[630,2683,648],{"class":640},[630,2685,641],{"class":640},[630,2687,1772],{"class":810},[630,2689,814],{"class":640},[630,2691,660],{"class":640},[630,2693,2694],{"class":663},"default",[630,2696,851],{"class":640},[630,2698,648],{"class":640},[630,2700,1742],{"class":810},[630,2702,814],{"class":640},[630,2704,2175],{"class":1747},[630,2706,654],{"class":640},[630,2708,904],{"class":644},[630,2710,2711],{"class":632,"line":753},[630,2712,757],{"emptyLinePlaceholder":756},[630,2714,2715],{"class":632,"line":760},[630,2716,2717],{"class":684},"\u002F\u002F Read the current buffer\n",[630,2719,2720,2722,2725,2727,2729],{"class":632,"line":782},[630,2721,764],{"class":763},[630,2723,2724],{"class":644}," events ",[630,2726,770],{"class":640},[630,2728,651],{"class":776},[630,2730,779],{"class":644},[630,2732,2733],{"class":632,"line":787},[630,2734,757],{"emptyLinePlaceholder":756},[630,2736,2737],{"class":632,"line":828},[630,2738,2739],{"class":684},"\u002F\u002F Parse HTTP query params into ReadMemoryLogsOptions\n",[630,2741,2742,2744,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2776,2778,2780],{"class":632,"line":833},[630,2743,764],{"class":763},[630,2745,2746],{"class":644}," opts ",[630,2748,770],{"class":640},[630,2750,1482],{"class":776},[630,2752,799],{"class":644},[630,2754,807],{"class":640},[630,2756,1980],{"class":810},[630,2758,814],{"class":640},[630,2760,660],{"class":640},[630,2762,1987],{"class":663},[630,2764,851],{"class":640},[630,2766,648],{"class":640},[630,2768,2284],{"class":810},[630,2770,814],{"class":640},[630,2772,660],{"class":640},[630,2774,2775],{"class":663},"50",[630,2777,851],{"class":640},[630,2779,654],{"class":640},[630,2781,904],{"class":644},[630,2783,2784],{"class":632,"line":839},[630,2785,2786],{"class":684},"\u002F\u002F → { level: 'error', limit: 50 }\n",[630,2788,2789],{"class":632,"line":877},[630,2790,757],{"emptyLinePlaceholder":756},[630,2792,2793],{"class":632,"line":899},[630,2794,2795],{"class":684},"\u002F\u002F Reset for tests\n",[630,2797,2798,2800],{"class":632,"line":2192},[630,2799,2007],{"class":776},[630,2801,779],{"class":644},[1652,2803,2805,2807],{"id":2804},"parsereadmemorylogsquery-coercion-rules",[555,2806,1462],{}," coercion rules",[1656,2809,2810,2826],{},[1659,2811,2812],{},[1662,2813,2814,2817,2823],{},[1665,2815,2816],{},"Query param",[1665,2818,2819,2820],{},"Type in ",[555,2821,2822],{},"ReadMemoryLogsOptions",[1665,2824,2825],{},"Notes",[1678,2827,2828,2841,2856,2870,2887],{},[1662,2829,2830,2834,2838],{},[1683,2831,2832],{},[555,2833,1624],{},[1683,2835,2836],{},[555,2837,1711],{},[1683,2839,2840],{},"Passed through as-is",[1662,2842,2843,2847,2851],{},[1683,2844,2845],{},[555,2846,1628],{},[1683,2848,2849],{},[555,2850,1711],{},[1683,2852,2853,2854],{},"ISO 8601 string — parsed by ",[555,2855,893],{},[1662,2857,2858,2862,2866],{},[1683,2859,2860],{},[555,2861,1631],{},[1683,2863,2864],{},[555,2865,1711],{},[1683,2867,2853,2868],{},[555,2869,893],{},[1662,2871,2872,2876,2880],{},[1683,2873,2874],{},[555,2875,1634],{},[1683,2877,2878],{},[555,2879,2371],{},[1683,2881,2882,2883,2886],{},"Comma-separated (",[555,2884,2885],{},"error,warn",") or repeated array; invalid values are dropped",[1662,2888,2889,2893,2897],{},[1683,2890,2891],{},[555,2892,1638],{},[1683,2894,2895],{},[555,2896,1692],{},[1683,2898,2899,2902],{},[555,2900,2901],{},"parseInt","; NaN → omitted",[613,2904,2906],{"id":2905},"next-steps","Next Steps",[2908,2909,2910,2916,2922,2928],"ul",{},[578,2911,2912,2915],{},[545,2913,2914],{"href":207},"File System Adapter"," - Persistent local logs for Node-based runtimes",[578,2917,2918,2921],{},[545,2919,2920],{"href":212},"NuxtHub Adapter"," - Database-backed storage for Cloudflare D1",[578,2923,2924,2927],{},[545,2925,2926],{"href":496},"Pipeline"," - Add batching and retry to any drain",[578,2929,2930,2933],{},[545,2931,2932],{"href":491},"Custom Adapters"," - Build your own adapter",[2935,2936,2937],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":626,"searchDepth":688,"depth":688,"links":2939},[2940,2941,2942,2943,2948,2952,2953,2954,2958],{"id":615,"depth":688,"text":20},{"id":670,"depth":688,"text":25},{"id":1455,"depth":688,"text":1456},{"id":1650,"depth":688,"text":504,"children":2944},[2945,2946,2947],{"id":1654,"depth":709,"text":336},{"id":1788,"depth":709,"text":1789},{"id":1836,"depth":709,"text":1837},{"id":2020,"depth":688,"text":2021,"children":2949},[2950],{"id":2296,"depth":709,"text":2951},"readMemoryLogs Options",{"id":2405,"depth":688,"text":2406},{"id":2590,"depth":688,"text":2591},{"id":2624,"depth":688,"text":2625,"children":2955},[2956],{"id":2804,"depth":709,"text":2957},"parseReadMemoryLogsQuery coercion rules",{"id":2905,"depth":688,"text":2906},"Store wide events in an in-memory ring buffer. Works in any runtime — including Cloudflare Workers (workerd) — where the file system is unavailable.","md",[2962,2965],{"label":2914,"icon":209,"to":207,"color":2963,"variant":2964},"neutral","subtle",{"label":2966,"icon":28,"to":266,"color":2963,"variant":2964},"Hono Integration",{},{"title":216,"icon":219},{"title":536,"description":2959},"xL4sb8yTARpaSqUawzDlvjJwpdk4BeSEERuZtcjkju8",[2972,2974],{"title":211,"path":212,"stem":213,"description":2973,"icon":214,"children":-1},"Self-hosted log retention for evlog using NuxtHub database storage. Store, query, and automatically clean up your structured logs with zero external dependencies.",{"title":36,"path":226,"stem":227,"description":2975,"icon":228,"children":-1},"evlog supports every major TypeScript framework. Choose your stack and get started in minutes.",1786743660202]