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