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