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