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