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