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