[{"data":1,"prerenderedAt":1115},["ShallowReactive",2],{"navigation_docs":3,"-nuxthub-overview":292,"-nuxthub-overview-surround":1110},[4,30,65,110,198,262,278],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Logging","\u002Flogging","2.logging",[35,40,45,50,55,60],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F4.client-logging","i-lucide-monitor",{"title":61,"path":62,"stem":63,"icon":64},"AI SDK Integration","\u002Flogging\u002Fai-sdk","2.logging\u002F5.ai-sdk","i-simple-icons-vercel",{"title":66,"path":67,"stem":68,"children":69,"page":29},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[70,75,80,85,90,95,100,105],{"title":71,"path":72,"stem":73,"icon":74},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":76,"path":77,"stem":78,"icon":79},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":81,"path":82,"stem":83,"icon":84},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":86,"path":87,"stem":88,"icon":89},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":91,"path":92,"stem":93,"icon":94},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices","i-lucide-shield-check",{"title":96,"path":97,"stem":98,"icon":99},"Performance","\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance","i-lucide-gauge",{"title":101,"path":102,"stem":103,"icon":104},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":106,"path":107,"stem":108,"icon":109},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":111,"path":112,"stem":113,"children":114,"page":29},"Frameworks","\u002Fframeworks","4.frameworks",[115,119,124,129,134,139,144,149,154,159,164,169,174,179,183,188,193],{"title":36,"path":116,"stem":117,"icon":118},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":120,"path":121,"stem":122,"icon":123},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":125,"path":126,"stem":127,"icon":128},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":130,"path":131,"stem":132,"icon":133},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":135,"path":136,"stem":137,"icon":138},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":140,"path":141,"stem":142,"icon":143},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":145,"path":146,"stem":147,"icon":148},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":150,"path":151,"stem":152,"icon":153},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":155,"path":156,"stem":157,"icon":158},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":160,"path":161,"stem":162,"icon":163},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":165,"path":166,"stem":167,"icon":168},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":170,"path":171,"stem":172,"icon":173},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":175,"path":176,"stem":177,"icon":178},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":180,"path":181,"stem":182,"icon":89},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":184,"path":185,"stem":186,"icon":187},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":189,"path":190,"stem":191,"icon":192},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F15.custom-integration","i-lucide-puzzle",{"title":194,"path":195,"stem":196,"icon":197},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":199,"path":200,"stem":201,"children":202,"page":29},"Adapters","\u002Fadapters","5.adapters",[203,207,212,217,222,227,232,237,242,247,252,257],{"title":36,"path":204,"stem":205,"icon":206},"\u002Fadapters\u002Foverview","5.adapters\u002F1.overview","i-custom-plug",{"title":208,"path":209,"stem":210,"icon":211},"Custom Adapters","\u002Fadapters\u002Fcustom","5.adapters\u002F10.custom","i-lucide-code",{"title":213,"path":214,"stem":215,"icon":216},"Pipeline","\u002Fadapters\u002Fpipeline","5.adapters\u002F11.pipeline","i-lucide-workflow",{"title":218,"path":219,"stem":220,"icon":221},"HTTP","\u002Fadapters\u002Fhttp","5.adapters\u002F12.http","i-lucide-globe",{"title":223,"path":224,"stem":225,"icon":226},"Axiom","\u002Fadapters\u002Faxiom","5.adapters\u002F2.axiom","i-custom-axiom",{"title":228,"path":229,"stem":230,"icon":231},"OTLP","\u002Fadapters\u002Fotlp","5.adapters\u002F3.otlp","i-simple-icons-opentelemetry",{"title":233,"path":234,"stem":235,"icon":236},"PostHog","\u002Fadapters\u002Fposthog","5.adapters\u002F4.posthog","i-simple-icons-posthog",{"title":238,"path":239,"stem":240,"icon":241},"Sentry","\u002Fadapters\u002Fsentry","5.adapters\u002F5.sentry","i-simple-icons-sentry",{"title":243,"path":244,"stem":245,"icon":246},"Better Stack","\u002Fadapters\u002Fbetter-stack","5.adapters\u002F6.better-stack","i-simple-icons-betterstack",{"title":248,"path":249,"stem":250,"icon":251},"File System","\u002Fadapters\u002Ffs","5.adapters\u002F7.fs","i-lucide-hard-drive",{"title":253,"path":254,"stem":255,"icon":256},"Datadog","\u002Fadapters\u002Fdatadog","5.adapters\u002F8.datadog","i-simple-icons-datadog",{"title":258,"path":259,"stem":260,"icon":261},"HyperDX","\u002Fadapters\u002Fhyperdx","5.adapters\u002F9.hyperdx","i-custom-hyperdx",{"title":263,"path":264,"stem":265,"children":266,"page":29},"Enrichers","\u002Fenrichers","6.enrichers",[267,270,274],{"title":36,"path":268,"stem":269,"icon":28},"\u002Fenrichers\u002Foverview","6.enrichers\u002F1.overview",{"title":271,"path":272,"stem":273,"icon":192},"Built-in","\u002Fenrichers\u002Fbuilt-in","6.enrichers\u002F2.built-in",{"title":275,"path":276,"stem":277,"icon":211},"Custom","\u002Fenrichers\u002Fcustom","6.enrichers\u002F3.custom",{"title":279,"path":280,"stem":281,"children":282,"page":29},"NuxtHub","\u002Fnuxthub","7.nuxthub",[283,287],{"title":36,"path":284,"stem":285,"icon":286},"\u002Fnuxthub\u002Foverview","7.nuxthub\u002F1.overview","i-lucide-database",{"title":288,"path":289,"stem":290,"icon":291},"Retention","\u002Fnuxthub\u002Fretention","7.nuxthub\u002F2.retention","i-lucide-clock",{"id":293,"title":294,"body":295,"description":1097,"extension":1098,"links":1099,"meta":1106,"navigation":1107,"path":284,"seo":1108,"stem":285,"__hash__":1109},"docs\u002F7.nuxthub\u002F1.overview.md","NuxtHub Storage",{"type":296,"value":297,"toc":1086},"minimark",[298,306,311,314,343,348,352,432,439,462,466,472,586,599,602,632,650,654,662,672,677,687,906,923,927,930,948,955,959,967,1070,1074,1082],[299,300,301,305],"p",{},[302,303,304],"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.",[307,308,310],"h2",{"id":309},"why-self-hosted-logs","Why Self-Hosted Logs?",[299,312,313],{},"External logging services (Axiom, Datadog, etc.) are great for production at scale. But sometimes you want:",[315,316,317,325,331,337],"ul",{},[318,319,320,324],"li",{},[321,322,323],"strong",{},"Zero external dependencies"," - logs stored in the same database as your app",[318,326,327,330],{},[321,328,329],{},"Full data ownership"," - no third-party access to your log data",[318,332,333,336],{},[321,334,335],{},"Free tier friendly"," - no per-event pricing, just your existing database",[318,338,339,342],{},[321,340,341],{},"Development & staging"," - full log visibility without paying for a service",[299,344,345,347],{},[302,346,304],{}," works as a drop-in drain. Your existing evlog setup stays the same, you just get a database-backed storage layer on top.",[307,349,351],{"id":350},"install","Install",[353,354,355,383,400,416],"code-group",{},[356,357,363],"pre",{"className":358,"code":359,"filename":360,"language":361,"meta":362,"style":362},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","pnpm","bash","",[302,364,365],{"__ignoreMap":362},[366,367,370,373,377,380],"span",{"class":368,"line":369},"line",1,[366,371,360],{"class":372},"sBMFI",[366,374,376],{"class":375},"sfazB"," add",[366,378,379],{"class":375}," @nuxthub\u002Fcore",[366,381,382],{"class":375}," @evlog\u002Fnuxthub\n",[356,384,387],{"className":358,"code":385,"filename":386,"language":361,"meta":362,"style":362},"npm install @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","npm",[302,388,389],{"__ignoreMap":362},[366,390,391,393,396,398],{"class":368,"line":369},[366,392,386],{"class":372},[366,394,395],{"class":375}," install",[366,397,379],{"class":375},[366,399,382],{"class":375},[356,401,404],{"className":358,"code":402,"filename":403,"language":361,"meta":362,"style":362},"yarn add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","yarn",[302,405,406],{"__ignoreMap":362},[366,407,408,410,412,414],{"class":368,"line":369},[366,409,403],{"class":372},[366,411,376],{"class":375},[366,413,379],{"class":375},[366,415,382],{"class":375},[356,417,420],{"className":358,"code":418,"filename":419,"language":361,"meta":362,"style":362},"bun add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","bun",[302,421,422],{"__ignoreMap":362},[366,423,424,426,428,430],{"class":368,"line":369},[366,425,419],{"class":372},[366,427,376],{"class":375},[366,429,379],{"class":375},[366,431,382],{"class":375},[299,433,434,435,438],{},"Or with ",[302,436,437],{},"nuxi",":",[356,440,443],{"className":358,"code":441,"filename":442,"language":361,"meta":362,"style":362},"npx nuxi module add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","Terminal",[302,444,445],{"__ignoreMap":362},[366,446,447,450,453,456,458,460],{"class":368,"line":369},[366,448,449],{"class":372},"npx",[366,451,452],{"class":375}," nuxi",[366,454,455],{"class":375}," module",[366,457,376],{"class":375},[366,459,379],{"class":375},[366,461,382],{"class":375},[307,463,465],{"id":464},"setup","Setup",[299,467,468,469,438],{},"Add the module to your ",[302,470,471],{},"nuxt.config.ts",[356,473,477],{"className":474,"code":475,"filename":471,"language":476,"meta":362,"style":362},"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",[302,478,479,500,536,543,554,571,577],{"__ignoreMap":362},[366,480,481,485,488,492,496],{"class":368,"line":369},[366,482,484],{"class":483},"s7zQu","export",[366,486,487],{"class":483}," default",[366,489,491],{"class":490},"s2Zo4"," defineNuxtConfig",[366,493,495],{"class":494},"sTEyZ","(",[366,497,499],{"class":498},"sMK4o","{\n",[366,501,503,507,509,512,515,518,520,523,526,528,530,533],{"class":368,"line":502},2,[366,504,506],{"class":505},"swJcz","  modules",[366,508,438],{"class":498},[366,510,511],{"class":494}," [",[366,513,514],{"class":498},"'",[366,516,517],{"class":375},"@nuxthub\u002Fcore",[366,519,514],{"class":498},[366,521,522],{"class":498},",",[366,524,525],{"class":498}," '",[366,527,304],{"class":375},[366,529,514],{"class":498},[366,531,532],{"class":494},"]",[366,534,535],{"class":498},",\n",[366,537,539],{"class":368,"line":538},3,[366,540,542],{"emptyLinePlaceholder":541},true,"\n",[366,544,546,549,551],{"class":368,"line":545},4,[366,547,548],{"class":505},"  evlog",[366,550,438],{"class":498},[366,552,553],{"class":498}," {\n",[366,555,557,560,562,564,567,569],{"class":368,"line":556},5,[366,558,559],{"class":505},"    retention",[366,561,438],{"class":498},[366,563,525],{"class":498},[366,565,566],{"class":375},"7d",[366,568,514],{"class":498},[366,570,535],{"class":498},[366,572,574],{"class":368,"line":573},6,[366,575,576],{"class":498},"  },\n",[366,578,580,583],{"class":368,"line":579},7,[366,581,582],{"class":498},"}",[366,584,585],{"class":494},")\n",[299,587,588,589,591,592,594,595,598],{},"Even if ",[302,590,304],{}," can auto-register missing modules, we recommend explicitly installing ",[302,593,517],{}," and registering it in ",[302,596,597],{},"modules"," for a clearer and more predictable setup.",[299,600,601],{},"That's it. The module automatically:",[603,604,605,615,622,629],"ol",{},[318,606,607,608,611,612,614],{},"Installs ",[302,609,610],{},"evlog\u002Fnuxt"," and ",[302,613,517],{}," if not already registered",[318,616,617,618,621],{},"Registers the ",[302,619,620],{},"evlog_events"," database schema with NuxtHub",[318,623,624,625,628],{},"Hooks into ",[302,626,627],{},"evlog:drain"," to store every event in the database",[318,630,631],{},"Schedules a cleanup task based on your retention policy",[633,634,636,639,640,646,647,649],"callout",{"color":635,"icon":13},"info",[321,637,638],{},"Prerequisites:"," Your project must use ",[641,642,279],"a",{"href":643,"rel":644},"https:\u002F\u002Fhub.nuxt.com",[645],"nofollow"," with a database configured. ",[302,648,304],{}," uses Drizzle ORM to interact with the database.",[307,651,653],{"id":652},"how-it-works","How It Works",[356,655,660],{"className":656,"code":658,"language":659},[657],"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",[302,661,658],{"__ignoreMap":362},[299,663,664,665,667,668,671],{},"Every wide event emitted by evlog is stored as a row in the ",[302,666,620],{}," table. The drain plugin handles both single events and batches (when used with the ",[641,669,670],{"href":214},"pipeline",").",[673,674,676],"h3",{"id":675},"database-schema","Database Schema",[299,678,679,680,682,683,686],{},"The ",[302,681,620],{}," table stores indexed columns for fast querying and a ",[302,684,685],{},"data"," JSON column for all remaining fields:",[688,689,690,706],"table",{},[691,692,693],"thead",{},[694,695,696,700,703],"tr",{},[697,698,699],"th",{},"Column",[697,701,702],{},"Type",[697,704,705],{},"Description",[707,708,709,724,738,752,766,780,794,808,823,837,851,865,879,892],"tbody",{},[694,710,711,717,721],{},[712,713,714],"td",{},[302,715,716],{},"id",[712,718,719],{},[302,720,659],{},[712,722,723],{},"UUID primary key",[694,725,726,731,735],{},[712,727,728],{},[302,729,730],{},"timestamp",[712,732,733],{},[302,734,659],{},[712,736,737],{},"Event timestamp",[694,739,740,745,749],{},[712,741,742],{},[302,743,744],{},"level",[712,746,747],{},[302,748,659],{},[712,750,751],{},"Log level (info, warn, error, debug)",[694,753,754,759,763],{},[712,755,756],{},[302,757,758],{},"service",[712,760,761],{},[302,762,659],{},[712,764,765],{},"Service name",[694,767,768,773,777],{},[712,769,770],{},[302,771,772],{},"environment",[712,774,775],{},[302,776,659],{},[712,778,779],{},"Environment (production, staging, etc.)",[694,781,782,787,791],{},[712,783,784],{},[302,785,786],{},"method",[712,788,789],{},[302,790,659],{},[712,792,793],{},"HTTP method",[694,795,796,801,805],{},[712,797,798],{},[302,799,800],{},"path",[712,802,803],{},[302,804,659],{},[712,806,807],{},"Request path",[694,809,810,815,820],{},[712,811,812],{},[302,813,814],{},"status",[712,816,817],{},[302,818,819],{},"integer",[712,821,822],{},"HTTP status code",[694,824,825,830,834],{},[712,826,827],{},[302,828,829],{},"duration_ms",[712,831,832],{},[302,833,819],{},[712,835,836],{},"Request duration in milliseconds",[694,838,839,844,848],{},[712,840,841],{},[302,842,843],{},"request_id",[712,845,846],{},[302,847,659],{},[712,849,850],{},"Request correlation ID",[694,852,853,858,862],{},[712,854,855],{},[302,856,857],{},"source",[712,859,860],{},[302,861,659],{},[712,863,864],{},"Event source (server, client)",[694,866,867,872,876],{},[712,868,869],{},[302,870,871],{},"error",[712,873,874],{},[302,875,659],{},[712,877,878],{},"Error details (JSON string)",[694,880,881,885,889],{},[712,882,883],{},[302,884,685],{},[712,886,887],{},[302,888,659],{},[712,890,891],{},"All remaining event fields (JSON)",[694,893,894,899,903],{},[712,895,896],{},[302,897,898],{},"created_at",[712,900,901],{},[302,902,659],{},[712,904,905],{},"Row insertion timestamp",[299,907,908,909,911,912,911,914,911,916,911,918,911,920,922],{},"Indexed columns: ",[302,910,730],{},", ",[302,913,744],{},[302,915,758],{},[302,917,814],{},[302,919,843],{},[302,921,898],{},".",[673,924,926],{"id":925},"dialect-support","Dialect Support",[299,928,929],{},"The schema is automatically registered for your NuxtHub database dialect:",[315,931,932,938,943],{},[318,933,934,937],{},[321,935,936],{},"SQLite"," (default for Cloudflare D1)",[318,939,940],{},[321,941,942],{},"MySQL",[318,944,945],{},[321,946,947],{},"PostgreSQL",[299,949,950,951,954],{},"The correct schema is selected via the ",[302,952,953],{},"hub:db:schema:extend"," hook based on your NuxtHub configuration.",[307,956,958],{"id":957},"combining-with-external-adapters","Combining with External Adapters",[299,960,961,963,964,966],{},[302,962,304],{}," doesn't replace external adapters, you can use both. The module registers its own ",[302,965,627],{}," hook, so any other drain plugins you have will still work:",[356,968,971],{"className":474,"code":969,"filename":970,"language":476,"meta":362,"style":362},"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",[302,972,973,998,1002,1028,1034,1064],{"__ignoreMap":362},[366,974,975,978,981,984,987,990,992,995],{"class":368,"line":369},[366,976,977],{"class":483},"import",[366,979,980],{"class":498}," {",[366,982,983],{"class":494}," createAxiomDrain",[366,985,986],{"class":498}," }",[366,988,989],{"class":483}," from",[366,991,525],{"class":498},[366,993,994],{"class":375},"evlog\u002Faxiom",[366,996,997],{"class":498},"'\n",[366,999,1000],{"class":368,"line":502},[366,1001,542],{"emptyLinePlaceholder":541},[366,1003,1004,1006,1008,1011,1013,1015,1019,1022,1026],{"class":368,"line":538},[366,1005,484],{"class":483},[366,1007,487],{"class":483},[366,1009,1010],{"class":490}," defineNitroPlugin",[366,1012,495],{"class":494},[366,1014,495],{"class":498},[366,1016,1018],{"class":1017},"sHdIc","nitroApp",[366,1020,1021],{"class":498},")",[366,1023,1025],{"class":1024},"spNyl"," =>",[366,1027,553],{"class":498},[366,1029,1030],{"class":368,"line":545},[366,1031,1033],{"class":1032},"sHwdD","  \u002F\u002F This runs alongside @evlog\u002Fnuxthub's built-in drain\n",[366,1035,1036,1039,1041,1044,1046,1049,1051,1053,1055,1057,1059,1061],{"class":368,"line":556},[366,1037,1038],{"class":494},"  nitroApp",[366,1040,922],{"class":498},[366,1042,1043],{"class":494},"hooks",[366,1045,922],{"class":498},[366,1047,1048],{"class":490},"hook",[366,1050,495],{"class":505},[366,1052,514],{"class":498},[366,1054,627],{"class":375},[366,1056,514],{"class":498},[366,1058,522],{"class":498},[366,1060,983],{"class":490},[366,1062,1063],{"class":505},"())\n",[366,1065,1066,1068],{"class":368,"line":573},[366,1067,582],{"class":498},[366,1069,585],{"class":494},[307,1071,1073],{"id":1072},"next-steps","Next Steps",[315,1075,1076],{},[318,1077,1078,1081],{},[641,1079,1080],{"href":289},"Retention & Cleanup"," - Configure retention policy and cleanup scheduling",[1083,1084,1085],"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":362,"searchDepth":502,"depth":502,"links":1087},[1088,1089,1090,1091,1095,1096],{"id":309,"depth":502,"text":310},{"id":350,"depth":502,"text":351},{"id":464,"depth":502,"text":465},{"id":652,"depth":502,"text":653,"children":1092},[1093,1094],{"id":675,"depth":538,"text":676},{"id":925,"depth":538,"text":926},{"id":957,"depth":502,"text":958},{"id":1072,"depth":502,"text":1073},"Self-hosted log retention for evlog using NuxtHub database storage. Store, query, and automatically clean up your structured logs with zero external dependencies.","md",[1100,1105],{"label":279,"icon":1101,"to":643,"target":1102,"color":1103,"variant":1104},"i-lucide-external-link","_blank","neutral","subtle",{"label":199,"icon":206,"to":204,"color":1103,"variant":1104},{},{"title":36,"icon":286},{"title":294,"description":1097},"Y2TQGYIcb0Dg6M8JuoiOzmaVpAv1f7WV9wLp6dPbXeY",[1111,1113],{"title":275,"path":276,"stem":277,"description":1112,"icon":211,"children":-1},"Write custom enrichers to add derived context to your wide events. Add deployment metadata, tenant IDs, feature flags, or any computed data.",{"title":288,"path":289,"stem":290,"description":1114,"icon":291,"children":-1},"Configure how long logs are kept in NuxtHub and how they are automatically cleaned up with scheduled tasks, cron jobs, and retention policies.",1776073773394]