[{"data":1,"prerenderedAt":2214},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-self-hosted-fs":567,"-integrate-adapters-self-hosted-fs-surround":2209},[4,30,80,133,313,444,503,542],{"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,128],{"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,"icon":132},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":134,"path":135,"stem":136,"children":137,"page":29},"Integrate","\u002Fintegrate","4.integrate",[138,142,225],{"title":36,"path":139,"stem":140,"icon":141},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":143,"path":144,"stem":145,"children":146,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[147,150,180,205],{"title":36,"path":148,"stem":149,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":151,"path":152,"stem":153,"children":154,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[155,160,165,170,175],{"title":156,"path":157,"stem":158,"icon":159},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":161,"path":162,"stem":163,"icon":164},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":166,"path":167,"stem":168,"icon":169},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":171,"path":172,"stem":173,"icon":174},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":176,"path":177,"stem":178,"icon":179},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":181,"path":182,"stem":183,"children":184,"page":29},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[185,190,195,200],{"title":186,"path":187,"stem":188,"icon":189},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":191,"path":192,"stem":193,"icon":194},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":196,"path":197,"stem":198,"icon":199},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":201,"path":202,"stem":203,"icon":204},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":206,"path":207,"stem":208,"children":209,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[210,215,220],{"title":211,"path":212,"stem":213,"icon":214},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":216,"path":217,"stem":218,"icon":219},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":221,"path":222,"stem":223,"icon":224},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":226,"path":227,"stem":228,"children":229,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[230,234,239,244,249,254,259,264,269,274,279,284,289,294,298,303,308],{"title":36,"path":231,"stem":232,"icon":233},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":235,"path":236,"stem":237,"icon":238},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":240,"path":241,"stem":242,"icon":243},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":245,"path":246,"stem":247,"icon":248},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":250,"path":251,"stem":252,"icon":253},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":255,"path":256,"stem":257,"icon":258},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":260,"path":261,"stem":262,"icon":263},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":265,"path":266,"stem":267,"icon":268},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":270,"path":271,"stem":272,"icon":273},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":275,"path":276,"stem":277,"icon":278},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":280,"path":281,"stem":282,"icon":283},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":285,"path":286,"stem":287,"icon":288},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":290,"path":291,"stem":292,"icon":293},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":295,"path":296,"stem":297,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":299,"path":300,"stem":301,"icon":302},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":304,"path":305,"stem":306,"icon":307},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":309,"path":310,"stem":311,"icon":312},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":314,"path":315,"stem":316,"children":317,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[318,321,326,354,381,413,434,439],{"title":36,"path":319,"stem":320,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":322,"path":323,"stem":324,"icon":325},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":327,"icon":328,"path":329,"stem":330,"children":331,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[332,335,340,345,350],{"title":36,"path":333,"stem":334,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":336,"path":337,"stem":338,"icon":339},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":341,"path":342,"stem":343,"icon":344},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":346,"path":347,"stem":348,"icon":349},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":351,"path":352,"stem":353,"icon":132},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":355,"icon":356,"path":357,"stem":358,"children":359,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[360,363,368,373,377],{"title":36,"path":361,"stem":362,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":364,"path":365,"stem":366,"icon":367},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":369,"path":370,"stem":371,"icon":372},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":374,"path":375,"stem":376,"icon":325},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":378,"path":379,"stem":380,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":382,"icon":383,"path":384,"stem":385,"children":386,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[387,390,395,400,405,409],{"title":36,"path":388,"stem":389,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":391,"path":392,"stem":393,"icon":394},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":396,"path":397,"stem":398,"icon":399},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":401,"path":402,"stem":403,"icon":404},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":406,"path":407,"stem":408,"icon":383},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":410,"path":411,"stem":412,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":351,"icon":107,"path":414,"stem":415,"children":416,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[417,420,425,430],{"title":36,"path":418,"stem":419,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":421,"path":422,"stem":423,"icon":424},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":426,"path":427,"stem":428,"icon":429},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":431,"path":432,"stem":433,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":435,"path":436,"stem":437,"icon":438},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":440,"path":441,"stem":442,"icon":443},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":445,"path":446,"stem":447,"children":448,"page":29},"Extend","\u002Fextend","6.extend",[449,453,458,463,467,472,476,480,484,488,493,498],{"title":36,"path":450,"stem":451,"icon":452},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":454,"path":455,"stem":456,"icon":457},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":459,"path":460,"stem":461,"icon":462},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":464,"path":465,"stem":466,"icon":457},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":468,"path":469,"stem":470,"icon":471},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":410,"path":473,"stem":474,"icon":475},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":477,"path":478,"stem":479,"icon":452},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":481,"path":482,"stem":483,"icon":438},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":485,"path":486,"stem":487,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":489,"path":490,"stem":491,"icon":492},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":494,"path":495,"stem":496,"icon":497},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":499,"path":500,"stem":501,"icon":502},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":431,"path":504,"stem":505,"children":506,"page":29},"\u002Freference","7.reference",[507,511,516,519,524,528,533,537],{"title":36,"path":508,"stem":509,"icon":510},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":512,"path":513,"stem":514,"icon":515},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":378,"path":517,"stem":518,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":520,"path":521,"stem":522,"icon":523},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":525,"path":526,"stem":527,"icon":383},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":529,"path":530,"stem":531,"icon":532},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":534,"path":535,"stem":536,"icon":438},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":538,"path":539,"stem":540,"icon":541},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":543,"path":544,"stem":545,"children":546,"page":29},"Compare","\u002Fcompare","8.compare",[547,551,555,559,563],{"title":548,"path":549,"stem":550,"icon":532},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":552,"path":553,"stem":554,"icon":199},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":556,"path":557,"stem":558,"icon":532},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":560,"path":561,"stem":562,"icon":532},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":564,"path":565,"stem":566,"icon":532},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":568,"title":569,"body":570,"description":2194,"extension":2195,"links":2196,"meta":2205,"navigation":2206,"path":212,"seo":2207,"stem":213,"__hash__":2208},"docs\u002F4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs.md","File System Adapter",{"type":571,"value":572,"toc":2174},"minimark",[573,577,609,655,659,662,705,708,711,1306,1312,1316,1325,1332,1349,1352,1356,1459,1463,1622,1626,1636,1643,1647,1656,1660,1663,1822,1826,1830,1849,1853,1936,1940,1993,1997,2000,2127,2131,2141,2145,2170],[574,575,576],"p",{},"The File System adapter writes your wide events to local NDJSON files (one JSON object per line, one file per day). This enables:",[578,579,580,593,603],"ul",{},[581,582,583,587,588,592],"li",{},[584,585,586],"strong",{},"AI agent integration"," - point a skill to ",[589,590,591],"code",{},".evlog\u002Flogs\u002F"," to parse structured logs for debugging and pattern analysis",[581,594,595,598,599,602],{},[584,596,597],{},"Local dev debugging"," - persistent log history without scrolling the terminal (",[589,600,601],{},"tail -f .evlog\u002Flogs\u002F2026-03-14.jsonl",")",[581,604,605,608],{},[584,606,607],{},"Production backup"," - combine with a network drain (Axiom, OTLP) for local fallback",[610,611,614,617,641],"prompt",{":actions":612,"description":613,"icon":214},"[\"copy\",\"cursor\",\"claude\"]","Add the file system drain adapter",[574,615,616],{},"Add the file system drain adapter to write evlog wide events locally as NDJSON files.",[618,619,620,623,626,629,632,635,638],"ol",{},[581,621,622],{},"Identify which framework I'm using and follow its evlog integration pattern",[581,624,625],{},"Install evlog if not already installed",[581,627,628],{},"Import createFsDrain from 'evlog\u002Ffs'",[581,630,631],{},"Wire createFsDrain() into my framework's drain configuration",[581,633,634],{},"Logs are written to .evlog\u002Flogs\u002F by default (one file per day, auto .gitignore)",[581,636,637],{},"Optionally configure dir, maxFiles, maxSizePerFile, or pretty options",[581,639,640],{},"Test by triggering a request and checking .evlog\u002Flogs\u002F*.jsonl",[574,642,643,644,650,651],{},"Adapter docs: ",[645,646,647],"a",{"href":647,"rel":648},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs",[649],"nofollow","\nFramework setup: ",[645,652,653],{"href":653,"rel":654},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Foverview",[649],[656,657,20],"h2",{"id":658},"installation",[574,660,661],{},"The File System adapter comes bundled with evlog:",[663,664,670],"pre",{"className":665,"code":666,"filename":667,"language":668,"meta":669,"style":669},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createFsDrain } from 'evlog\u002Ffs'\n","src\u002Findex.ts","typescript","",[589,671,672],{"__ignoreMap":669},[673,674,677,681,685,689,692,695,698,702],"span",{"class":675,"line":676},"line",1,[673,678,680],{"class":679},"s7zQu","import",[673,682,684],{"class":683},"sMK4o"," {",[673,686,688],{"class":687},"sTEyZ"," createFsDrain",[673,690,691],{"class":683}," }",[673,693,694],{"class":679}," from",[673,696,697],{"class":683}," '",[673,699,701],{"class":700},"sfazB","evlog\u002Ffs",[673,703,704],{"class":683},"'\n",[656,706,25],{"id":707},"quick-start",[574,709,710],{},"No credentials or environment variables needed. Just wire the drain to your framework:",[712,713,714,828,959,976,1038,1092,1151,1205,1258],"code-group",{},[663,715,718],{"className":665,"code":716,"filename":717,"language":668,"meta":669,"style":669},"\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', createFsDrain())\n})\n","Nuxt \u002F Nitro",[589,719,720,726,745,752,783,819],{"__ignoreMap":669},[673,721,722],{"class":675,"line":676},[673,723,725],{"class":724},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[673,727,729,731,733,735,737,739,741,743],{"class":675,"line":728},2,[673,730,680],{"class":679},[673,732,684],{"class":683},[673,734,688],{"class":687},[673,736,691],{"class":683},[673,738,694],{"class":679},[673,740,697],{"class":683},[673,742,701],{"class":700},[673,744,704],{"class":683},[673,746,748],{"class":675,"line":747},3,[673,749,751],{"emptyLinePlaceholder":750},true,"\n",[673,753,755,758,761,765,768,770,774,776,780],{"class":675,"line":754},4,[673,756,757],{"class":679},"export",[673,759,760],{"class":679}," default",[673,762,764],{"class":763},"s2Zo4"," defineNitroPlugin",[673,766,767],{"class":687},"(",[673,769,767],{"class":683},[673,771,773],{"class":772},"sHdIc","nitroApp",[673,775,602],{"class":683},[673,777,779],{"class":778},"spNyl"," =>",[673,781,782],{"class":683}," {\n",[673,784,786,789,792,795,797,800,803,806,809,811,814,816],{"class":675,"line":785},5,[673,787,788],{"class":687},"  nitroApp",[673,790,791],{"class":683},".",[673,793,794],{"class":687},"hooks",[673,796,791],{"class":683},[673,798,799],{"class":763},"hook",[673,801,767],{"class":802},"swJcz",[673,804,805],{"class":683},"'",[673,807,808],{"class":700},"evlog:drain",[673,810,805],{"class":683},[673,812,813],{"class":683},",",[673,815,688],{"class":763},[673,817,818],{"class":802},"())\n",[673,820,822,825],{"class":675,"line":821},6,[673,823,824],{"class":683},"}",[673,826,827],{"class":687},")\n",[663,829,831],{"className":665,"code":830,"filename":240,"language":668,"meta":669,"style":669},"\u002F\u002F lib\u002Fevlog.ts — Node.js routes only; keep evlog\u002Ffs out of root instrumentation.ts\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain: createFsDrain(),\n})\n",[589,832,833,838,858,876,880,919,937,952],{"__ignoreMap":669},[673,834,835],{"class":675,"line":676},[673,836,837],{"class":724},"\u002F\u002F lib\u002Fevlog.ts — Node.js routes only; keep evlog\u002Ffs out of root instrumentation.ts\n",[673,839,840,842,844,847,849,851,853,856],{"class":675,"line":728},[673,841,680],{"class":679},[673,843,684],{"class":683},[673,845,846],{"class":687}," createEvlog",[673,848,691],{"class":683},[673,850,694],{"class":679},[673,852,697],{"class":683},[673,854,855],{"class":700},"evlog\u002Fnext",[673,857,704],{"class":683},[673,859,860,862,864,866,868,870,872,874],{"class":675,"line":747},[673,861,680],{"class":679},[673,863,684],{"class":683},[673,865,688],{"class":687},[673,867,691],{"class":683},[673,869,694],{"class":679},[673,871,697],{"class":683},[673,873,701],{"class":700},[673,875,704],{"class":683},[673,877,878],{"class":675,"line":754},[673,879,751],{"emptyLinePlaceholder":750},[673,881,882,884,887,889,892,894,897,899,902,904,907,909,912,914,916],{"class":675,"line":785},[673,883,757],{"class":679},[673,885,886],{"class":778}," const",[673,888,684],{"class":683},[673,890,891],{"class":687}," withEvlog",[673,893,813],{"class":683},[673,895,896],{"class":687}," useLogger",[673,898,813],{"class":683},[673,900,901],{"class":687}," log",[673,903,813],{"class":683},[673,905,906],{"class":687}," createError ",[673,908,824],{"class":683},[673,910,911],{"class":683}," =",[673,913,846],{"class":763},[673,915,767],{"class":687},[673,917,918],{"class":683},"{\n",[673,920,921,924,927,929,932,934],{"class":675,"line":821},[673,922,923],{"class":802},"  service",[673,925,926],{"class":683},":",[673,928,697],{"class":683},[673,930,931],{"class":700},"my-app",[673,933,805],{"class":683},[673,935,936],{"class":683},",\n",[673,938,940,943,945,947,950],{"class":675,"line":939},7,[673,941,942],{"class":802},"  drain",[673,944,926],{"class":683},[673,946,688],{"class":763},[673,948,949],{"class":687},"()",[673,951,936],{"class":683},[673,953,955,957],{"class":675,"line":954},8,[673,956,824],{"class":683},[673,958,827],{"class":687},[960,961,963,964,967,968,971,972,975],"callout",{"color":962,"icon":13},"info","The FS adapter requires Node.js (",[589,965,966],{},"node:fs","). On the Edge runtime, or when its directory is not writable, it logs a one-time ",[589,969,970],{},"[evlog\u002Ffs]"," warning and skips writes, so attaching it on a serverless host is safe but pointless, since only the temp directory is writable there and it does not outlive the instance. Use ",[589,973,974],{},"evlog\u002Fmemory"," or an HTTP adapter for those.",[663,977,979],{"className":665,"code":978,"filename":270,"language":668,"meta":669,"style":669},"import { createFsDrain } from 'evlog\u002Ffs'\n\napp.use(evlog({ drain: createFsDrain() }))\n",[589,980,981,999,1003],{"__ignoreMap":669},[673,982,983,985,987,989,991,993,995,997],{"class":675,"line":676},[673,984,680],{"class":679},[673,986,684],{"class":683},[673,988,688],{"class":687},[673,990,691],{"class":683},[673,992,694],{"class":679},[673,994,697],{"class":683},[673,996,701],{"class":700},[673,998,704],{"class":683},[673,1000,1001],{"class":675,"line":728},[673,1002,751],{"emptyLinePlaceholder":750},[673,1004,1005,1008,1010,1013,1015,1018,1020,1023,1026,1028,1030,1033,1035],{"class":675,"line":747},[673,1006,1007],{"class":687},"app",[673,1009,791],{"class":683},[673,1011,1012],{"class":763},"use",[673,1014,767],{"class":687},[673,1016,1017],{"class":763},"evlog",[673,1019,767],{"class":687},[673,1021,1022],{"class":683},"{",[673,1024,1025],{"class":802}," drain",[673,1027,926],{"class":683},[673,1029,688],{"class":763},[673,1031,1032],{"class":687},"() ",[673,1034,824],{"class":683},[673,1036,1037],{"class":687},"))\n",[663,1039,1040],{"className":665,"code":978,"filename":265,"language":668,"meta":669,"style":669},[589,1041,1042,1060,1064],{"__ignoreMap":669},[673,1043,1044,1046,1048,1050,1052,1054,1056,1058],{"class":675,"line":676},[673,1045,680],{"class":679},[673,1047,684],{"class":683},[673,1049,688],{"class":687},[673,1051,691],{"class":683},[673,1053,694],{"class":679},[673,1055,697],{"class":683},[673,1057,701],{"class":700},[673,1059,704],{"class":683},[673,1061,1062],{"class":675,"line":728},[673,1063,751],{"emptyLinePlaceholder":750},[673,1065,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090],{"class":675,"line":747},[673,1067,1007],{"class":687},[673,1069,791],{"class":683},[673,1071,1012],{"class":763},[673,1073,767],{"class":687},[673,1075,1017],{"class":763},[673,1077,767],{"class":687},[673,1079,1022],{"class":683},[673,1081,1025],{"class":802},[673,1083,926],{"class":683},[673,1085,688],{"class":763},[673,1087,1032],{"class":687},[673,1089,824],{"class":683},[673,1091,1037],{"class":687},[663,1093,1095],{"className":665,"code":1094,"filename":275,"language":668,"meta":669,"style":669},"import { createFsDrain } from 'evlog\u002Ffs'\n\nawait app.register(evlog, { drain: createFsDrain() })\n",[589,1096,1097,1115,1119],{"__ignoreMap":669},[673,1098,1099,1101,1103,1105,1107,1109,1111,1113],{"class":675,"line":676},[673,1100,680],{"class":679},[673,1102,684],{"class":683},[673,1104,688],{"class":687},[673,1106,691],{"class":683},[673,1108,694],{"class":679},[673,1110,697],{"class":683},[673,1112,701],{"class":700},[673,1114,704],{"class":683},[673,1116,1117],{"class":675,"line":728},[673,1118,751],{"emptyLinePlaceholder":750},[673,1120,1121,1124,1127,1129,1132,1135,1137,1139,1141,1143,1145,1147,1149],{"class":675,"line":747},[673,1122,1123],{"class":679},"await",[673,1125,1126],{"class":687}," app",[673,1128,791],{"class":683},[673,1130,1131],{"class":763},"register",[673,1133,1134],{"class":687},"(evlog",[673,1136,813],{"class":683},[673,1138,684],{"class":683},[673,1140,1025],{"class":802},[673,1142,926],{"class":683},[673,1144,688],{"class":763},[673,1146,1032],{"class":687},[673,1148,824],{"class":683},[673,1150,827],{"class":687},[663,1152,1153],{"className":665,"code":978,"filename":280,"language":668,"meta":669,"style":669},[589,1154,1155,1173,1177],{"__ignoreMap":669},[673,1156,1157,1159,1161,1163,1165,1167,1169,1171],{"class":675,"line":676},[673,1158,680],{"class":679},[673,1160,684],{"class":683},[673,1162,688],{"class":687},[673,1164,691],{"class":683},[673,1166,694],{"class":679},[673,1168,697],{"class":683},[673,1170,701],{"class":700},[673,1172,704],{"class":683},[673,1174,1175],{"class":675,"line":728},[673,1176,751],{"emptyLinePlaceholder":750},[673,1178,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203],{"class":675,"line":747},[673,1180,1007],{"class":687},[673,1182,791],{"class":683},[673,1184,1012],{"class":763},[673,1186,767],{"class":687},[673,1188,1017],{"class":763},[673,1190,767],{"class":687},[673,1192,1022],{"class":683},[673,1194,1025],{"class":802},[673,1196,926],{"class":683},[673,1198,688],{"class":763},[673,1200,1032],{"class":687},[673,1202,824],{"class":683},[673,1204,1037],{"class":687},[663,1206,1208],{"className":665,"code":1207,"filename":260,"language":668,"meta":669,"style":669},"import { createFsDrain } from 'evlog\u002Ffs'\n\nEvlogModule.forRoot({ drain: createFsDrain() })\n",[589,1209,1210,1228,1232],{"__ignoreMap":669},[673,1211,1212,1214,1216,1218,1220,1222,1224,1226],{"class":675,"line":676},[673,1213,680],{"class":679},[673,1215,684],{"class":683},[673,1217,688],{"class":687},[673,1219,691],{"class":683},[673,1221,694],{"class":679},[673,1223,697],{"class":683},[673,1225,701],{"class":700},[673,1227,704],{"class":683},[673,1229,1230],{"class":675,"line":728},[673,1231,751],{"emptyLinePlaceholder":750},[673,1233,1234,1237,1239,1242,1244,1246,1248,1250,1252,1254,1256],{"class":675,"line":747},[673,1235,1236],{"class":687},"EvlogModule",[673,1238,791],{"class":683},[673,1240,1241],{"class":763},"forRoot",[673,1243,767],{"class":687},[673,1245,1022],{"class":683},[673,1247,1025],{"class":802},[673,1249,926],{"class":683},[673,1251,688],{"class":763},[673,1253,1032],{"class":687},[673,1255,824],{"class":683},[673,1257,827],{"class":687},[663,1259,1261],{"className":665,"code":1260,"filename":295,"language":668,"meta":669,"style":669},"import { createFsDrain } from 'evlog\u002Ffs'\n\ninitLogger({ drain: createFsDrain() })\n",[589,1262,1263,1281,1285],{"__ignoreMap":669},[673,1264,1265,1267,1269,1271,1273,1275,1277,1279],{"class":675,"line":676},[673,1266,680],{"class":679},[673,1268,684],{"class":683},[673,1270,688],{"class":687},[673,1272,691],{"class":683},[673,1274,694],{"class":679},[673,1276,697],{"class":683},[673,1278,701],{"class":700},[673,1280,704],{"class":683},[673,1282,1283],{"class":675,"line":728},[673,1284,751],{"emptyLinePlaceholder":750},[673,1286,1287,1290,1292,1294,1296,1298,1300,1302,1304],{"class":675,"line":747},[673,1288,1289],{"class":763},"initLogger",[673,1291,767],{"class":687},[673,1293,1022],{"class":683},[673,1295,1025],{"class":802},[673,1297,926],{"class":683},[673,1299,688],{"class":763},[673,1301,1032],{"class":687},[673,1303,824],{"class":683},[673,1305,827],{"class":687},[574,1307,1308,1309,1311],{},"Logs start appearing in ",[589,1310,591],{}," immediately.",[656,1313,1315],{"id":1314},"where-the-files-land","Where the files land",[663,1317,1323],{"className":1318,"code":1320,"filename":1321,"language":1322,"meta":669},[1319],"language-text",".evlog\u002F\n  logs\u002F\n    2026-03-14.jsonl    ← one file per day\n    2026-03-13.jsonl\n    2026-03-12.jsonl\n",".evlog\u002Flogs directory layout","text",[589,1324,1320],{"__ignoreMap":669},[574,1326,1327,1328,1331],{},"Each ",[589,1329,1330],{},".jsonl"," file contains one JSON object per line (NDJSON format), making it easy to parse, grep, and stream.",[960,1333,1336,1337,1340,1341,1344,1345,1348],{"color":1334,"icon":1335},"success","i-lucide-git-branch","A ",[589,1338,1339],{},".gitignore"," is automatically created on first write, inside the ",[589,1342,1343],{},".evlog\u002F"," ancestor directory when present or in the configured ",[589,1346,1347],{},"dir"," otherwise. Log files are never committed to version control.",[656,1350,512],{"id":1351},"configuration",[1353,1354,341],"h3",{"id":1355},"options",[1357,1358,1359,1378],"table",{},[1360,1361,1362],"thead",{},[1363,1364,1365,1369,1372,1375],"tr",{},[1366,1367,1368],"th",{},"Option",[1366,1370,1371],{},"Type",[1366,1373,1374],{},"Default",[1366,1376,1377],{},"Description",[1379,1380,1381,1401,1421,1439],"tbody",{},[1363,1382,1383,1388,1393,1398],{},[1384,1385,1386],"td",{},[589,1387,1347],{},[1384,1389,1390],{},[589,1391,1392],{},"string",[1384,1394,1395],{},[589,1396,1397],{},"'.evlog\u002Flogs'",[1384,1399,1400],{},"Directory for log files",[1363,1402,1403,1408,1413,1418],{},[1384,1404,1405],{},[589,1406,1407],{},"maxFiles",[1384,1409,1410],{},[589,1411,1412],{},"number",[1384,1414,1415],{},[589,1416,1417],{},"undefined",[1384,1419,1420],{},"Max files to keep (auto-deletes oldest)",[1363,1422,1423,1428,1432,1436],{},[1384,1424,1425],{},[589,1426,1427],{},"maxSizePerFile",[1384,1429,1430],{},[589,1431,1412],{},[1384,1433,1434],{},[589,1435,1417],{},[1384,1437,1438],{},"Max bytes per file before rotating",[1363,1440,1441,1446,1451,1456],{},[1384,1442,1443],{},[589,1444,1445],{},"pretty",[1384,1447,1448],{},[589,1449,1450],{},"boolean",[1384,1452,1453],{},[589,1454,1455],{},"false",[1384,1457,1458],{},"Pretty-print JSON (multi-line, readable)",[1353,1460,1462],{"id":1461},"examples","Examples",[663,1464,1467],{"className":665,"code":1465,"filename":1466,"language":668,"meta":669,"style":669},"\u002F\u002F Keep only the last 7 days of logs\ncreateFsDrain({ maxFiles: 7 })\n\n\u002F\u002F Rotate files at 10MB, keep 30 files\ncreateFsDrain({\n  maxSizePerFile: 10 * 1024 * 1024,\n  maxFiles: 30,\n})\n\n\u002F\u002F Pretty-print for human reading\ncreateFsDrain({ pretty: true })\n\n\u002F\u002F Custom directory\ncreateFsDrain({ dir: '\u002Fvar\u002Flog\u002Fmyapp' })\n","server\u002Fplugins\u002Fevlog-drain.ts",[589,1468,1469,1474,1496,1500,1505,1513,1535,1547,1553,1558,1564,1586,1591,1597],{"__ignoreMap":669},[673,1470,1471],{"class":675,"line":676},[673,1472,1473],{"class":724},"\u002F\u002F Keep only the last 7 days of logs\n",[673,1475,1476,1479,1481,1483,1486,1488,1492,1494],{"class":675,"line":728},[673,1477,1478],{"class":763},"createFsDrain",[673,1480,767],{"class":687},[673,1482,1022],{"class":683},[673,1484,1485],{"class":802}," maxFiles",[673,1487,926],{"class":683},[673,1489,1491],{"class":1490},"sbssI"," 7",[673,1493,691],{"class":683},[673,1495,827],{"class":687},[673,1497,1498],{"class":675,"line":747},[673,1499,751],{"emptyLinePlaceholder":750},[673,1501,1502],{"class":675,"line":754},[673,1503,1504],{"class":724},"\u002F\u002F Rotate files at 10MB, keep 30 files\n",[673,1506,1507,1509,1511],{"class":675,"line":785},[673,1508,1478],{"class":763},[673,1510,767],{"class":687},[673,1512,918],{"class":683},[673,1514,1515,1518,1520,1523,1526,1529,1531,1533],{"class":675,"line":821},[673,1516,1517],{"class":802},"  maxSizePerFile",[673,1519,926],{"class":683},[673,1521,1522],{"class":1490}," 10",[673,1524,1525],{"class":683}," *",[673,1527,1528],{"class":1490}," 1024",[673,1530,1525],{"class":683},[673,1532,1528],{"class":1490},[673,1534,936],{"class":683},[673,1536,1537,1540,1542,1545],{"class":675,"line":939},[673,1538,1539],{"class":802},"  maxFiles",[673,1541,926],{"class":683},[673,1543,1544],{"class":1490}," 30",[673,1546,936],{"class":683},[673,1548,1549,1551],{"class":675,"line":954},[673,1550,824],{"class":683},[673,1552,827],{"class":687},[673,1554,1556],{"class":675,"line":1555},9,[673,1557,751],{"emptyLinePlaceholder":750},[673,1559,1561],{"class":675,"line":1560},10,[673,1562,1563],{"class":724},"\u002F\u002F Pretty-print for human reading\n",[673,1565,1567,1569,1571,1573,1576,1578,1582,1584],{"class":675,"line":1566},11,[673,1568,1478],{"class":763},[673,1570,767],{"class":687},[673,1572,1022],{"class":683},[673,1574,1575],{"class":802}," pretty",[673,1577,926],{"class":683},[673,1579,1581],{"class":1580},"sfNiH"," true",[673,1583,691],{"class":683},[673,1585,827],{"class":687},[673,1587,1589],{"class":675,"line":1588},12,[673,1590,751],{"emptyLinePlaceholder":750},[673,1592,1594],{"class":675,"line":1593},13,[673,1595,1596],{"class":724},"\u002F\u002F Custom directory\n",[673,1598,1600,1602,1604,1606,1609,1611,1613,1616,1618,1620],{"class":675,"line":1599},14,[673,1601,1478],{"class":763},[673,1603,767],{"class":687},[673,1605,1022],{"class":683},[673,1607,1608],{"class":802}," dir",[673,1610,926],{"class":683},[673,1612,697],{"class":683},[673,1614,1615],{"class":700},"\u002Fvar\u002Flog\u002Fmyapp",[673,1617,805],{"class":683},[673,1619,691],{"class":683},[673,1621,827],{"class":687},[1353,1623,1625],{"id":1624},"rotate-by-size-or-by-day","Rotate by size or by day",[574,1627,1628,1629,1632,1633,1635],{},"By default, a new file is created each day (",[589,1630,1631],{},"2026-03-14.jsonl","). When ",[589,1634,1427],{}," is set, the adapter creates suffixed files when the current file exceeds the limit:",[663,1637,1641],{"className":1638,"code":1639,"filename":1640,"language":1322,"meta":669},[1319],".evlog\u002Flogs\u002F\n  2026-03-14.jsonl      ← base file (full)\n  2026-03-14.1.jsonl    ← first rotation\n  2026-03-14.2.jsonl    ← second rotation\n","Rotated log files",[589,1642,1639],{"__ignoreMap":669},[1353,1644,1646],{"id":1645},"delete-old-files-on-a-schedule","Delete old files on a schedule",[574,1648,1649,1650,1652,1653,1655],{},"When ",[589,1651,1407],{}," is set, the adapter automatically deletes the oldest ",[589,1654,1330],{}," files after each write, keeping only the most recent files.",[656,1657,1659],{"id":1658},"write-to-disk-and-ship-to-a-service","Write to disk and ship to a service",[574,1661,1662],{},"Use the FS adapter alongside a network drain for local backup:",[663,1664,1666],{"className":665,"code":1665,"filename":1466,"language":668,"meta":669,"style":669},"import { createFsDrain } from 'evlog\u002Ffs'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst fs = createFsDrain({ maxFiles: 7 })\nconst axiom = createAxiomDrain()\n\nconst drain = async (ctx) => {\n  await Promise.allSettled([fs(ctx), axiom(ctx)])\n}\n",[589,1667,1668,1686,1706,1710,1737,1751,1755,1779,1817],{"__ignoreMap":669},[673,1669,1670,1672,1674,1676,1678,1680,1682,1684],{"class":675,"line":676},[673,1671,680],{"class":679},[673,1673,684],{"class":683},[673,1675,688],{"class":687},[673,1677,691],{"class":683},[673,1679,694],{"class":679},[673,1681,697],{"class":683},[673,1683,701],{"class":700},[673,1685,704],{"class":683},[673,1687,1688,1690,1692,1695,1697,1699,1701,1704],{"class":675,"line":728},[673,1689,680],{"class":679},[673,1691,684],{"class":683},[673,1693,1694],{"class":687}," createAxiomDrain",[673,1696,691],{"class":683},[673,1698,694],{"class":679},[673,1700,697],{"class":683},[673,1702,1703],{"class":700},"evlog\u002Faxiom",[673,1705,704],{"class":683},[673,1707,1708],{"class":675,"line":747},[673,1709,751],{"emptyLinePlaceholder":750},[673,1711,1712,1715,1718,1721,1723,1725,1727,1729,1731,1733,1735],{"class":675,"line":754},[673,1713,1714],{"class":778},"const",[673,1716,1717],{"class":687}," fs ",[673,1719,1720],{"class":683},"=",[673,1722,688],{"class":763},[673,1724,767],{"class":687},[673,1726,1022],{"class":683},[673,1728,1485],{"class":802},[673,1730,926],{"class":683},[673,1732,1491],{"class":1490},[673,1734,691],{"class":683},[673,1736,827],{"class":687},[673,1738,1739,1741,1744,1746,1748],{"class":675,"line":785},[673,1740,1714],{"class":778},[673,1742,1743],{"class":687}," axiom ",[673,1745,1720],{"class":683},[673,1747,1694],{"class":763},[673,1749,1750],{"class":687},"()\n",[673,1752,1753],{"class":675,"line":821},[673,1754,751],{"emptyLinePlaceholder":750},[673,1756,1757,1759,1762,1764,1767,1770,1773,1775,1777],{"class":675,"line":939},[673,1758,1714],{"class":778},[673,1760,1761],{"class":687}," drain ",[673,1763,1720],{"class":683},[673,1765,1766],{"class":778}," async",[673,1768,1769],{"class":683}," (",[673,1771,1772],{"class":772},"ctx",[673,1774,602],{"class":683},[673,1776,779],{"class":778},[673,1778,782],{"class":683},[673,1780,1781,1784,1788,1790,1793,1796,1799,1801,1803,1805,1807,1810,1812,1814],{"class":675,"line":954},[673,1782,1783],{"class":679},"  await",[673,1785,1787],{"class":1786},"sBMFI"," Promise",[673,1789,791],{"class":683},[673,1791,1792],{"class":763},"allSettled",[673,1794,1795],{"class":802},"([",[673,1797,1798],{"class":763},"fs",[673,1800,767],{"class":802},[673,1802,1772],{"class":687},[673,1804,602],{"class":802},[673,1806,813],{"class":683},[673,1808,1809],{"class":763}," axiom",[673,1811,767],{"class":802},[673,1813,1772],{"class":687},[673,1815,1816],{"class":802},")])\n",[673,1818,1819],{"class":675,"line":1555},[673,1820,1821],{"class":683},"}\n",[656,1823,1825],{"id":1824},"read-back-what-you-wrote","Read back what you wrote",[1353,1827,1829],{"id":1828},"stream-in-real-time","Stream in real-time",[663,1831,1836],{"className":1832,"code":1833,"filename":1834,"language":1835,"meta":669,"style":669},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tail -f .evlog\u002Flogs\u002F2026-03-14.jsonl\n","Terminal","bash",[589,1837,1838],{"__ignoreMap":669},[673,1839,1840,1843,1846],{"class":675,"line":676},[673,1841,1842],{"class":1786},"tail",[673,1844,1845],{"class":700}," -f",[673,1847,1848],{"class":700}," .evlog\u002Flogs\u002F2026-03-14.jsonl\n",[1353,1850,1852],{"id":1851},"search-with-jq","Search with jq",[663,1854,1856],{"className":1832,"code":1855,"filename":1834,"language":1835,"meta":669,"style":669},"# Find errors\ncat .evlog\u002Flogs\u002F2026-03-14.jsonl | jq 'select(.level == \"error\")'\n\n# Slow requests (over 1s)\ncat .evlog\u002Flogs\u002F2026-03-14.jsonl | jq 'select(.durationMs > 1000)'\n\n# Requests by path\ncat .evlog\u002Flogs\u002F2026-03-14.jsonl | jq 'select(.path == \"\u002Fapi\u002Fcheckout\")'\n",[589,1857,1858,1863,1884,1888,1893,1910,1914,1919],{"__ignoreMap":669},[673,1859,1860],{"class":675,"line":676},[673,1861,1862],{"class":724},"# Find errors\n",[673,1864,1865,1868,1871,1874,1877,1879,1882],{"class":675,"line":728},[673,1866,1867],{"class":1786},"cat",[673,1869,1870],{"class":700}," .evlog\u002Flogs\u002F2026-03-14.jsonl",[673,1872,1873],{"class":683}," |",[673,1875,1876],{"class":1786}," jq",[673,1878,697],{"class":683},[673,1880,1881],{"class":700},"select(.level == \"error\")",[673,1883,704],{"class":683},[673,1885,1886],{"class":675,"line":747},[673,1887,751],{"emptyLinePlaceholder":750},[673,1889,1890],{"class":675,"line":754},[673,1891,1892],{"class":724},"# Slow requests (over 1s)\n",[673,1894,1895,1897,1899,1901,1903,1905,1908],{"class":675,"line":785},[673,1896,1867],{"class":1786},[673,1898,1870],{"class":700},[673,1900,1873],{"class":683},[673,1902,1876],{"class":1786},[673,1904,697],{"class":683},[673,1906,1907],{"class":700},"select(.durationMs > 1000)",[673,1909,704],{"class":683},[673,1911,1912],{"class":675,"line":821},[673,1913,751],{"emptyLinePlaceholder":750},[673,1915,1916],{"class":675,"line":939},[673,1917,1918],{"class":724},"# Requests by path\n",[673,1920,1921,1923,1925,1927,1929,1931,1934],{"class":675,"line":954},[673,1922,1867],{"class":1786},[673,1924,1870],{"class":700},[673,1926,1873],{"class":683},[673,1928,1876],{"class":1786},[673,1930,697],{"class":683},[673,1932,1933],{"class":700},"select(.path == \"\u002Fapi\u002Fcheckout\")",[673,1935,704],{"class":683},[1353,1937,1939],{"id":1938},"search-with-grep","Search with grep",[663,1941,1943],{"className":1832,"code":1942,"filename":1834,"language":1835,"meta":669,"style":669},"# Find all errors\ngrep '\"level\":\"error\"' .evlog\u002Flogs\u002F2026-03-14.jsonl\n\n# Find by request ID\ngrep 'req_abc123' .evlog\u002Flogs\u002F*.jsonl\n",[589,1944,1945,1950,1964,1968,1973],{"__ignoreMap":669},[673,1946,1947],{"class":675,"line":676},[673,1948,1949],{"class":724},"# Find all errors\n",[673,1951,1952,1955,1957,1960,1962],{"class":675,"line":728},[673,1953,1954],{"class":1786},"grep",[673,1956,697],{"class":683},[673,1958,1959],{"class":700},"\"level\":\"error\"",[673,1961,805],{"class":683},[673,1963,1848],{"class":700},[673,1965,1966],{"class":675,"line":747},[673,1967,751],{"emptyLinePlaceholder":750},[673,1969,1970],{"class":675,"line":754},[673,1971,1972],{"class":724},"# Find by request ID\n",[673,1974,1975,1977,1979,1982,1984,1987,1990],{"class":675,"line":785},[673,1976,1954],{"class":1786},[673,1978,697],{"class":683},[673,1980,1981],{"class":700},"req_abc123",[673,1983,805],{"class":683},[673,1985,1986],{"class":700}," .evlog\u002Flogs\u002F",[673,1988,1989],{"class":687},"*",[673,1991,1992],{"class":700},".jsonl\n",[656,1994,1996],{"id":1995},"call-the-drain-without-a-framework","Call the drain without a framework",[574,1998,1999],{},"For advanced use cases, use the lower-level write functions:",[663,2001,2003],{"className":665,"code":2002,"filename":667,"language":668,"meta":669,"style":669},"import { writeToFs, writeBatchToFs } from 'evlog\u002Ffs'\n\nawait writeToFs(event, {\n  dir: '.evlog\u002Flogs',\n  pretty: false,\n})\n\nawait writeBatchToFs(events, {\n  dir: '.evlog\u002Flogs',\n  pretty: false,\n})\n",[589,2004,2005,2029,2033,2046,2062,2074,2080,2084,2097,2111,2121],{"__ignoreMap":669},[673,2006,2007,2009,2011,2014,2016,2019,2021,2023,2025,2027],{"class":675,"line":676},[673,2008,680],{"class":679},[673,2010,684],{"class":683},[673,2012,2013],{"class":687}," writeToFs",[673,2015,813],{"class":683},[673,2017,2018],{"class":687}," writeBatchToFs",[673,2020,691],{"class":683},[673,2022,694],{"class":679},[673,2024,697],{"class":683},[673,2026,701],{"class":700},[673,2028,704],{"class":683},[673,2030,2031],{"class":675,"line":728},[673,2032,751],{"emptyLinePlaceholder":750},[673,2034,2035,2037,2039,2042,2044],{"class":675,"line":747},[673,2036,1123],{"class":679},[673,2038,2013],{"class":763},[673,2040,2041],{"class":687},"(event",[673,2043,813],{"class":683},[673,2045,782],{"class":683},[673,2047,2048,2051,2053,2055,2058,2060],{"class":675,"line":754},[673,2049,2050],{"class":802},"  dir",[673,2052,926],{"class":683},[673,2054,697],{"class":683},[673,2056,2057],{"class":700},".evlog\u002Flogs",[673,2059,805],{"class":683},[673,2061,936],{"class":683},[673,2063,2064,2067,2069,2072],{"class":675,"line":785},[673,2065,2066],{"class":802},"  pretty",[673,2068,926],{"class":683},[673,2070,2071],{"class":1580}," false",[673,2073,936],{"class":683},[673,2075,2076,2078],{"class":675,"line":821},[673,2077,824],{"class":683},[673,2079,827],{"class":687},[673,2081,2082],{"class":675,"line":939},[673,2083,751],{"emptyLinePlaceholder":750},[673,2085,2086,2088,2090,2093,2095],{"class":675,"line":954},[673,2087,1123],{"class":679},[673,2089,2018],{"class":763},[673,2091,2092],{"class":687},"(events",[673,2094,813],{"class":683},[673,2096,782],{"class":683},[673,2098,2099,2101,2103,2105,2107,2109],{"class":675,"line":1555},[673,2100,2050],{"class":802},[673,2102,926],{"class":683},[673,2104,697],{"class":683},[673,2106,2057],{"class":700},[673,2108,805],{"class":683},[673,2110,936],{"class":683},[673,2112,2113,2115,2117,2119],{"class":675,"line":1560},[673,2114,2066],{"class":802},[673,2116,926],{"class":683},[673,2118,2071],{"class":1580},[673,2120,936],{"class":683},[673,2122,2123,2125],{"class":675,"line":1566},[673,2124,824],{"class":683},[673,2126,827],{"class":687},[656,2128,2130],{"id":2129},"hand-the-file-to-an-agent","Hand the file to an agent",[574,2132,2133,2134,2140],{},"The file system drain pairs with the ",[645,2135,2136,2139],{"href":535},[589,2137,2138],{},"analyze-logs"," agent skill",". When installed, your AI assistant can read the NDJSON logs directly to debug errors, trace requests, and investigate performance without any external tools.",[656,2142,2144],{"id":2143},"next-steps","Next Steps",[578,2146,2147,2152,2158,2164],{},[581,2148,2149,2151],{},[645,2150,534],{"href":535}," - Let AI analyze your logs",[581,2153,2154,2157],{},[645,2155,2156],{"href":157},"Axiom Adapter"," - Send logs to Axiom for querying and dashboards",[581,2159,2160,2163],{},[645,2161,2162],{"href":500},"Pipeline"," - Add batching and retry to any drain",[581,2165,2166,2169],{},[645,2167,2168],{"href":495},"Custom Adapters"," - Build your own adapter",[2171,2172,2173],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":669,"searchDepth":728,"depth":728,"links":2175},[2176,2177,2178,2179,2185,2186,2191,2192,2193],{"id":658,"depth":728,"text":20},{"id":707,"depth":728,"text":25},{"id":1314,"depth":728,"text":1315},{"id":1351,"depth":728,"text":512,"children":2180},[2181,2182,2183,2184],{"id":1355,"depth":747,"text":341},{"id":1461,"depth":747,"text":1462},{"id":1624,"depth":747,"text":1625},{"id":1645,"depth":747,"text":1646},{"id":1658,"depth":728,"text":1659},{"id":1824,"depth":728,"text":1825,"children":2187},[2188,2189,2190],{"id":1828,"depth":747,"text":1829},{"id":1851,"depth":747,"text":1852},{"id":1938,"depth":747,"text":1939},{"id":1995,"depth":728,"text":1996},{"id":2129,"depth":728,"text":2130},{"id":2143,"depth":728,"text":2144},"Write wide events to the local file system as NDJSON for local debugging, AI agent integration, and production backup.","md",[2197,2204],{"label":2198,"icon":2199,"to":2200,"target":2201,"color":2202,"variant":2203},"NDJSON Format","i-lucide-external-link","https:\u002F\u002Fgithub.com\u002Fndjson\u002Fndjson-spec","_blank","neutral","subtle",{"label":2156,"icon":159,"to":157,"color":2202,"variant":2203},{},{"title":211,"icon":214},{"title":569,"description":2194},"qTrNusBylR8EV6oy6tecrqeiujYbk3pUQ17J4K5q3kc",[2210,2212],{"title":201,"path":202,"stem":203,"description":2211,"icon":204,"children":-1},"Send wide events to HyperDX over OTLP\u002FHTTP, using its documented endpoint and authorization header. Configured from environment variables.",{"title":216,"path":217,"stem":218,"description":2213,"icon":219,"children":-1},"Self-hosted retention using NuxtHub database storage. Store, query, and clean up your wide events with no external dependency.",1788921648611]