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