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