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