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