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