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