[{"data":1,"prerenderedAt":1155},["ShallowReactive",2],{"navigation_docs":3,"-extend-fs-reader":439,"-extend-fs-reader-surround":1150},[4,30,80,245,353,408],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"Integrate","\u002Fintegrate","3.integrate",[85,89,157],{"title":36,"path":86,"stem":87,"icon":88},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":90,"path":91,"stem":92,"children":93,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[94,97,137],{"title":36,"path":95,"stem":96,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":98,"path":99,"stem":100,"children":101,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[102,107,112,117,122,127,132],{"title":103,"path":104,"stem":105,"icon":106},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":108,"path":109,"stem":110,"icon":111},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":113,"path":114,"stem":115,"icon":116},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":118,"path":119,"stem":120,"icon":121},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":123,"path":124,"stem":125,"icon":126},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":128,"path":129,"stem":130,"icon":131},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":133,"path":134,"stem":135,"icon":136},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[142,147,152],{"title":143,"path":144,"stem":145,"icon":146},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":148,"path":149,"stem":150,"icon":151},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":153,"path":154,"stem":155,"icon":156},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","3.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":158,"path":159,"stem":160,"children":161,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[162,166,171,176,181,186,191,196,201,206,211,216,221,226,230,235,240],{"title":36,"path":163,"stem":164,"icon":165},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":167,"path":168,"stem":169,"icon":170},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":172,"path":173,"stem":174,"icon":175},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":182,"path":183,"stem":184,"icon":185},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":187,"path":188,"stem":189,"icon":190},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":192,"path":193,"stem":194,"icon":195},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":197,"path":198,"stem":199,"icon":200},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":202,"path":203,"stem":204,"icon":205},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":207,"path":208,"stem":209,"icon":210},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":212,"path":213,"stem":214,"icon":215},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":217,"path":218,"stem":219,"icon":220},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":222,"path":223,"stem":224,"icon":225},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":227,"path":228,"stem":229,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":231,"path":232,"stem":233,"icon":234},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":236,"path":237,"stem":238,"icon":239},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":241,"path":242,"stem":243,"icon":244},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":246,"path":247,"stem":248,"children":249,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[250,254,259,288,316,348],{"title":36,"path":251,"stem":252,"icon":253},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":255,"path":256,"stem":257,"icon":258},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[265,268,273,278,283],{"title":36,"path":266,"stem":267,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":269,"path":270,"stem":271,"icon":272},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":274,"path":275,"stem":276,"icon":277},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":279,"path":280,"stem":281,"icon":282},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":284,"path":285,"stem":286,"icon":287},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[294,297,302,307,311],{"title":36,"path":295,"stem":296,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":298,"path":299,"stem":300,"icon":301},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":303,"path":304,"stem":305,"icon":306},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":308,"path":309,"stem":310,"icon":258},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":312,"path":313,"stem":314,"icon":315},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":317,"icon":318,"path":319,"stem":320,"children":321,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[322,325,330,335,340,344],{"title":36,"path":323,"stem":324,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":326,"path":327,"stem":328,"icon":329},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":331,"path":332,"stem":333,"icon":334},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":336,"path":337,"stem":338,"icon":339},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":341,"path":342,"stem":343,"icon":318},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":345,"path":346,"stem":347,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":349,"path":350,"stem":351,"icon":352},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":354,"path":355,"stem":356,"children":357,"page":29},"Extend","\u002Fextend","5.extend",[358,362,367,372,377,381,385,389,393,398,403],{"title":36,"path":359,"stem":360,"icon":361},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":363,"path":364,"stem":365,"icon":366},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":368,"path":369,"stem":370,"icon":371},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":373,"path":374,"stem":375,"icon":376},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":378,"stem":379,"icon":380},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":382,"path":383,"stem":384,"icon":361},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":386,"path":387,"stem":388,"icon":352},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":390,"path":391,"stem":392,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":394,"path":395,"stem":396,"icon":397},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":399,"path":400,"stem":401,"icon":402},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":404,"path":405,"stem":406,"icon":407},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":409,"path":410,"stem":411,"children":412,"page":29},"Reference","\u002Freference","6.reference",[413,418,421,426,430,435],{"title":414,"path":415,"stem":416,"icon":417},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":419,"stem":420,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":422,"path":423,"stem":424,"icon":425},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":427,"path":428,"stem":429,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":431,"path":432,"stem":433,"icon":434},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":436,"path":437,"stem":438,"icon":352},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":440,"title":373,"body":441,"description":1143,"extension":1144,"links":1145,"meta":1146,"navigation":1147,"path":374,"seo":1148,"stem":375,"__hash__":1149},"docs\u002F5.extend\u002F2.fs-reader.md",{"type":442,"value":443,"toc":1134},"minimark",[444,479,482,556,561,729,735,739,840,843,847,1017,1027,1031,1089,1098,1102,1130],[445,446,447,448,452,453,457,458,461,462,465,466,469,470,473,474,478],"p",{},"The ",[449,450,451],"a",{"href":144},"filesystem drain"," writes wide events as NDJSON to ",[454,455,456],"code",{},".jsonl"," files under ",[454,459,460],{},".evlog\u002Flogs\u002F"," (one file per day, e.g. ",[454,463,464],{},"2026-05-08.jsonl",", plus rotation suffixes like ",[454,467,468],{},".1.jsonl"," when size-based rotation is enabled). The ",[454,471,472],{},"evlog\u002Ffs"," module also ships ",[475,476,477],"strong",{},"readers"," that let any Node tool replay or follow that history without hooking into the running app.",[480,481],"ndjson-tail",{},[483,484,487,490,548],"prompt",{":actions":485,"description":486,"icon":376},"[\"copy\",\"cursor\",\"windsurf\"]","Read or tail evlog NDJSON logs from disk",[445,488,489],{},"Build a script that consumes evlog's local NDJSON history (no app hook required).",[491,492,493,504,517,527,545],"ul",{},[494,495,496,497,499,500,503],"li",{},"Confirm the filesystem drain is wired up (",[454,498,472],{}," adapter writing NDJSON to ",[454,501,502],{},".evlog\u002Flogs\u002F*.jsonl",")",[494,505,506,507,510,511,513,514],{},"For replay: import ",[454,508,509],{},"readFsLogs"," from ",[454,512,472],{}," and iterate ",[454,515,516],{},"for await (const event of readFsLogs({ since, until, level, filter }))",[494,518,519,520,523,524],{},"For follow mode: import ",[454,521,522],{},"tailFsLogs"," and iterate the same way — it watches for new lines, handles rotation, and accepts an ",[454,525,526],{},"AbortSignal",[494,528,529,530,533,534,533,537,540,541,544],{},"Apply filters at read time (",[454,531,532],{},"level",", ",[454,535,536],{},"since",[454,538,539],{},"until",", custom ",[454,542,543],{},"filter"," predicate) instead of post-processing",[494,546,547],{},"Treat malformed lines as silently skipped (partial writes happen) — never crash the script on a bad line",[445,549,550,551],{},"Docs: ",[449,552,553],{"href":553,"rel":554},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Ffs-reader",[555],"nofollow",[557,558,560],"h2",{"id":559},"replay-history","Replay history",[562,563,568],"pre",{"className":564,"code":565,"language":566,"meta":567,"style":567},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { readFsLogs } from 'evlog\u002Ffs'\n\nfor await (const event of readFsLogs({ since: '2026-03-01', level: 'error' })) {\n  console.log(event.timestamp, event.action ?? event.message)\n}\n","ts","",[454,569,570,602,609,678,723],{"__ignoreMap":567},[571,572,575,579,583,587,590,593,596,599],"span",{"class":573,"line":574},"line",1,[571,576,578],{"class":577},"s7zQu","import",[571,580,582],{"class":581},"sMK4o"," {",[571,584,586],{"class":585},"sTEyZ"," readFsLogs",[571,588,589],{"class":581}," }",[571,591,592],{"class":577}," from",[571,594,595],{"class":581}," '",[571,597,472],{"class":598},"sfazB",[571,600,601],{"class":581},"'\n",[571,603,605],{"class":573,"line":604},2,[571,606,608],{"emptyLinePlaceholder":607},true,"\n",[571,610,612,615,618,621,625,628,631,634,637,640,644,647,649,652,655,658,661,663,665,668,670,672,675],{"class":573,"line":611},3,[571,613,614],{"class":577},"for",[571,616,617],{"class":577}," await",[571,619,620],{"class":585}," (",[571,622,624],{"class":623},"spNyl","const",[571,626,627],{"class":585}," event ",[571,629,630],{"class":581},"of",[571,632,586],{"class":633},"s2Zo4",[571,635,636],{"class":585},"(",[571,638,639],{"class":581},"{",[571,641,643],{"class":642},"swJcz"," since",[571,645,646],{"class":581},":",[571,648,595],{"class":581},[571,650,651],{"class":598},"2026-03-01",[571,653,654],{"class":581},"'",[571,656,657],{"class":581},",",[571,659,660],{"class":642}," level",[571,662,646],{"class":581},[571,664,595],{"class":581},[571,666,667],{"class":598},"error",[571,669,654],{"class":581},[571,671,589],{"class":581},[571,673,674],{"class":585},")) ",[571,676,677],{"class":581},"{\n",[571,679,681,684,687,690,692,695,697,700,702,705,707,710,713,715,717,720],{"class":573,"line":680},4,[571,682,683],{"class":585},"  console",[571,685,686],{"class":581},".",[571,688,689],{"class":633},"log",[571,691,636],{"class":642},[571,693,694],{"class":585},"event",[571,696,686],{"class":581},[571,698,699],{"class":585},"timestamp",[571,701,657],{"class":581},[571,703,704],{"class":585}," event",[571,706,686],{"class":581},[571,708,709],{"class":585},"action",[571,711,712],{"class":581}," ??",[571,714,704],{"class":585},[571,716,686],{"class":581},[571,718,719],{"class":585},"message",[571,721,722],{"class":642},")\n",[571,724,726],{"class":573,"line":725},5,[571,727,728],{"class":581},"}\n",[445,730,731,734],{},[454,732,733],{},"readFsLogs(options)"," walks the NDJSON files in chronological order, parses them line by line, and yields events that pass all filters. Files outside the date window are skipped entirely.",[736,737,274],"h3",{"id":738},"options",[740,741,742,758],"table",{},[743,744,745],"thead",{},[746,747,748,752,755],"tr",{},[749,750,751],"th",{},"Option",[749,753,754],{},"Type",[749,756,757],{},"Description",[759,760,761,780,797,812,826],"tbody",{},[746,762,763,769,774],{},[764,765,766],"td",{},[454,767,768],{},"dir",[764,770,771],{},[454,772,773],{},"string",[764,775,776,777,686],{},"Directory to read from. Default: ",[454,778,779],{},".evlog\u002Flogs",[746,781,782,786,791],{},[764,783,784],{},[454,785,536],{},[764,787,788],{},[454,789,790],{},"Date | string",[764,792,793,794,686],{},"Yield events with ",[454,795,796],{},"timestamp >= since",[746,798,799,803,807],{},[764,800,801],{},[454,802,539],{},[764,804,805],{},[454,806,790],{},[764,808,793,809,686],{},[454,810,811],{},"timestamp \u003C= until",[746,813,814,818,823],{},[764,815,816],{},[454,817,532],{},[764,819,820],{},[454,821,822],{},"LogLevel | LogLevel[]",[764,824,825],{},"Filter by event level.",[746,827,828,832,837],{},[764,829,830],{},[454,831,543],{},[764,833,834],{},[454,835,836],{},"(event) => boolean",[764,838,839],{},"Custom predicate.",[445,841,842],{},"Malformed lines (partial writes, manual edits) are silently skipped — your script never crashes on a bad line.",[557,844,846],{"id":845},"live-tail","Live tail",[562,848,850],{"className":564,"code":849,"language":566,"meta":567,"style":567},"import { tailFsLogs } from 'evlog\u002Ffs'\n\nconst ac = new AbortController()\nprocess.on('SIGINT', () => ac.abort())\n\nfor await (const event of tailFsLogs({ signal: ac.signal })) {\n  console.log('live:', event.action ?? event.message)\n}\n",[454,851,852,871,875,894,932,936,976,1012],{"__ignoreMap":567},[571,853,854,856,858,861,863,865,867,869],{"class":573,"line":574},[571,855,578],{"class":577},[571,857,582],{"class":581},[571,859,860],{"class":585}," tailFsLogs",[571,862,589],{"class":581},[571,864,592],{"class":577},[571,866,595],{"class":581},[571,868,472],{"class":598},[571,870,601],{"class":581},[571,872,873],{"class":573,"line":604},[571,874,608],{"emptyLinePlaceholder":607},[571,876,877,879,882,885,888,891],{"class":573,"line":611},[571,878,624],{"class":623},[571,880,881],{"class":585}," ac ",[571,883,884],{"class":581},"=",[571,886,887],{"class":581}," new",[571,889,890],{"class":633}," AbortController",[571,892,893],{"class":585},"()\n",[571,895,896,899,901,904,906,908,911,913,915,918,921,924,926,929],{"class":573,"line":680},[571,897,898],{"class":585},"process",[571,900,686],{"class":581},[571,902,903],{"class":633},"on",[571,905,636],{"class":585},[571,907,654],{"class":581},[571,909,910],{"class":598},"SIGINT",[571,912,654],{"class":581},[571,914,657],{"class":581},[571,916,917],{"class":581}," ()",[571,919,920],{"class":623}," =>",[571,922,923],{"class":585}," ac",[571,925,686],{"class":581},[571,927,928],{"class":633},"abort",[571,930,931],{"class":585},"())\n",[571,933,934],{"class":573,"line":725},[571,935,608],{"emptyLinePlaceholder":607},[571,937,939,941,943,945,947,949,951,953,955,957,960,962,964,966,969,972,974],{"class":573,"line":938},6,[571,940,614],{"class":577},[571,942,617],{"class":577},[571,944,620],{"class":585},[571,946,624],{"class":623},[571,948,627],{"class":585},[571,950,630],{"class":581},[571,952,860],{"class":633},[571,954,636],{"class":585},[571,956,639],{"class":581},[571,958,959],{"class":642}," signal",[571,961,646],{"class":581},[571,963,923],{"class":585},[571,965,686],{"class":581},[571,967,968],{"class":585},"signal ",[571,970,971],{"class":581},"}",[571,973,674],{"class":585},[571,975,677],{"class":581},[571,977,979,981,983,985,987,989,992,994,996,998,1000,1002,1004,1006,1008,1010],{"class":573,"line":978},7,[571,980,683],{"class":585},[571,982,686],{"class":581},[571,984,689],{"class":633},[571,986,636],{"class":642},[571,988,654],{"class":581},[571,990,991],{"class":598},"live:",[571,993,654],{"class":581},[571,995,657],{"class":581},[571,997,704],{"class":585},[571,999,686],{"class":581},[571,1001,709],{"class":585},[571,1003,712],{"class":581},[571,1005,704],{"class":585},[571,1007,686],{"class":581},[571,1009,719],{"class":585},[571,1011,722],{"class":642},[571,1013,1015],{"class":573,"line":1014},8,[571,1016,728],{"class":581},[445,1018,1019,1022,1023,1026],{},[454,1020,1021],{},"tailFsLogs(options)"," first yields existing events (unless ",[454,1024,1025],{},"fromEnd: true","), then keeps yielding new ones as they're appended — including events written into newly created daily files. Partial writes split across polls are recombined transparently.",[736,1028,1030],{"id":1029},"tail-specific-options","Tail-specific options",[740,1032,1033,1043],{},[743,1034,1035],{},[746,1036,1037,1039,1041],{},[749,1038,751],{},[749,1040,754],{},[749,1042,757],{},[759,1044,1045,1060,1075],{},[746,1046,1047,1052,1057],{},[764,1048,1049],{},[454,1050,1051],{},"pollIntervalMs",[764,1053,1054],{},[454,1055,1056],{},"number",[764,1058,1059],{},"Polling interval. Default: 500ms (minimum 50ms).",[746,1061,1062,1067,1072],{},[764,1063,1064],{},[454,1065,1066],{},"fromEnd",[764,1068,1069],{},[454,1070,1071],{},"boolean",[764,1073,1074],{},"Skip existing events; only yield future ones. Default: false.",[746,1076,1077,1082,1086],{},[764,1078,1079],{},[454,1080,1081],{},"signal",[764,1083,1084],{},[454,1085,526],{},[764,1087,1088],{},"Stop tailing when aborted.",[445,1090,1091,1092,1097],{},"All ",[449,1093,1095],{"href":1094},"#options",[454,1096,509],{}," options also apply.",[557,1099,1101],{"id":1100},"use-cases","Use cases",[491,1103,1104,1110,1113,1123],{},[494,1105,1106,1107,1109],{},"A local Electron \u002F Tauri dashboard reading ",[454,1108,460],{}," from a target project directory",[494,1111,1112],{},"A CI report aggregator that scans logs after a test run",[494,1114,1115,1116,1119,1120],{},"A ",[454,1117,1118],{},"grep","-style CLI that pipes filtered events into ",[454,1121,1122],{},"jq",[494,1124,1125,1126],{},"Replaying historic events into a dashboard before switching to a live in-process subscription. See the ",[449,1127,1129],{"href":1128},"\u002Fextend\u002Fconsumer-recipes#3-replay-history-then-go-live","replay-then-live recipe",[1131,1132,1133],"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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}",{"title":567,"searchDepth":604,"depth":604,"links":1135},[1136,1139,1142],{"id":559,"depth":604,"text":560,"children":1137},[1138],{"id":738,"depth":611,"text":274},{"id":845,"depth":604,"text":846,"children":1140},[1141],{"id":1029,"depth":611,"text":1030},{"id":1100,"depth":604,"text":1101},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool, survives restarts.","md",null,{},{"title":373,"icon":376},{"title":373,"description":1143},"SCzBqyBXRkVRmjoaY9V_r8Ze7mAwTSDKcXi1GrtN8HA",[1151,1153],{"title":368,"path":369,"stem":370,"description":1152,"icon":371,"children":-1},"Build evlog support for an HTTP framework (or non-HTTP runtime) without a built-in integration. Use defineFrameworkIntegration for the (ctx, next) middleware shape, or createMiddlewareLogger \u002F createRequestLogger for everything else.",{"title":345,"path":378,"stem":379,"description":1154,"icon":380,"children":-1},"Concrete copy-paste recipes — build your own minimal devtool, pipe to curl + jq, replay history then go live, and aggregate on the consumer side.",1779694508322]