[{"data":1,"prerenderedAt":1772},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-self-hosted-nuxthub":464,"-integrate-adapters-self-hosted-nuxthub-surround":1767},[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":1753,"extension":1754,"links":1755,"meta":1763,"navigation":1764,"path":149,"seo":1765,"stem":150,"__hash__":1766},"docs\u002F3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub.md","NuxtHub Storage",{"type":468,"value":469,"toc":1735},"minimark",[470,478,525,530,533,560,565,569,649,656,679,682,688,802,815,818,848,863,867,875,885,890,900,1119,1136,1140,1143,1161,1168,1172,1180,1283,1287,1292,1295,1300,1382,1385,1448,1452,1459,1529,1538,1542,1545,1558,1565,1594,1597,1601,1612,1697,1703,1707,1714,1718,1731],[471,472,473,477],"p",{},[474,475,476],"code",{},"@evlog\u002Fnuxthub"," stores your evlog wide events directly in your NuxtHub database. No external logging service needed. Your logs live next to your data, with automatic cleanup based on a retention policy.",[479,480,483,486,511],"prompt",{":actions":481,"description":482,"icon":151},"[\"copy\",\"cursor\",\"claude\"]","Store evlog wide events in NuxtHub",[471,484,485],{},"Store evlog wide events in my NuxtHub database (self-hosted log retention).",[487,488,489,493,496,499,502,505,508],"ul",{},[490,491,492],"li",{},"Install both modules: pnpm add @nuxthub\u002Fcore @evlog\u002Fnuxthub",[490,494,495],{},"Add @nuxthub\u002Fcore and @evlog\u002Fnuxthub to nuxt.config.ts modules (in that order)",[490,497,498],{},"Enable hub.database = true in nuxt.config.ts",[490,500,501],{},"Configure evlog.nuxthub: { retentionDays, batchSize, ... } for retention and batching",[490,503,504],{},"Run database migrations so the wide-events table is created",[490,506,507],{},"Confirm wide events are written to my NuxtHub database after triggering a request",[490,509,510],{},"For production at scale, combine with an external drain (Axiom \u002F OTLP) for long-term storage",[471,512,513,514,520,521],{},"Docs: ",[515,516,517],"a",{"href":517,"rel":518},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub",[519],"nofollow","\nNuxtHub: ",[515,522,523],{"href":523,"rel":524},"https:\u002F\u002Fhub.nuxt.com",[519],[526,527,529],"h2",{"id":528},"why-self-hosted-logs","Why Self-Hosted Logs?",[471,531,532],{},"External logging services (Axiom, Datadog, etc.) are great for production at scale. But sometimes you want:",[487,534,535,542,548,554],{},[490,536,537,541],{},[538,539,540],"strong",{},"Zero external dependencies"," - logs stored in the same database as your app",[490,543,544,547],{},[538,545,546],{},"Full data ownership"," - no third-party access to your log data",[490,549,550,553],{},[538,551,552],{},"Free tier friendly"," - no per-event pricing, just your existing database",[490,555,556,559],{},[538,557,558],{},"Development & staging"," - full log visibility without paying for a service",[471,561,562,564],{},[474,563,476],{}," works as a drop-in drain. Your existing evlog setup stays the same, you just get a database-backed storage layer on top.",[526,566,568],{"id":567},"install","Install",[570,571,572,600,616,632],"code-group",{},[573,574,580],"pre",{"className":575,"code":576,"filename":577,"language":578,"meta":579,"style":579},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","pnpm","bash","",[474,581,582],{"__ignoreMap":579},[583,584,587,590,594,597],"span",{"class":585,"line":586},"line",1,[583,588,577],{"class":589},"sBMFI",[583,591,593],{"class":592},"sfazB"," add",[583,595,596],{"class":592}," @nuxthub\u002Fcore",[583,598,599],{"class":592}," @evlog\u002Fnuxthub\n",[573,601,604],{"className":575,"code":602,"filename":603,"language":578,"meta":579,"style":579},"bun add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","bun",[474,605,606],{"__ignoreMap":579},[583,607,608,610,612,614],{"class":585,"line":586},[583,609,603],{"class":589},[583,611,593],{"class":592},[583,613,596],{"class":592},[583,615,599],{"class":592},[573,617,620],{"className":575,"code":618,"filename":619,"language":578,"meta":579,"style":579},"yarn add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","yarn",[474,621,622],{"__ignoreMap":579},[583,623,624,626,628,630],{"class":585,"line":586},[583,625,619],{"class":589},[583,627,593],{"class":592},[583,629,596],{"class":592},[583,631,599],{"class":592},[573,633,636],{"className":575,"code":634,"filename":635,"language":578,"meta":579,"style":579},"npm install @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","npm",[474,637,638],{"__ignoreMap":579},[583,639,640,642,645,647],{"class":585,"line":586},[583,641,635],{"class":589},[583,643,644],{"class":592}," install",[583,646,596],{"class":592},[583,648,599],{"class":592},[471,650,651,652,655],{},"Or with ",[474,653,654],{},"nuxi",":",[573,657,660],{"className":575,"code":658,"filename":659,"language":578,"meta":579,"style":579},"npx nuxi module add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","Terminal",[474,661,662],{"__ignoreMap":579},[583,663,664,667,670,673,675,677],{"class":585,"line":586},[583,665,666],{"class":589},"npx",[583,668,669],{"class":592}," nuxi",[583,671,672],{"class":592}," module",[583,674,593],{"class":592},[583,676,596],{"class":592},[583,678,599],{"class":592},[526,680,356],{"id":681},"setup",[471,683,684,685,655],{},"Add the module to your ",[474,686,687],{},"nuxt.config.ts",[573,689,693],{"className":690,"code":691,"filename":687,"language":692,"meta":579,"style":579},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@nuxthub\u002Fcore', '@evlog\u002Fnuxthub'],\n\n  evlog: {\n    retention: '7d',\n  },\n})\n","typescript",[474,694,695,716,752,759,770,787,793],{"__ignoreMap":579},[583,696,697,701,704,708,712],{"class":585,"line":586},[583,698,700],{"class":699},"s7zQu","export",[583,702,703],{"class":699}," default",[583,705,707],{"class":706},"s2Zo4"," defineNuxtConfig",[583,709,711],{"class":710},"sTEyZ","(",[583,713,715],{"class":714},"sMK4o","{\n",[583,717,719,723,725,728,731,734,736,739,742,744,746,749],{"class":585,"line":718},2,[583,720,722],{"class":721},"swJcz","  modules",[583,724,655],{"class":714},[583,726,727],{"class":710}," [",[583,729,730],{"class":714},"'",[583,732,733],{"class":592},"@nuxthub\u002Fcore",[583,735,730],{"class":714},[583,737,738],{"class":714},",",[583,740,741],{"class":714}," '",[583,743,476],{"class":592},[583,745,730],{"class":714},[583,747,748],{"class":710},"]",[583,750,751],{"class":714},",\n",[583,753,755],{"class":585,"line":754},3,[583,756,758],{"emptyLinePlaceholder":757},true,"\n",[583,760,762,765,767],{"class":585,"line":761},4,[583,763,764],{"class":721},"  evlog",[583,766,655],{"class":714},[583,768,769],{"class":714}," {\n",[583,771,773,776,778,780,783,785],{"class":585,"line":772},5,[583,774,775],{"class":721},"    retention",[583,777,655],{"class":714},[583,779,741],{"class":714},[583,781,782],{"class":592},"7d",[583,784,730],{"class":714},[583,786,751],{"class":714},[583,788,790],{"class":585,"line":789},6,[583,791,792],{"class":714},"  },\n",[583,794,796,799],{"class":585,"line":795},7,[583,797,798],{"class":714},"}",[583,800,801],{"class":710},")\n",[471,803,804,805,807,808,810,811,814],{},"Even if ",[474,806,476],{}," can auto-register missing modules, we recommend explicitly installing ",[474,809,733],{}," and registering it in ",[474,812,813],{},"modules"," for a clearer and more predictable setup.",[471,816,817],{},"That's it. The module automatically:",[819,820,821,831,838,845],"ol",{},[490,822,823,824,827,828,830],{},"Installs ",[474,825,826],{},"evlog\u002Fnuxt"," and ",[474,829,733],{}," if not already registered",[490,832,833,834,837],{},"Registers the ",[474,835,836],{},"evlog_events"," database schema with NuxtHub",[490,839,840,841,844],{},"Hooks into ",[474,842,843],{},"evlog:drain"," to store every event in the database",[490,846,847],{},"Schedules a cleanup task based on your retention policy",[849,850,852,855,856,859,860,862],"callout",{"color":851,"icon":13},"info",[538,853,854],{},"Prerequisites:"," Your project must use ",[515,857,148],{"href":523,"rel":858},[519]," with a database configured. ",[474,861,476],{}," uses Drizzle ORM to interact with the database.",[526,864,866],{"id":865},"how-it-works","How It Works",[573,868,873],{"className":869,"code":871,"language":872},[870],"language-text","Request → evlog wide event → evlog:drain hook → INSERT into evlog_events table\n                                                          ↓\n                          Cron task (automatic) → DELETE events older than retention\n","text",[474,874,871],{"__ignoreMap":579},[471,876,877,878,880,881,884],{},"Every wide event emitted by evlog is stored as a row in the ",[474,879,836],{}," table. The drain plugin handles both single events and batches (when used with the ",[515,882,883],{"href":431},"pipeline",").",[886,887,889],"h3",{"id":888},"database-schema","Database Schema",[471,891,892,893,895,896,899],{},"The ",[474,894,836],{}," table stores indexed columns for fast querying and a ",[474,897,898],{},"data"," JSON column for all remaining fields:",[901,902,903,919],"table",{},[904,905,906],"thead",{},[907,908,909,913,916],"tr",{},[910,911,912],"th",{},"Column",[910,914,915],{},"Type",[910,917,918],{},"Description",[920,921,922,937,951,965,979,993,1007,1021,1036,1050,1064,1078,1092,1105],"tbody",{},[907,923,924,930,934],{},[925,926,927],"td",{},[474,928,929],{},"id",[925,931,932],{},[474,933,872],{},[925,935,936],{},"UUID primary key",[907,938,939,944,948],{},[925,940,941],{},[474,942,943],{},"timestamp",[925,945,946],{},[474,947,872],{},[925,949,950],{},"Event timestamp",[907,952,953,958,962],{},[925,954,955],{},[474,956,957],{},"level",[925,959,960],{},[474,961,872],{},[925,963,964],{},"Log level (info, warn, error, debug)",[907,966,967,972,976],{},[925,968,969],{},[474,970,971],{},"service",[925,973,974],{},[474,975,872],{},[925,977,978],{},"Service name",[907,980,981,986,990],{},[925,982,983],{},[474,984,985],{},"environment",[925,987,988],{},[474,989,872],{},[925,991,992],{},"Environment (production, staging, etc.)",[907,994,995,1000,1004],{},[925,996,997],{},[474,998,999],{},"method",[925,1001,1002],{},[474,1003,872],{},[925,1005,1006],{},"HTTP method",[907,1008,1009,1014,1018],{},[925,1010,1011],{},[474,1012,1013],{},"path",[925,1015,1016],{},[474,1017,872],{},[925,1019,1020],{},"Request path",[907,1022,1023,1028,1033],{},[925,1024,1025],{},[474,1026,1027],{},"status",[925,1029,1030],{},[474,1031,1032],{},"integer",[925,1034,1035],{},"HTTP status code",[907,1037,1038,1043,1047],{},[925,1039,1040],{},[474,1041,1042],{},"duration_ms",[925,1044,1045],{},[474,1046,1032],{},[925,1048,1049],{},"Request duration in milliseconds",[907,1051,1052,1057,1061],{},[925,1053,1054],{},[474,1055,1056],{},"request_id",[925,1058,1059],{},[474,1060,872],{},[925,1062,1063],{},"Request correlation ID",[907,1065,1066,1071,1075],{},[925,1067,1068],{},[474,1069,1070],{},"source",[925,1072,1073],{},[474,1074,872],{},[925,1076,1077],{},"Event source (server, client)",[907,1079,1080,1085,1089],{},[925,1081,1082],{},[474,1083,1084],{},"error",[925,1086,1087],{},[474,1088,872],{},[925,1090,1091],{},"Error details (JSON string)",[907,1093,1094,1098,1102],{},[925,1095,1096],{},[474,1097,898],{},[925,1099,1100],{},[474,1101,872],{},[925,1103,1104],{},"All remaining event fields (JSON)",[907,1106,1107,1112,1116],{},[925,1108,1109],{},[474,1110,1111],{},"created_at",[925,1113,1114],{},[474,1115,872],{},[925,1117,1118],{},"Row insertion timestamp",[471,1120,1121,1122,1124,1125,1124,1127,1124,1129,1124,1131,1124,1133,1135],{},"Indexed columns: ",[474,1123,943],{},", ",[474,1126,957],{},[474,1128,971],{},[474,1130,1027],{},[474,1132,1056],{},[474,1134,1111],{},".",[886,1137,1139],{"id":1138},"dialect-support","Dialect Support",[471,1141,1142],{},"The schema is automatically registered for your NuxtHub database dialect:",[487,1144,1145,1151,1156],{},[490,1146,1147,1150],{},[538,1148,1149],{},"SQLite"," (default for Cloudflare D1)",[490,1152,1153],{},[538,1154,1155],{},"MySQL",[490,1157,1158],{},[538,1159,1160],{},"PostgreSQL",[471,1162,1163,1164,1167],{},"The correct schema is selected via the ",[474,1165,1166],{},"hub:db:schema:extend"," hook based on your NuxtHub configuration.",[526,1169,1171],{"id":1170},"combining-with-external-adapters","Combining with External Adapters",[471,1173,1174,1176,1177,1179],{},[474,1175,476],{}," doesn't replace external adapters, you can use both. The module registers its own ",[474,1178,843],{}," hook, so any other drain plugins you have will still work:",[573,1181,1184],{"className":690,"code":1182,"filename":1183,"language":692,"meta":579,"style":579},"import { createAxiomDrain } from 'evlog\u002Faxiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  \u002F\u002F This runs alongside @evlog\u002Fnuxthub's built-in drain\n  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())\n})\n","server\u002Fplugins\u002Fevlog-drain.ts",[474,1185,1186,1211,1215,1241,1247,1277],{"__ignoreMap":579},[583,1187,1188,1191,1194,1197,1200,1203,1205,1208],{"class":585,"line":586},[583,1189,1190],{"class":699},"import",[583,1192,1193],{"class":714}," {",[583,1195,1196],{"class":710}," createAxiomDrain",[583,1198,1199],{"class":714}," }",[583,1201,1202],{"class":699}," from",[583,1204,741],{"class":714},[583,1206,1207],{"class":592},"evlog\u002Faxiom",[583,1209,1210],{"class":714},"'\n",[583,1212,1213],{"class":585,"line":718},[583,1214,758],{"emptyLinePlaceholder":757},[583,1216,1217,1219,1221,1224,1226,1228,1232,1235,1239],{"class":585,"line":754},[583,1218,700],{"class":699},[583,1220,703],{"class":699},[583,1222,1223],{"class":706}," defineNitroPlugin",[583,1225,711],{"class":710},[583,1227,711],{"class":714},[583,1229,1231],{"class":1230},"sHdIc","nitroApp",[583,1233,1234],{"class":714},")",[583,1236,1238],{"class":1237},"spNyl"," =>",[583,1240,769],{"class":714},[583,1242,1243],{"class":585,"line":761},[583,1244,1246],{"class":1245},"sHwdD","  \u002F\u002F This runs alongside @evlog\u002Fnuxthub's built-in drain\n",[583,1248,1249,1252,1254,1257,1259,1262,1264,1266,1268,1270,1272,1274],{"class":585,"line":772},[583,1250,1251],{"class":710},"  nitroApp",[583,1253,1135],{"class":714},[583,1255,1256],{"class":710},"hooks",[583,1258,1135],{"class":714},[583,1260,1261],{"class":706},"hook",[583,1263,711],{"class":721},[583,1265,730],{"class":714},[583,1267,843],{"class":592},[583,1269,730],{"class":714},[583,1271,738],{"class":714},[583,1273,1196],{"class":706},[583,1275,1276],{"class":721},"())\n",[583,1278,1279,1281],{"class":585,"line":789},[583,1280,798],{"class":714},[583,1282,801],{"class":710},[526,1284,1286],{"id":1285},"retention","Retention",[471,1288,1289,1291],{},[474,1290,476],{}," automatically deletes old events based on your retention policy. No manual cleanup needed.",[886,1293,439],{"id":1294},"configuration",[471,1296,1297,1298,655],{},"Set the retention period in your ",[474,1299,687],{},[573,1301,1303],{"className":690,"code":1302,"filename":687,"language":692,"meta":579,"style":579},"export default defineNuxtConfig({\n  modules: ['@nuxthub\u002Fcore', '@evlog\u002Fnuxthub'],\n\n  evlog: {\n    retention: '7d', \u002F\u002F default\n  },\n})\n",[474,1304,1305,1317,1343,1347,1355,1372,1376],{"__ignoreMap":579},[583,1306,1307,1309,1311,1313,1315],{"class":585,"line":586},[583,1308,700],{"class":699},[583,1310,703],{"class":699},[583,1312,707],{"class":706},[583,1314,711],{"class":710},[583,1316,715],{"class":714},[583,1318,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341],{"class":585,"line":718},[583,1320,722],{"class":721},[583,1322,655],{"class":714},[583,1324,727],{"class":710},[583,1326,730],{"class":714},[583,1328,733],{"class":592},[583,1330,730],{"class":714},[583,1332,738],{"class":714},[583,1334,741],{"class":714},[583,1336,476],{"class":592},[583,1338,730],{"class":714},[583,1340,748],{"class":710},[583,1342,751],{"class":714},[583,1344,1345],{"class":585,"line":754},[583,1346,758],{"emptyLinePlaceholder":757},[583,1348,1349,1351,1353],{"class":585,"line":761},[583,1350,764],{"class":721},[583,1352,655],{"class":714},[583,1354,769],{"class":714},[583,1356,1357,1359,1361,1363,1365,1367,1369],{"class":585,"line":772},[583,1358,775],{"class":721},[583,1360,655],{"class":714},[583,1362,741],{"class":714},[583,1364,782],{"class":592},[583,1366,730],{"class":714},[583,1368,738],{"class":714},[583,1370,1371],{"class":1245}," \u002F\u002F default\n",[583,1373,1374],{"class":585,"line":789},[583,1375,792],{"class":714},[583,1377,1378,1380],{"class":585,"line":795},[583,1379,798],{"class":714},[583,1381,801],{"class":710},[471,1383,1384],{},"The retention value is a number followed by a unit:",[901,1386,1387,1399],{},[904,1388,1389],{},[907,1390,1391,1394,1396],{},[910,1392,1393],{},"Unit",[910,1395,918],{},[910,1397,1398],{},"Example",[920,1400,1401,1416,1432],{},[907,1402,1403,1408,1411],{},[925,1404,1405],{},[474,1406,1407],{},"d",[925,1409,1410],{},"Days",[925,1412,1413,1415],{},[474,1414,782],{}," = 7 days",[907,1417,1418,1423,1426],{},[925,1419,1420],{},[474,1421,1422],{},"h",[925,1424,1425],{},"Hours",[925,1427,1428,1431],{},[474,1429,1430],{},"24h"," = 24 hours",[907,1433,1434,1439,1442],{},[925,1435,1436],{},[474,1437,1438],{},"m",[925,1440,1441],{},"Minutes",[925,1443,1444,1447],{},[474,1445,1446],{},"60m"," = 60 minutes",[886,1449,1451],{"id":1450},"how-cleanup-works","How Cleanup Works",[471,1453,1454,1455,1458],{},"The module registers a Nitro scheduled task (",[474,1456,1457],{},"evlog:cleanup",") that runs on a cron schedule derived from your retention value. The cron frequency is set to roughly half the retention period:",[901,1460,1461,1472],{},[904,1462,1463],{},[907,1464,1465,1467,1470],{},[910,1466,1286],{},[910,1468,1469],{},"Cron Schedule",[910,1471,918],{},[920,1473,1474,1488,1502,1516],{},[907,1475,1476,1480,1485],{},[925,1477,1478],{},[474,1479,1446],{},[925,1481,1482],{},[474,1483,1484],{},"*\u002F30 * * * *",[925,1486,1487],{},"Every 30 minutes",[907,1489,1490,1494,1499],{},[925,1491,1492],{},[474,1493,1430],{},[925,1495,1496],{},[474,1497,1498],{},"0 *\u002F12 * * *",[925,1500,1501],{},"Every 12 hours",[907,1503,1504,1508,1513],{},[925,1505,1506],{},[474,1507,782],{},[925,1509,1510],{},[474,1511,1512],{},"0 3 * * *",[925,1514,1515],{},"Daily at 3:00 AM",[907,1517,1518,1523,1527],{},[925,1519,1520],{},[474,1521,1522],{},"30d",[925,1524,1525],{},[474,1526,1512],{},[925,1528,1515],{},[471,1530,1531,1532,1534,1535,1537],{},"The cleanup task deletes all rows in ",[474,1533,836],{}," where ",[474,1536,1111],{}," is older than the retention period.",[886,1539,1541],{"id":1540},"manual-cleanup","Manual Cleanup",[471,1543,1544],{},"You can trigger cleanup manually via the API endpoint:",[573,1546,1548],{"className":575,"code":1547,"filename":659,"language":578,"meta":579,"style":579},"curl https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[474,1549,1550],{"__ignoreMap":579},[583,1551,1552,1555],{"class":585,"line":586},[583,1553,1554],{"class":589},"curl",[583,1556,1557],{"class":592}," https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[471,1559,1560,1561,1564],{},"If the ",[474,1562,1563],{},"CRON_SECRET"," environment variable is set, the endpoint requires a Bearer token:",[573,1566,1568],{"className":575,"code":1567,"filename":659,"language":578,"meta":579,"style":579},"curl -H \"Authorization: Bearer your-secret\" \\\n  https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[474,1569,1570,1589],{"__ignoreMap":579},[583,1571,1572,1574,1577,1580,1583,1586],{"class":585,"line":586},[583,1573,1554],{"class":589},[583,1575,1576],{"class":592}," -H",[583,1578,1579],{"class":714}," \"",[583,1581,1582],{"class":592},"Authorization: Bearer your-secret",[583,1584,1585],{"class":714},"\"",[583,1587,1588],{"class":710}," \\\n",[583,1590,1591],{"class":585,"line":718},[583,1592,1593],{"class":592},"  https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[471,1595,1596],{},"This is recommended for production deployments to prevent unauthorized cleanup triggers.",[886,1598,1600],{"id":1599},"vercel-cron","Vercel Cron",[471,1602,1603,1604,1607,1608,1611],{},"When installing the module with ",[474,1605,1606],{},"nuxi module add",", you'll be prompted to create a ",[474,1609,1610],{},"vercel.json"," with the appropriate cron schedule:",[573,1613,1617],{"className":1614,"code":1615,"filename":1610,"language":1616,"meta":579,"style":579},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"crons\": [\n    {\n      \"path\": \"\u002Fapi\u002F_cron\u002Fevlog-cleanup\",\n      \"schedule\": \"0 3 * * *\"\n    }\n  ]\n}\n","json",[474,1618,1619,1623,1638,1643,1663,1681,1686,1691],{"__ignoreMap":579},[583,1620,1621],{"class":585,"line":586},[583,1622,715],{"class":714},[583,1624,1625,1628,1631,1633,1635],{"class":585,"line":718},[583,1626,1627],{"class":714},"  \"",[583,1629,1630],{"class":1237},"crons",[583,1632,1585],{"class":714},[583,1634,655],{"class":714},[583,1636,1637],{"class":714}," [\n",[583,1639,1640],{"class":585,"line":754},[583,1641,1642],{"class":714},"    {\n",[583,1644,1645,1648,1650,1652,1654,1656,1659,1661],{"class":585,"line":761},[583,1646,1647],{"class":714},"      \"",[583,1649,1013],{"class":589},[583,1651,1585],{"class":714},[583,1653,655],{"class":714},[583,1655,1579],{"class":714},[583,1657,1658],{"class":592},"\u002Fapi\u002F_cron\u002Fevlog-cleanup",[583,1660,1585],{"class":714},[583,1662,751],{"class":714},[583,1664,1665,1667,1670,1672,1674,1676,1678],{"class":585,"line":772},[583,1666,1647],{"class":714},[583,1668,1669],{"class":589},"schedule",[583,1671,1585],{"class":714},[583,1673,655],{"class":714},[583,1675,1579],{"class":714},[583,1677,1512],{"class":592},[583,1679,1680],{"class":714},"\"\n",[583,1682,1683],{"class":585,"line":789},[583,1684,1685],{"class":714},"    }\n",[583,1687,1688],{"class":585,"line":795},[583,1689,1690],{"class":714},"  ]\n",[583,1692,1694],{"class":585,"line":1693},8,[583,1695,1696],{"class":714},"}\n",[471,1698,1699,1700,1702],{},"On Vercel, the ",[474,1701,1563],{}," environment variable is automatically set and validated.",[886,1704,1706],{"id":1705},"cloudflare-other-platforms","Cloudflare & Other Platforms",[471,1708,1709,1710,1713],{},"On Cloudflare Workers and other platforms, the Nitro scheduled task handles cleanup automatically without any additional cron configuration. The task is registered with ",[474,1711,1712],{},"experimental.tasks"," enabled in the Nitro config.",[526,1715,1717],{"id":1716},"next-steps","Next Steps",[487,1719,1720,1725],{},[490,1721,1722,1724],{},[515,1723,90],{"href":95}," - Send logs to external services alongside NuxtHub storage",[490,1726,1727,1730],{},[515,1728,1729],{"href":431},"Pipeline"," - Batch events for better database performance",[1732,1733,1734],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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}",{"title":579,"searchDepth":718,"depth":718,"links":1736},[1737,1738,1739,1740,1744,1745,1752],{"id":528,"depth":718,"text":529},{"id":567,"depth":718,"text":568},{"id":681,"depth":718,"text":356},{"id":865,"depth":718,"text":866,"children":1741},[1742,1743],{"id":888,"depth":754,"text":889},{"id":1138,"depth":754,"text":1139},{"id":1170,"depth":718,"text":1171},{"id":1285,"depth":718,"text":1286,"children":1746},[1747,1748,1749,1750,1751],{"id":1294,"depth":754,"text":439},{"id":1450,"depth":754,"text":1451},{"id":1540,"depth":754,"text":1541},{"id":1599,"depth":754,"text":1600},{"id":1705,"depth":754,"text":1706},{"id":1716,"depth":718,"text":1717},"Self-hosted log retention for evlog using NuxtHub database storage. Store, query, and automatically clean up your structured logs with zero external dependencies.","md",[1756,1761],{"label":148,"icon":1757,"to":523,"target":1758,"color":1759,"variant":1760},"i-lucide-external-link","_blank","neutral","subtle",{"label":90,"icon":1762,"to":95,"color":1759,"variant":1760},"i-custom-plug",{},{"title":148,"icon":151},{"title":466,"description":1753},"SaEXbbrUJJg3MxYJvXnsy1PdVhORNpgB5Yg0kw8wO1w",[1768,1770],{"title":143,"path":144,"stem":145,"description":1769,"icon":146,"children":-1},"Write wide events to the local file system as NDJSON for local debugging, AI agent integration, and production backup.",{"title":153,"path":154,"stem":155,"description":1771,"icon":156,"children":-1},"Store wide events in an in-memory ring buffer. Works in any runtime — including Cloudflare Workers (workerd) — where the file system is unavailable.",1784204026681]