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