[{"data":1,"prerenderedAt":2176},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-self-hosted-fs":528,"-integrate-adapters-self-hosted-fs-surround":2171},[4,29,76,122,304,435,496],{"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,431],{"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},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers",{"title":432,"path":433,"stem":434},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve",{"title":436,"path":437,"stem":438,"children":439,"page":28},"Extend","\u002Fextend","6.extend",[440,444,449,454,458,463,467,471,476,481,486,491],{"title":128,"path":441,"stem":442,"icon":443},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":445,"path":446,"stem":447,"icon":448},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":450,"path":451,"stem":452,"icon":453},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":455,"path":456,"stem":457,"icon":448},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":459,"path":460,"stem":461,"icon":462},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":403,"path":464,"stem":465,"icon":466},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":468,"path":469,"stem":470},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":472,"path":473,"stem":474,"icon":475},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers","i-lucide-sparkles",{"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,"icon":495},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":424,"path":497,"stem":498,"children":499,"page":28},"\u002Freference","7.reference",[500,504,507,512,516,520,524],{"title":501,"path":502,"stem":503},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration",{"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},"evlog vs pino, winston, consola","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers",{"title":521,"path":522,"stem":523,"icon":475},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":525,"path":526,"stem":527},"Log cost","\u002Freference\u002Fcost","7.reference\u002F7.cost",{"id":529,"title":530,"body":531,"description":2156,"extension":2157,"links":2158,"meta":2167,"navigation":2168,"path":203,"seo":2169,"stem":204,"__hash__":2170},"docs\u002F4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs.md","File System Adapter",{"type":532,"value":533,"toc":2136},"minimark",[534,538,570,616,620,623,666,669,672,1268,1274,1278,1287,1294,1311,1314,1318,1421,1425,1584,1588,1598,1605,1609,1618,1622,1625,1784,1788,1792,1811,1815,1898,1902,1955,1959,1962,2089,2093,2103,2107,2132],[535,536,537],"p",{},"The File System adapter writes your wide events to local NDJSON files (one JSON object per line, one file per day). This enables:",[539,540,541,554,564],"ul",{},[542,543,544,548,549,553],"li",{},[545,546,547],"strong",{},"AI agent integration"," - point a skill to ",[550,551,552],"code",{},".evlog\u002Flogs\u002F"," to parse structured logs for debugging and pattern analysis",[542,555,556,559,560,563],{},[545,557,558],{},"Local dev debugging"," - persistent log history without scrolling the terminal (",[550,561,562],{},"tail -f .evlog\u002Flogs\u002F2026-03-14.jsonl",")",[542,565,566,569],{},[545,567,568],{},"Production backup"," - combine with a network drain (Axiom, OTLP) for local fallback",[571,572,575,578,602],"prompt",{":actions":573,"description":574,"icon":205},"[\"copy\",\"cursor\",\"claude\"]","Add the file system drain adapter",[535,576,577],{},"Add the file system drain adapter to write evlog wide events locally as NDJSON files.",[579,580,581,584,587,590,593,596,599],"ol",{},[542,582,583],{},"Identify which framework I'm using and follow its evlog integration pattern",[542,585,586],{},"Install evlog if not already installed",[542,588,589],{},"Import createFsDrain from 'evlog\u002Ffs'",[542,591,592],{},"Wire createFsDrain() into my framework's drain configuration",[542,594,595],{},"Logs are written to .evlog\u002Flogs\u002F by default (one file per day, auto .gitignore)",[542,597,598],{},"Optionally configure dir, maxFiles, maxSizePerFile, or pretty options",[542,600,601],{},"Test by triggering a request and checking .evlog\u002Flogs\u002F*.jsonl",[535,603,604,605,611,612],{},"Adapter docs: ",[606,607,608],"a",{"href":608,"rel":609},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs",[610],"nofollow","\nFramework setup: ",[606,613,614],{"href":614,"rel":615},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Foverview",[610],[617,618,19],"h2",{"id":619},"installation",[535,621,622],{},"The File System adapter comes bundled with evlog:",[624,625,631],"pre",{"className":626,"code":627,"filename":628,"language":629,"meta":630,"style":630},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createFsDrain } from 'evlog\u002Ffs'\n","src\u002Findex.ts","typescript","",[550,632,633],{"__ignoreMap":630},[634,635,638,642,646,650,653,656,659,663],"span",{"class":636,"line":637},"line",1,[634,639,641],{"class":640},"s7zQu","import",[634,643,645],{"class":644},"sMK4o"," {",[634,647,649],{"class":648},"sTEyZ"," createFsDrain",[634,651,652],{"class":644}," }",[634,654,655],{"class":640}," from",[634,657,658],{"class":644}," '",[634,660,662],{"class":661},"sfazB","evlog\u002Ffs",[634,664,665],{"class":644},"'\n",[617,667,24],{"id":668},"quick-start",[535,670,671],{},"No credentials or environment variables needed. Just wire the drain to your framework:",[673,674,675,789,920,938,1000,1054,1113,1167,1220],"code-group",{},[624,676,679],{"className":626,"code":677,"filename":678,"language":629,"meta":630,"style":630},"\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",[550,680,681,687,706,713,744,780],{"__ignoreMap":630},[634,682,683],{"class":636,"line":637},[634,684,686],{"class":685},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[634,688,690,692,694,696,698,700,702,704],{"class":636,"line":689},2,[634,691,641],{"class":640},[634,693,645],{"class":644},[634,695,649],{"class":648},[634,697,652],{"class":644},[634,699,655],{"class":640},[634,701,658],{"class":644},[634,703,662],{"class":661},[634,705,665],{"class":644},[634,707,709],{"class":636,"line":708},3,[634,710,712],{"emptyLinePlaceholder":711},true,"\n",[634,714,716,719,722,726,729,731,735,737,741],{"class":636,"line":715},4,[634,717,718],{"class":640},"export",[634,720,721],{"class":640}," default",[634,723,725],{"class":724},"s2Zo4"," defineNitroPlugin",[634,727,728],{"class":648},"(",[634,730,728],{"class":644},[634,732,734],{"class":733},"sHdIc","nitroApp",[634,736,563],{"class":644},[634,738,740],{"class":739},"spNyl"," =>",[634,742,743],{"class":644}," {\n",[634,745,747,750,753,756,758,761,764,767,770,772,775,777],{"class":636,"line":746},5,[634,748,749],{"class":648},"  nitroApp",[634,751,752],{"class":644},".",[634,754,755],{"class":648},"hooks",[634,757,752],{"class":644},[634,759,760],{"class":724},"hook",[634,762,728],{"class":763},"swJcz",[634,765,766],{"class":644},"'",[634,768,769],{"class":661},"evlog:drain",[634,771,766],{"class":644},[634,773,774],{"class":644},",",[634,776,649],{"class":724},[634,778,779],{"class":763},"())\n",[634,781,783,786],{"class":636,"line":782},6,[634,784,785],{"class":644},"}",[634,787,788],{"class":648},")\n",[624,790,792],{"className":626,"code":791,"filename":231,"language":629,"meta":630,"style":630},"\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",[550,793,794,799,819,837,841,880,898,913],{"__ignoreMap":630},[634,795,796],{"class":636,"line":637},[634,797,798],{"class":685},"\u002F\u002F lib\u002Fevlog.ts — Node.js routes only; keep evlog\u002Ffs out of root instrumentation.ts\n",[634,800,801,803,805,808,810,812,814,817],{"class":636,"line":689},[634,802,641],{"class":640},[634,804,645],{"class":644},[634,806,807],{"class":648}," createEvlog",[634,809,652],{"class":644},[634,811,655],{"class":640},[634,813,658],{"class":644},[634,815,816],{"class":661},"evlog\u002Fnext",[634,818,665],{"class":644},[634,820,821,823,825,827,829,831,833,835],{"class":636,"line":708},[634,822,641],{"class":640},[634,824,645],{"class":644},[634,826,649],{"class":648},[634,828,652],{"class":644},[634,830,655],{"class":640},[634,832,658],{"class":644},[634,834,662],{"class":661},[634,836,665],{"class":644},[634,838,839],{"class":636,"line":715},[634,840,712],{"emptyLinePlaceholder":711},[634,842,843,845,848,850,853,855,858,860,863,865,868,870,873,875,877],{"class":636,"line":746},[634,844,718],{"class":640},[634,846,847],{"class":739}," const",[634,849,645],{"class":644},[634,851,852],{"class":648}," withEvlog",[634,854,774],{"class":644},[634,856,857],{"class":648}," useLogger",[634,859,774],{"class":644},[634,861,862],{"class":648}," log",[634,864,774],{"class":644},[634,866,867],{"class":648}," createError ",[634,869,785],{"class":644},[634,871,872],{"class":644}," =",[634,874,807],{"class":724},[634,876,728],{"class":648},[634,878,879],{"class":644},"{\n",[634,881,882,885,888,890,893,895],{"class":636,"line":782},[634,883,884],{"class":763},"  service",[634,886,887],{"class":644},":",[634,889,658],{"class":644},[634,891,892],{"class":661},"my-app",[634,894,766],{"class":644},[634,896,897],{"class":644},",\n",[634,899,901,904,906,908,911],{"class":636,"line":900},7,[634,902,903],{"class":763},"  drain",[634,905,887],{"class":644},[634,907,649],{"class":724},[634,909,910],{"class":648},"()",[634,912,897],{"class":644},[634,914,916,918],{"class":636,"line":915},8,[634,917,785],{"class":644},[634,919,788],{"class":648},[921,922,925,926,929,930,933,934,937],"callout",{"color":923,"icon":924},"info","i-lucide-info","The FS adapter requires Node.js (",[550,927,928],{},"node:fs","). On the Edge runtime, or when its directory is not writable, it logs a one-time ",[550,931,932],{},"[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 ",[550,935,936],{},"evlog\u002Fmemory"," or an HTTP adapter for those.",[624,939,941],{"className":626,"code":940,"filename":261,"language":629,"meta":630,"style":630},"import { createFsDrain } from 'evlog\u002Ffs'\n\napp.use(evlog({ drain: createFsDrain() }))\n",[550,942,943,961,965],{"__ignoreMap":630},[634,944,945,947,949,951,953,955,957,959],{"class":636,"line":637},[634,946,641],{"class":640},[634,948,645],{"class":644},[634,950,649],{"class":648},[634,952,652],{"class":644},[634,954,655],{"class":640},[634,956,658],{"class":644},[634,958,662],{"class":661},[634,960,665],{"class":644},[634,962,963],{"class":636,"line":689},[634,964,712],{"emptyLinePlaceholder":711},[634,966,967,970,972,975,977,980,982,985,988,990,992,995,997],{"class":636,"line":708},[634,968,969],{"class":648},"app",[634,971,752],{"class":644},[634,973,974],{"class":724},"use",[634,976,728],{"class":648},[634,978,979],{"class":724},"evlog",[634,981,728],{"class":648},[634,983,984],{"class":644},"{",[634,986,987],{"class":763}," drain",[634,989,887],{"class":644},[634,991,649],{"class":724},[634,993,994],{"class":648},"() ",[634,996,785],{"class":644},[634,998,999],{"class":648},"))\n",[624,1001,1002],{"className":626,"code":940,"filename":256,"language":629,"meta":630,"style":630},[550,1003,1004,1022,1026],{"__ignoreMap":630},[634,1005,1006,1008,1010,1012,1014,1016,1018,1020],{"class":636,"line":637},[634,1007,641],{"class":640},[634,1009,645],{"class":644},[634,1011,649],{"class":648},[634,1013,652],{"class":644},[634,1015,655],{"class":640},[634,1017,658],{"class":644},[634,1019,662],{"class":661},[634,1021,665],{"class":644},[634,1023,1024],{"class":636,"line":689},[634,1025,712],{"emptyLinePlaceholder":711},[634,1027,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048,1050,1052],{"class":636,"line":708},[634,1029,969],{"class":648},[634,1031,752],{"class":644},[634,1033,974],{"class":724},[634,1035,728],{"class":648},[634,1037,979],{"class":724},[634,1039,728],{"class":648},[634,1041,984],{"class":644},[634,1043,987],{"class":763},[634,1045,887],{"class":644},[634,1047,649],{"class":724},[634,1049,994],{"class":648},[634,1051,785],{"class":644},[634,1053,999],{"class":648},[624,1055,1057],{"className":626,"code":1056,"filename":266,"language":629,"meta":630,"style":630},"import { createFsDrain } from 'evlog\u002Ffs'\n\nawait app.register(evlog, { drain: createFsDrain() })\n",[550,1058,1059,1077,1081],{"__ignoreMap":630},[634,1060,1061,1063,1065,1067,1069,1071,1073,1075],{"class":636,"line":637},[634,1062,641],{"class":640},[634,1064,645],{"class":644},[634,1066,649],{"class":648},[634,1068,652],{"class":644},[634,1070,655],{"class":640},[634,1072,658],{"class":644},[634,1074,662],{"class":661},[634,1076,665],{"class":644},[634,1078,1079],{"class":636,"line":689},[634,1080,712],{"emptyLinePlaceholder":711},[634,1082,1083,1086,1089,1091,1094,1097,1099,1101,1103,1105,1107,1109,1111],{"class":636,"line":708},[634,1084,1085],{"class":640},"await",[634,1087,1088],{"class":648}," app",[634,1090,752],{"class":644},[634,1092,1093],{"class":724},"register",[634,1095,1096],{"class":648},"(evlog",[634,1098,774],{"class":644},[634,1100,645],{"class":644},[634,1102,987],{"class":763},[634,1104,887],{"class":644},[634,1106,649],{"class":724},[634,1108,994],{"class":648},[634,1110,785],{"class":644},[634,1112,788],{"class":648},[624,1114,1115],{"className":626,"code":940,"filename":271,"language":629,"meta":630,"style":630},[550,1116,1117,1135,1139],{"__ignoreMap":630},[634,1118,1119,1121,1123,1125,1127,1129,1131,1133],{"class":636,"line":637},[634,1120,641],{"class":640},[634,1122,645],{"class":644},[634,1124,649],{"class":648},[634,1126,652],{"class":644},[634,1128,655],{"class":640},[634,1130,658],{"class":644},[634,1132,662],{"class":661},[634,1134,665],{"class":644},[634,1136,1137],{"class":636,"line":689},[634,1138,712],{"emptyLinePlaceholder":711},[634,1140,1141,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163,1165],{"class":636,"line":708},[634,1142,969],{"class":648},[634,1144,752],{"class":644},[634,1146,974],{"class":724},[634,1148,728],{"class":648},[634,1150,979],{"class":724},[634,1152,728],{"class":648},[634,1154,984],{"class":644},[634,1156,987],{"class":763},[634,1158,887],{"class":644},[634,1160,649],{"class":724},[634,1162,994],{"class":648},[634,1164,785],{"class":644},[634,1166,999],{"class":648},[624,1168,1170],{"className":626,"code":1169,"filename":251,"language":629,"meta":630,"style":630},"import { createFsDrain } from 'evlog\u002Ffs'\n\nEvlogModule.forRoot({ drain: createFsDrain() })\n",[550,1171,1172,1190,1194],{"__ignoreMap":630},[634,1173,1174,1176,1178,1180,1182,1184,1186,1188],{"class":636,"line":637},[634,1175,641],{"class":640},[634,1177,645],{"class":644},[634,1179,649],{"class":648},[634,1181,652],{"class":644},[634,1183,655],{"class":640},[634,1185,658],{"class":644},[634,1187,662],{"class":661},[634,1189,665],{"class":644},[634,1191,1192],{"class":636,"line":689},[634,1193,712],{"emptyLinePlaceholder":711},[634,1195,1196,1199,1201,1204,1206,1208,1210,1212,1214,1216,1218],{"class":636,"line":708},[634,1197,1198],{"class":648},"EvlogModule",[634,1200,752],{"class":644},[634,1202,1203],{"class":724},"forRoot",[634,1205,728],{"class":648},[634,1207,984],{"class":644},[634,1209,987],{"class":763},[634,1211,887],{"class":644},[634,1213,649],{"class":724},[634,1215,994],{"class":648},[634,1217,785],{"class":644},[634,1219,788],{"class":648},[624,1221,1223],{"className":626,"code":1222,"filename":286,"language":629,"meta":630,"style":630},"import { createFsDrain } from 'evlog\u002Ffs'\n\ninitLogger({ drain: createFsDrain() })\n",[550,1224,1225,1243,1247],{"__ignoreMap":630},[634,1226,1227,1229,1231,1233,1235,1237,1239,1241],{"class":636,"line":637},[634,1228,641],{"class":640},[634,1230,645],{"class":644},[634,1232,649],{"class":648},[634,1234,652],{"class":644},[634,1236,655],{"class":640},[634,1238,658],{"class":644},[634,1240,662],{"class":661},[634,1242,665],{"class":644},[634,1244,1245],{"class":636,"line":689},[634,1246,712],{"emptyLinePlaceholder":711},[634,1248,1249,1252,1254,1256,1258,1260,1262,1264,1266],{"class":636,"line":708},[634,1250,1251],{"class":724},"initLogger",[634,1253,728],{"class":648},[634,1255,984],{"class":644},[634,1257,987],{"class":763},[634,1259,887],{"class":644},[634,1261,649],{"class":724},[634,1263,994],{"class":648},[634,1265,785],{"class":644},[634,1267,788],{"class":648},[535,1269,1270,1271,1273],{},"Logs start appearing in ",[550,1272,552],{}," immediately.",[617,1275,1277],{"id":1276},"file-structure","File Structure",[624,1279,1285],{"className":1280,"code":1282,"filename":1283,"language":1284,"meta":630},[1281],"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",[550,1286,1282],{"__ignoreMap":630},[535,1288,1289,1290,1293],{},"Each ",[550,1291,1292],{},".jsonl"," file contains one JSON object per line (NDJSON format), making it easy to parse, grep, and stream.",[921,1295,1298,1299,1302,1303,1306,1307,1310],{"color":1296,"icon":1297},"success","i-lucide-git-branch","A ",[550,1300,1301],{},".gitignore"," is automatically created on first write, inside the ",[550,1304,1305],{},".evlog\u002F"," ancestor directory when present or in the configured ",[550,1308,1309],{},"dir"," otherwise. Log files are never committed to version control.",[617,1312,501],{"id":1313},"configuration",[1315,1316,332],"h3",{"id":1317},"options",[1319,1320,1321,1340],"table",{},[1322,1323,1324],"thead",{},[1325,1326,1327,1331,1334,1337],"tr",{},[1328,1329,1330],"th",{},"Option",[1328,1332,1333],{},"Type",[1328,1335,1336],{},"Default",[1328,1338,1339],{},"Description",[1341,1342,1343,1363,1383,1401],"tbody",{},[1325,1344,1345,1350,1355,1360],{},[1346,1347,1348],"td",{},[550,1349,1309],{},[1346,1351,1352],{},[550,1353,1354],{},"string",[1346,1356,1357],{},[550,1358,1359],{},"'.evlog\u002Flogs'",[1346,1361,1362],{},"Directory for log files",[1325,1364,1365,1370,1375,1380],{},[1346,1366,1367],{},[550,1368,1369],{},"maxFiles",[1346,1371,1372],{},[550,1373,1374],{},"number",[1346,1376,1377],{},[550,1378,1379],{},"undefined",[1346,1381,1382],{},"Max files to keep (auto-deletes oldest)",[1325,1384,1385,1390,1394,1398],{},[1346,1386,1387],{},[550,1388,1389],{},"maxSizePerFile",[1346,1391,1392],{},[550,1393,1374],{},[1346,1395,1396],{},[550,1397,1379],{},[1346,1399,1400],{},"Max bytes per file before rotating",[1325,1402,1403,1408,1413,1418],{},[1346,1404,1405],{},[550,1406,1407],{},"pretty",[1346,1409,1410],{},[550,1411,1412],{},"boolean",[1346,1414,1415],{},[550,1416,1417],{},"false",[1346,1419,1420],{},"Pretty-print JSON (multi-line, readable)",[1315,1422,1424],{"id":1423},"examples","Examples",[624,1426,1429],{"className":626,"code":1427,"filename":1428,"language":629,"meta":630,"style":630},"\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",[550,1430,1431,1436,1458,1462,1467,1475,1497,1509,1515,1520,1526,1548,1553,1559],{"__ignoreMap":630},[634,1432,1433],{"class":636,"line":637},[634,1434,1435],{"class":685},"\u002F\u002F Keep only the last 7 days of logs\n",[634,1437,1438,1441,1443,1445,1448,1450,1454,1456],{"class":636,"line":689},[634,1439,1440],{"class":724},"createFsDrain",[634,1442,728],{"class":648},[634,1444,984],{"class":644},[634,1446,1447],{"class":763}," maxFiles",[634,1449,887],{"class":644},[634,1451,1453],{"class":1452},"sbssI"," 7",[634,1455,652],{"class":644},[634,1457,788],{"class":648},[634,1459,1460],{"class":636,"line":708},[634,1461,712],{"emptyLinePlaceholder":711},[634,1463,1464],{"class":636,"line":715},[634,1465,1466],{"class":685},"\u002F\u002F Rotate files at 10MB, keep 30 files\n",[634,1468,1469,1471,1473],{"class":636,"line":746},[634,1470,1440],{"class":724},[634,1472,728],{"class":648},[634,1474,879],{"class":644},[634,1476,1477,1480,1482,1485,1488,1491,1493,1495],{"class":636,"line":782},[634,1478,1479],{"class":763},"  maxSizePerFile",[634,1481,887],{"class":644},[634,1483,1484],{"class":1452}," 10",[634,1486,1487],{"class":644}," *",[634,1489,1490],{"class":1452}," 1024",[634,1492,1487],{"class":644},[634,1494,1490],{"class":1452},[634,1496,897],{"class":644},[634,1498,1499,1502,1504,1507],{"class":636,"line":900},[634,1500,1501],{"class":763},"  maxFiles",[634,1503,887],{"class":644},[634,1505,1506],{"class":1452}," 30",[634,1508,897],{"class":644},[634,1510,1511,1513],{"class":636,"line":915},[634,1512,785],{"class":644},[634,1514,788],{"class":648},[634,1516,1518],{"class":636,"line":1517},9,[634,1519,712],{"emptyLinePlaceholder":711},[634,1521,1523],{"class":636,"line":1522},10,[634,1524,1525],{"class":685},"\u002F\u002F Pretty-print for human reading\n",[634,1527,1529,1531,1533,1535,1538,1540,1544,1546],{"class":636,"line":1528},11,[634,1530,1440],{"class":724},[634,1532,728],{"class":648},[634,1534,984],{"class":644},[634,1536,1537],{"class":763}," pretty",[634,1539,887],{"class":644},[634,1541,1543],{"class":1542},"sfNiH"," true",[634,1545,652],{"class":644},[634,1547,788],{"class":648},[634,1549,1551],{"class":636,"line":1550},12,[634,1552,712],{"emptyLinePlaceholder":711},[634,1554,1556],{"class":636,"line":1555},13,[634,1557,1558],{"class":685},"\u002F\u002F Custom directory\n",[634,1560,1562,1564,1566,1568,1571,1573,1575,1578,1580,1582],{"class":636,"line":1561},14,[634,1563,1440],{"class":724},[634,1565,728],{"class":648},[634,1567,984],{"class":644},[634,1569,1570],{"class":763}," dir",[634,1572,887],{"class":644},[634,1574,658],{"class":644},[634,1576,1577],{"class":661},"\u002Fvar\u002Flog\u002Fmyapp",[634,1579,766],{"class":644},[634,1581,652],{"class":644},[634,1583,788],{"class":648},[1315,1585,1587],{"id":1586},"file-rotation","File Rotation",[535,1589,1590,1591,1594,1595,1597],{},"By default, a new file is created each day (",[550,1592,1593],{},"2026-03-14.jsonl","). When ",[550,1596,1389],{}," is set, the adapter creates suffixed files when the current file exceeds the limit:",[624,1599,1603],{"className":1600,"code":1601,"filename":1602,"language":1284,"meta":630},[1281],".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",[550,1604,1601],{"__ignoreMap":630},[1315,1606,1608],{"id":1607},"cleanup","Cleanup",[535,1610,1611,1612,1614,1615,1617],{},"When ",[550,1613,1369],{}," is set, the adapter automatically deletes the oldest ",[550,1616,1292],{}," files after each write, keeping only the most recent files.",[617,1619,1621],{"id":1620},"combining-with-network-drains","Combining with Network Drains",[535,1623,1624],{},"Use the FS adapter alongside a network drain for local backup:",[624,1626,1628],{"className":626,"code":1627,"filename":1428,"language":629,"meta":630,"style":630},"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",[550,1629,1630,1648,1668,1672,1699,1713,1717,1741,1779],{"__ignoreMap":630},[634,1631,1632,1634,1636,1638,1640,1642,1644,1646],{"class":636,"line":637},[634,1633,641],{"class":640},[634,1635,645],{"class":644},[634,1637,649],{"class":648},[634,1639,652],{"class":644},[634,1641,655],{"class":640},[634,1643,658],{"class":644},[634,1645,662],{"class":661},[634,1647,665],{"class":644},[634,1649,1650,1652,1654,1657,1659,1661,1663,1666],{"class":636,"line":689},[634,1651,641],{"class":640},[634,1653,645],{"class":644},[634,1655,1656],{"class":648}," createAxiomDrain",[634,1658,652],{"class":644},[634,1660,655],{"class":640},[634,1662,658],{"class":644},[634,1664,1665],{"class":661},"evlog\u002Faxiom",[634,1667,665],{"class":644},[634,1669,1670],{"class":636,"line":708},[634,1671,712],{"emptyLinePlaceholder":711},[634,1673,1674,1677,1680,1683,1685,1687,1689,1691,1693,1695,1697],{"class":636,"line":715},[634,1675,1676],{"class":739},"const",[634,1678,1679],{"class":648}," fs ",[634,1681,1682],{"class":644},"=",[634,1684,649],{"class":724},[634,1686,728],{"class":648},[634,1688,984],{"class":644},[634,1690,1447],{"class":763},[634,1692,887],{"class":644},[634,1694,1453],{"class":1452},[634,1696,652],{"class":644},[634,1698,788],{"class":648},[634,1700,1701,1703,1706,1708,1710],{"class":636,"line":746},[634,1702,1676],{"class":739},[634,1704,1705],{"class":648}," axiom ",[634,1707,1682],{"class":644},[634,1709,1656],{"class":724},[634,1711,1712],{"class":648},"()\n",[634,1714,1715],{"class":636,"line":782},[634,1716,712],{"emptyLinePlaceholder":711},[634,1718,1719,1721,1724,1726,1729,1732,1735,1737,1739],{"class":636,"line":900},[634,1720,1676],{"class":739},[634,1722,1723],{"class":648}," drain ",[634,1725,1682],{"class":644},[634,1727,1728],{"class":739}," async",[634,1730,1731],{"class":644}," (",[634,1733,1734],{"class":733},"ctx",[634,1736,563],{"class":644},[634,1738,740],{"class":739},[634,1740,743],{"class":644},[634,1742,1743,1746,1750,1752,1755,1758,1761,1763,1765,1767,1769,1772,1774,1776],{"class":636,"line":915},[634,1744,1745],{"class":640},"  await",[634,1747,1749],{"class":1748},"sBMFI"," Promise",[634,1751,752],{"class":644},[634,1753,1754],{"class":724},"allSettled",[634,1756,1757],{"class":763},"([",[634,1759,1760],{"class":724},"fs",[634,1762,728],{"class":763},[634,1764,1734],{"class":648},[634,1766,563],{"class":763},[634,1768,774],{"class":644},[634,1770,1771],{"class":724}," axiom",[634,1773,728],{"class":763},[634,1775,1734],{"class":648},[634,1777,1778],{"class":763},")])\n",[634,1780,1781],{"class":636,"line":1517},[634,1782,1783],{"class":644},"}\n",[617,1785,1787],{"id":1786},"querying-logs","Querying Logs",[1315,1789,1791],{"id":1790},"stream-in-real-time","Stream in real-time",[624,1793,1798],{"className":1794,"code":1795,"filename":1796,"language":1797,"meta":630,"style":630},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tail -f .evlog\u002Flogs\u002F2026-03-14.jsonl\n","Terminal","bash",[550,1799,1800],{"__ignoreMap":630},[634,1801,1802,1805,1808],{"class":636,"line":637},[634,1803,1804],{"class":1748},"tail",[634,1806,1807],{"class":661}," -f",[634,1809,1810],{"class":661}," .evlog\u002Flogs\u002F2026-03-14.jsonl\n",[1315,1812,1814],{"id":1813},"search-with-jq","Search with jq",[624,1816,1818],{"className":1794,"code":1817,"filename":1796,"language":1797,"meta":630,"style":630},"# 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",[550,1819,1820,1825,1846,1850,1855,1872,1876,1881],{"__ignoreMap":630},[634,1821,1822],{"class":636,"line":637},[634,1823,1824],{"class":685},"# Find errors\n",[634,1826,1827,1830,1833,1836,1839,1841,1844],{"class":636,"line":689},[634,1828,1829],{"class":1748},"cat",[634,1831,1832],{"class":661}," .evlog\u002Flogs\u002F2026-03-14.jsonl",[634,1834,1835],{"class":644}," |",[634,1837,1838],{"class":1748}," jq",[634,1840,658],{"class":644},[634,1842,1843],{"class":661},"select(.level == \"error\")",[634,1845,665],{"class":644},[634,1847,1848],{"class":636,"line":708},[634,1849,712],{"emptyLinePlaceholder":711},[634,1851,1852],{"class":636,"line":715},[634,1853,1854],{"class":685},"# Slow requests (over 1s)\n",[634,1856,1857,1859,1861,1863,1865,1867,1870],{"class":636,"line":746},[634,1858,1829],{"class":1748},[634,1860,1832],{"class":661},[634,1862,1835],{"class":644},[634,1864,1838],{"class":1748},[634,1866,658],{"class":644},[634,1868,1869],{"class":661},"select(.durationMs > 1000)",[634,1871,665],{"class":644},[634,1873,1874],{"class":636,"line":782},[634,1875,712],{"emptyLinePlaceholder":711},[634,1877,1878],{"class":636,"line":900},[634,1879,1880],{"class":685},"# Requests by path\n",[634,1882,1883,1885,1887,1889,1891,1893,1896],{"class":636,"line":915},[634,1884,1829],{"class":1748},[634,1886,1832],{"class":661},[634,1888,1835],{"class":644},[634,1890,1838],{"class":1748},[634,1892,658],{"class":644},[634,1894,1895],{"class":661},"select(.path == \"\u002Fapi\u002Fcheckout\")",[634,1897,665],{"class":644},[1315,1899,1901],{"id":1900},"search-with-grep","Search with grep",[624,1903,1905],{"className":1794,"code":1904,"filename":1796,"language":1797,"meta":630,"style":630},"# 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",[550,1906,1907,1912,1926,1930,1935],{"__ignoreMap":630},[634,1908,1909],{"class":636,"line":637},[634,1910,1911],{"class":685},"# Find all errors\n",[634,1913,1914,1917,1919,1922,1924],{"class":636,"line":689},[634,1915,1916],{"class":1748},"grep",[634,1918,658],{"class":644},[634,1920,1921],{"class":661},"\"level\":\"error\"",[634,1923,766],{"class":644},[634,1925,1810],{"class":661},[634,1927,1928],{"class":636,"line":708},[634,1929,712],{"emptyLinePlaceholder":711},[634,1931,1932],{"class":636,"line":715},[634,1933,1934],{"class":685},"# Find by request ID\n",[634,1936,1937,1939,1941,1944,1946,1949,1952],{"class":636,"line":746},[634,1938,1916],{"class":1748},[634,1940,658],{"class":644},[634,1942,1943],{"class":661},"req_abc123",[634,1945,766],{"class":644},[634,1947,1948],{"class":661}," .evlog\u002Flogs\u002F",[634,1950,1951],{"class":648},"*",[634,1953,1954],{"class":661},".jsonl\n",[617,1956,1958],{"id":1957},"direct-api-usage","Direct API Usage",[535,1960,1961],{},"For advanced use cases, use the lower-level write functions:",[624,1963,1965],{"className":626,"code":1964,"filename":628,"language":629,"meta":630,"style":630},"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",[550,1966,1967,1991,1995,2008,2024,2036,2042,2046,2059,2073,2083],{"__ignoreMap":630},[634,1968,1969,1971,1973,1976,1978,1981,1983,1985,1987,1989],{"class":636,"line":637},[634,1970,641],{"class":640},[634,1972,645],{"class":644},[634,1974,1975],{"class":648}," writeToFs",[634,1977,774],{"class":644},[634,1979,1980],{"class":648}," writeBatchToFs",[634,1982,652],{"class":644},[634,1984,655],{"class":640},[634,1986,658],{"class":644},[634,1988,662],{"class":661},[634,1990,665],{"class":644},[634,1992,1993],{"class":636,"line":689},[634,1994,712],{"emptyLinePlaceholder":711},[634,1996,1997,1999,2001,2004,2006],{"class":636,"line":708},[634,1998,1085],{"class":640},[634,2000,1975],{"class":724},[634,2002,2003],{"class":648},"(event",[634,2005,774],{"class":644},[634,2007,743],{"class":644},[634,2009,2010,2013,2015,2017,2020,2022],{"class":636,"line":715},[634,2011,2012],{"class":763},"  dir",[634,2014,887],{"class":644},[634,2016,658],{"class":644},[634,2018,2019],{"class":661},".evlog\u002Flogs",[634,2021,766],{"class":644},[634,2023,897],{"class":644},[634,2025,2026,2029,2031,2034],{"class":636,"line":746},[634,2027,2028],{"class":763},"  pretty",[634,2030,887],{"class":644},[634,2032,2033],{"class":1542}," false",[634,2035,897],{"class":644},[634,2037,2038,2040],{"class":636,"line":782},[634,2039,785],{"class":644},[634,2041,788],{"class":648},[634,2043,2044],{"class":636,"line":900},[634,2045,712],{"emptyLinePlaceholder":711},[634,2047,2048,2050,2052,2055,2057],{"class":636,"line":915},[634,2049,1085],{"class":640},[634,2051,1980],{"class":724},[634,2053,2054],{"class":648},"(events",[634,2056,774],{"class":644},[634,2058,743],{"class":644},[634,2060,2061,2063,2065,2067,2069,2071],{"class":636,"line":1517},[634,2062,2012],{"class":763},[634,2064,887],{"class":644},[634,2066,658],{"class":644},[634,2068,2019],{"class":661},[634,2070,766],{"class":644},[634,2072,897],{"class":644},[634,2074,2075,2077,2079,2081],{"class":636,"line":1522},[634,2076,2028],{"class":763},[634,2078,887],{"class":644},[634,2080,2033],{"class":1542},[634,2082,897],{"class":644},[634,2084,2085,2087],{"class":636,"line":1528},[634,2086,785],{"class":644},[634,2088,788],{"class":648},[617,2090,2092],{"id":2091},"ai-log-analysis","AI Log Analysis",[535,2094,2095,2096,2102],{},"The file system drain pairs with the ",[606,2097,2098,2101],{"href":522},[550,2099,2100],{},"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.",[617,2104,2106],{"id":2105},"next-steps","Next Steps",[539,2108,2109,2114,2120,2126],{},[542,2110,2111,2113],{},[606,2112,521],{"href":522}," - Let AI analyze your logs",[542,2115,2116,2119],{},[606,2117,2118],{"href":148},"Axiom Adapter"," - Send logs to Axiom for querying and dashboards",[542,2121,2122,2125],{},[606,2123,2124],{"href":493},"Pipeline"," - Add batching and retry to any drain",[542,2127,2128,2131],{},[606,2129,2130],{"href":488},"Custom Adapters"," - Build your own adapter",[2133,2134,2135],"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":630,"searchDepth":689,"depth":689,"links":2137},[2138,2139,2140,2141,2147,2148,2153,2154,2155],{"id":619,"depth":689,"text":19},{"id":668,"depth":689,"text":24},{"id":1276,"depth":689,"text":1277},{"id":1313,"depth":689,"text":501,"children":2142},[2143,2144,2145,2146],{"id":1317,"depth":708,"text":332},{"id":1423,"depth":708,"text":1424},{"id":1586,"depth":708,"text":1587},{"id":1607,"depth":708,"text":1608},{"id":1620,"depth":689,"text":1621},{"id":1786,"depth":689,"text":1787,"children":2149},[2150,2151,2152],{"id":1790,"depth":708,"text":1791},{"id":1813,"depth":708,"text":1814},{"id":1900,"depth":708,"text":1901},{"id":1957,"depth":689,"text":1958},{"id":2091,"depth":689,"text":2092},{"id":2105,"depth":689,"text":2106},"Write wide events to the local file system as NDJSON for local debugging, AI agent integration, and production backup.","md",[2159,2166],{"label":2160,"icon":2161,"to":2162,"target":2163,"color":2164,"variant":2165},"NDJSON Format","i-lucide-external-link","https:\u002F\u002Fgithub.com\u002Fndjson\u002Fndjson-spec","_blank","neutral","subtle",{"label":2118,"icon":150,"to":148,"color":2164,"variant":2165},{},{"title":202,"icon":205},{"title":530,"description":2156},"Atph9m36yikF0qLigVtspOOYu-hzA8P1AaGKGrlWmP8",[2172,2174],{"title":192,"path":193,"stem":194,"description":2173,"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":2175,"icon":210,"children":-1},"Self-hosted retention using NuxtHub database storage. Store, query, and clean up your wide events with no external dependency.",1786793473358]