[{"data":1,"prerenderedAt":2631},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-best-practices":238,"-core-concepts-best-practices-surround":2626},[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":131,"body":240,"description":2615,"extension":2616,"links":2617,"meta":2622,"navigation":2623,"path":132,"seo":2624,"stem":133,"__hash__":2625},"docs\u002F3.core-concepts\u002F3.best-practices.md",{"type":241,"value":242,"toc":2597},"minimark",[243,247,252,259,337,342,346,351,354,581,585,588,1204,1207,1395,1399,1402,1907,1912,1916,1919,1923,1962,1966,2008,2012,2037,2041,2044,2228,2232,2347,2351,2354,2564,2577,2581,2593],[244,245,246],"p",{},"This guide covers security best practices and production considerations for evlog.",[248,249,251],"h2",{"id":250},"what-not-to-log","What NOT to Log",[244,253,254,255],{},"Wide events are powerful because they capture comprehensive context. However, this makes it easy to accidentally log sensitive data. ",[256,257,258],"strong",{},"Never log:",[260,261,262,278],"table",{},[263,264,265],"thead",{},[266,267,268,272,275],"tr",{},[269,270,271],"th",{},"Category",[269,273,274],{},"Examples",[269,276,277],{},"Risk",[279,280,281,293,304,315,326],"tbody",{},[266,282,283,287,290],{},[284,285,286],"td",{},"Credentials",[284,288,289],{},"Passwords, API keys, tokens, secrets",[284,291,292],{},"Account compromise",[266,294,295,298,301],{},[284,296,297],{},"Payment data",[284,299,300],{},"Full card numbers, CVV, bank accounts",[284,302,303],{},"PCI compliance violation",[266,305,306,309,312],{},[284,307,308],{},"Personal data (PII)",[284,310,311],{},"SSN, passport numbers, driver's license",[284,313,314],{},"Privacy laws (GDPR, CCPA)",[266,316,317,320,323],{},[284,318,319],{},"Health data",[284,321,322],{},"Medical records, diagnoses",[284,324,325],{},"HIPAA violation",[266,327,328,331,334],{},[284,329,330],{},"Authentication",[284,332,333],{},"Session tokens, JWTs, refresh tokens",[284,335,336],{},"Session hijacking",[338,339,341],"callout",{"color":340,"icon":129},"error","Logs are often accessible to your entire team and may be stored in third-party services. Treat them as semi-public.",[248,343,345],{"id":344},"sanitization-patterns","Sanitization Patterns",[347,348,350],"h3",{"id":349},"manual-field-selection","Manual Field Selection",[244,352,353],{},"The safest approach is to explicitly select which fields to log:",[355,356,362],"pre",{"className":357,"code":358,"filename":359,"language":360,"meta":361,"style":361},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const body = await readBody(event)\n\n  \u002F\u002F ❌ NEVER log the entire request body\n  \u002F\u002F log.set({ body })\n\n  \u002F\u002F ✅ Explicitly select safe fields\n  log.set({\n    user: {\n      id: body.id,\n      email: maskEmail(body.email),\n      \u002F\u002F password: body.password ← NEVER include\n    },\n  })\n})\n","server\u002Fapi\u002Fuser\u002Fupdate.post.ts","typescript","",[363,364,365,406,429,451,458,465,471,476,482,499,510,528,553,559,565,573],"code",{"__ignoreMap":361},[366,367,370,374,377,381,385,389,393,397,400,403],"span",{"class":368,"line":369},"line",1,[366,371,373],{"class":372},"s7zQu","export",[366,375,376],{"class":372}," default",[366,378,380],{"class":379},"s2Zo4"," defineEventHandler",[366,382,384],{"class":383},"sTEyZ","(",[366,386,388],{"class":387},"spNyl","async",[366,390,392],{"class":391},"sMK4o"," (",[366,394,396],{"class":395},"sHdIc","event",[366,398,399],{"class":391},")",[366,401,402],{"class":387}," =>",[366,404,405],{"class":391}," {\n",[366,407,409,412,415,418,421,424,426],{"class":368,"line":408},2,[366,410,411],{"class":387},"  const",[366,413,414],{"class":383}," log",[366,416,417],{"class":391}," =",[366,419,420],{"class":379}," useLogger",[366,422,384],{"class":423},"swJcz",[366,425,396],{"class":383},[366,427,428],{"class":423},")\n",[366,430,432,434,437,439,442,445,447,449],{"class":368,"line":431},3,[366,433,411],{"class":387},[366,435,436],{"class":383}," body",[366,438,417],{"class":391},[366,440,441],{"class":372}," await",[366,443,444],{"class":379}," readBody",[366,446,384],{"class":423},[366,448,396],{"class":383},[366,450,428],{"class":423},[366,452,454],{"class":368,"line":453},4,[366,455,457],{"emptyLinePlaceholder":456},true,"\n",[366,459,461],{"class":368,"line":460},5,[366,462,464],{"class":463},"sHwdD","  \u002F\u002F ❌ NEVER log the entire request body\n",[366,466,468],{"class":368,"line":467},6,[366,469,470],{"class":463},"  \u002F\u002F log.set({ body })\n",[366,472,474],{"class":368,"line":473},7,[366,475,457],{"emptyLinePlaceholder":456},[366,477,479],{"class":368,"line":478},8,[366,480,481],{"class":463},"  \u002F\u002F ✅ Explicitly select safe fields\n",[366,483,485,488,491,494,496],{"class":368,"line":484},9,[366,486,487],{"class":383},"  log",[366,489,490],{"class":391},".",[366,492,493],{"class":379},"set",[366,495,384],{"class":423},[366,497,498],{"class":391},"{\n",[366,500,502,505,508],{"class":368,"line":501},10,[366,503,504],{"class":423},"    user",[366,506,507],{"class":391},":",[366,509,405],{"class":391},[366,511,513,516,518,520,522,525],{"class":368,"line":512},11,[366,514,515],{"class":423},"      id",[366,517,507],{"class":391},[366,519,436],{"class":383},[366,521,490],{"class":391},[366,523,524],{"class":383},"id",[366,526,527],{"class":391},",\n",[366,529,531,534,536,539,541,544,546,549,551],{"class":368,"line":530},12,[366,532,533],{"class":423},"      email",[366,535,507],{"class":391},[366,537,538],{"class":379}," maskEmail",[366,540,384],{"class":423},[366,542,543],{"class":383},"body",[366,545,490],{"class":391},[366,547,548],{"class":383},"email",[366,550,399],{"class":423},[366,552,527],{"class":391},[366,554,556],{"class":368,"line":555},13,[366,557,558],{"class":463},"      \u002F\u002F password: body.password ← NEVER include\n",[366,560,562],{"class":368,"line":561},14,[366,563,564],{"class":391},"    },\n",[366,566,568,571],{"class":368,"line":567},15,[366,569,570],{"class":391},"  }",[366,572,428],{"class":423},[366,574,576,579],{"class":368,"line":575},16,[366,577,578],{"class":391},"}",[366,580,428],{"class":383},[347,582,584],{"id":583},"helper-functions","Helper Functions",[244,586,587],{},"Create utility functions to sanitize common data types:",[355,589,592],{"className":357,"code":590,"filename":591,"language":360,"meta":361,"style":361},"\u002F** Masks email: john.doe@example.com → j***.d**@e***.com *\u002F\nexport function maskEmail(email: string): string {\n  const [local, domain] = email.split('@')\n  if (!domain) return '***'\n  const [domainName, tld] = domain.split('.')\n  return `${local[0]}***@${domainName[0]}***.${tld}`\n}\n\n\u002F** Masks card number: 4242424242424242 → ****4242 *\u002F\nexport function maskCard(card: string): string {\n  return `****${card.slice(-4)}`\n}\n\n\u002F** Truncates long IDs for readability *\u002F\nexport function truncateId(id: string, length = 8): string {\n  if (id.length \u003C= length) return id\n  return `${id.slice(0, length)}...`\n}\n\n\u002F** Removes sensitive fields from an object *\u002F\nexport function sanitize\u003CT extends Record\u003Cstring, unknown>>(\n  obj: T,\n  sensitiveKeys: string[] = ['password', 'token', 'secret', 'apiKey', 'authorization']\n): Partial\u003CT> {\n  const result = { ...obj }\n  for (const key of sensitiveKeys) {\n    if (key in result) {\n      delete result[key]\n    }\n  }\n  return result\n}\n","server\u002Futils\u002Fsanitize.ts",[363,593,594,609,635,676,704,738,783,788,792,797,821,852,856,860,865,898,923,953,958,963,969,1004,1017,1081,1098,1120,1144,1164,1179,1185,1191,1199],{"__ignoreMap":361},[366,595,596,599,602,606],{"class":368,"line":369},[366,597,598],{"class":463},"\u002F** Masks email: john.doe",[366,600,601],{"class":372},"@",[366,603,605],{"class":604},"s6hCs","example",[366,607,608],{"class":463},".com → j***.d**@e***.com *\u002F\n",[366,610,611,613,616,618,620,622,624,628,631,633],{"class":368,"line":408},[366,612,373],{"class":372},[366,614,615],{"class":387}," function",[366,617,538],{"class":379},[366,619,384],{"class":391},[366,621,548],{"class":395},[366,623,507],{"class":391},[366,625,627],{"class":626},"sBMFI"," string",[366,629,630],{"class":391},"):",[366,632,627],{"class":626},[366,634,405],{"class":391},[366,636,637,639,642,645,648,651,654,656,659,661,664,666,669,672,674],{"class":368,"line":431},[366,638,411],{"class":387},[366,640,641],{"class":391}," [",[366,643,644],{"class":383},"local",[366,646,647],{"class":391},",",[366,649,650],{"class":383}," domain",[366,652,653],{"class":391},"]",[366,655,417],{"class":391},[366,657,658],{"class":383}," email",[366,660,490],{"class":391},[366,662,663],{"class":379},"split",[366,665,384],{"class":423},[366,667,668],{"class":391},"'",[366,670,601],{"class":671},"sfazB",[366,673,668],{"class":391},[366,675,428],{"class":423},[366,677,678,681,683,686,689,692,695,698,701],{"class":368,"line":453},[366,679,680],{"class":372},"  if",[366,682,392],{"class":423},[366,684,685],{"class":391},"!",[366,687,688],{"class":383},"domain",[366,690,691],{"class":423},") ",[366,693,694],{"class":372},"return",[366,696,697],{"class":391}," '",[366,699,700],{"class":671},"***",[366,702,703],{"class":391},"'\n",[366,705,706,708,710,713,715,718,720,722,724,726,728,730,732,734,736],{"class":368,"line":460},[366,707,411],{"class":387},[366,709,641],{"class":391},[366,711,712],{"class":383},"domainName",[366,714,647],{"class":391},[366,716,717],{"class":383}," tld",[366,719,653],{"class":391},[366,721,417],{"class":391},[366,723,650],{"class":383},[366,725,490],{"class":391},[366,727,663],{"class":379},[366,729,384],{"class":423},[366,731,668],{"class":391},[366,733,490],{"class":671},[366,735,668],{"class":391},[366,737,428],{"class":423},[366,739,740,743,746,749,753,755,757,760,763,766,768,770,772,775,777,780],{"class":368,"line":467},[366,741,742],{"class":372},"  return",[366,744,745],{"class":391}," `${",[366,747,748],{"class":383},"local[",[366,750,752],{"class":751},"sbssI","0",[366,754,653],{"class":383},[366,756,578],{"class":391},[366,758,759],{"class":671},"***@",[366,761,762],{"class":391},"${",[366,764,765],{"class":383},"domainName[",[366,767,752],{"class":751},[366,769,653],{"class":383},[366,771,578],{"class":391},[366,773,774],{"class":671},"***.",[366,776,762],{"class":391},[366,778,779],{"class":383},"tld",[366,781,782],{"class":391},"}`\n",[366,784,785],{"class":368,"line":473},[366,786,787],{"class":391},"}\n",[366,789,790],{"class":368,"line":478},[366,791,457],{"emptyLinePlaceholder":456},[366,793,794],{"class":368,"line":484},[366,795,796],{"class":463},"\u002F** Masks card number: 4242424242424242 → ****4242 *\u002F\n",[366,798,799,801,803,806,808,811,813,815,817,819],{"class":368,"line":501},[366,800,373],{"class":372},[366,802,615],{"class":387},[366,804,805],{"class":379}," maskCard",[366,807,384],{"class":391},[366,809,810],{"class":395},"card",[366,812,507],{"class":391},[366,814,627],{"class":626},[366,816,630],{"class":391},[366,818,627],{"class":626},[366,820,405],{"class":391},[366,822,823,825,828,831,833,835,837,840,842,845,848,850],{"class":368,"line":512},[366,824,742],{"class":372},[366,826,827],{"class":391}," `",[366,829,830],{"class":671},"****",[366,832,762],{"class":391},[366,834,810],{"class":383},[366,836,490],{"class":391},[366,838,839],{"class":379},"slice",[366,841,384],{"class":383},[366,843,844],{"class":391},"-",[366,846,847],{"class":751},"4",[366,849,399],{"class":383},[366,851,782],{"class":391},[366,853,854],{"class":368,"line":530},[366,855,787],{"class":391},[366,857,858],{"class":368,"line":555},[366,859,457],{"emptyLinePlaceholder":456},[366,861,862],{"class":368,"line":561},[366,863,864],{"class":463},"\u002F** Truncates long IDs for readability *\u002F\n",[366,866,867,869,871,874,876,878,880,882,884,887,889,892,894,896],{"class":368,"line":567},[366,868,373],{"class":372},[366,870,615],{"class":387},[366,872,873],{"class":379}," truncateId",[366,875,384],{"class":391},[366,877,524],{"class":395},[366,879,507],{"class":391},[366,881,627],{"class":626},[366,883,647],{"class":391},[366,885,886],{"class":395}," length",[366,888,417],{"class":391},[366,890,891],{"class":751}," 8",[366,893,630],{"class":391},[366,895,627],{"class":626},[366,897,405],{"class":391},[366,899,900,902,904,906,908,911,914,916,918,920],{"class":368,"line":575},[366,901,680],{"class":372},[366,903,392],{"class":423},[366,905,524],{"class":383},[366,907,490],{"class":391},[366,909,910],{"class":383},"length",[366,912,913],{"class":391}," \u003C=",[366,915,886],{"class":383},[366,917,691],{"class":423},[366,919,694],{"class":372},[366,921,922],{"class":383}," id\n",[366,924,926,928,930,932,934,936,938,940,942,945,947,950],{"class":368,"line":925},17,[366,927,742],{"class":372},[366,929,745],{"class":391},[366,931,524],{"class":383},[366,933,490],{"class":391},[366,935,839],{"class":379},[366,937,384],{"class":383},[366,939,752],{"class":751},[366,941,647],{"class":391},[366,943,944],{"class":383}," length)",[366,946,578],{"class":391},[366,948,949],{"class":671},"...",[366,951,952],{"class":391},"`\n",[366,954,956],{"class":368,"line":955},18,[366,957,787],{"class":391},[366,959,961],{"class":368,"line":960},19,[366,962,457],{"emptyLinePlaceholder":456},[366,964,966],{"class":368,"line":965},20,[366,967,968],{"class":463},"\u002F** Removes sensitive fields from an object *\u002F\n",[366,970,972,974,976,979,982,985,988,991,993,996,998,1001],{"class":368,"line":971},21,[366,973,373],{"class":372},[366,975,615],{"class":387},[366,977,978],{"class":379}," sanitize",[366,980,981],{"class":391},"\u003C",[366,983,984],{"class":626},"T",[366,986,987],{"class":387}," extends",[366,989,990],{"class":626}," Record",[366,992,981],{"class":391},[366,994,995],{"class":626},"string",[366,997,647],{"class":391},[366,999,1000],{"class":626}," unknown",[366,1002,1003],{"class":391},">>(\n",[366,1005,1007,1010,1012,1015],{"class":368,"line":1006},22,[366,1008,1009],{"class":395},"  obj",[366,1011,507],{"class":391},[366,1013,1014],{"class":626}," T",[366,1016,527],{"class":391},[366,1018,1020,1023,1025,1027,1030,1033,1035,1037,1040,1042,1044,1046,1049,1051,1053,1055,1058,1060,1062,1064,1067,1069,1071,1073,1076,1078],{"class":368,"line":1019},23,[366,1021,1022],{"class":395},"  sensitiveKeys",[366,1024,507],{"class":391},[366,1026,627],{"class":626},[366,1028,1029],{"class":383},"[] ",[366,1031,1032],{"class":391},"=",[366,1034,641],{"class":383},[366,1036,668],{"class":391},[366,1038,1039],{"class":671},"password",[366,1041,668],{"class":391},[366,1043,647],{"class":391},[366,1045,697],{"class":391},[366,1047,1048],{"class":671},"token",[366,1050,668],{"class":391},[366,1052,647],{"class":391},[366,1054,697],{"class":391},[366,1056,1057],{"class":671},"secret",[366,1059,668],{"class":391},[366,1061,647],{"class":391},[366,1063,697],{"class":391},[366,1065,1066],{"class":671},"apiKey",[366,1068,668],{"class":391},[366,1070,647],{"class":391},[366,1072,697],{"class":391},[366,1074,1075],{"class":671},"authorization",[366,1077,668],{"class":391},[366,1079,1080],{"class":383},"]\n",[366,1082,1084,1086,1089,1091,1093,1096],{"class":368,"line":1083},24,[366,1085,630],{"class":391},[366,1087,1088],{"class":626}," Partial",[366,1090,981],{"class":391},[366,1092,984],{"class":626},[366,1094,1095],{"class":391},">",[366,1097,405],{"class":391},[366,1099,1101,1103,1106,1108,1111,1114,1117],{"class":368,"line":1100},25,[366,1102,411],{"class":387},[366,1104,1105],{"class":383}," result",[366,1107,417],{"class":391},[366,1109,1110],{"class":391}," {",[366,1112,1113],{"class":391}," ...",[366,1115,1116],{"class":383},"obj",[366,1118,1119],{"class":391}," }\n",[366,1121,1123,1126,1128,1131,1134,1137,1140,1142],{"class":368,"line":1122},26,[366,1124,1125],{"class":372},"  for",[366,1127,392],{"class":423},[366,1129,1130],{"class":387},"const",[366,1132,1133],{"class":383}," key",[366,1135,1136],{"class":391}," of",[366,1138,1139],{"class":383}," sensitiveKeys",[366,1141,691],{"class":423},[366,1143,498],{"class":391},[366,1145,1147,1150,1152,1155,1158,1160,1162],{"class":368,"line":1146},27,[366,1148,1149],{"class":372},"    if",[366,1151,392],{"class":423},[366,1153,1154],{"class":383},"key",[366,1156,1157],{"class":391}," in",[366,1159,1105],{"class":383},[366,1161,691],{"class":423},[366,1163,498],{"class":391},[366,1165,1167,1170,1172,1175,1177],{"class":368,"line":1166},28,[366,1168,1169],{"class":391},"      delete",[366,1171,1105],{"class":383},[366,1173,1174],{"class":423},"[",[366,1176,1154],{"class":383},[366,1178,1080],{"class":423},[366,1180,1182],{"class":368,"line":1181},29,[366,1183,1184],{"class":391},"    }\n",[366,1186,1188],{"class":368,"line":1187},30,[366,1189,1190],{"class":391},"  }\n",[366,1192,1194,1196],{"class":368,"line":1193},31,[366,1195,742],{"class":372},[366,1197,1198],{"class":383}," result\n",[366,1200,1202],{"class":368,"line":1201},32,[366,1203,787],{"class":391},[244,1205,1206],{},"Usage:",[355,1208,1211],{"className":357,"code":1209,"filename":1210,"language":360,"meta":361,"style":361},"export default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const { user, card } = await readBody(event)\n\n  log.set({\n    user: {\n      id: user.id,\n      email: maskEmail(user.email),\n    },\n    payment: {\n      last4: maskCard(card.number),\n      \u002F\u002F ❌ Never: number, cvv, expiry\n    },\n  })\n})\n","server\u002Fapi\u002Fcheckout.post.ts",[363,1212,1213,1235,1251,1280,1284,1296,1304,1318,1339,1343,1352,1374,1379,1383,1389],{"__ignoreMap":361},[366,1214,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233],{"class":368,"line":369},[366,1216,373],{"class":372},[366,1218,376],{"class":372},[366,1220,380],{"class":379},[366,1222,384],{"class":383},[366,1224,388],{"class":387},[366,1226,392],{"class":391},[366,1228,396],{"class":395},[366,1230,399],{"class":391},[366,1232,402],{"class":387},[366,1234,405],{"class":391},[366,1236,1237,1239,1241,1243,1245,1247,1249],{"class":368,"line":408},[366,1238,411],{"class":387},[366,1240,414],{"class":383},[366,1242,417],{"class":391},[366,1244,420],{"class":379},[366,1246,384],{"class":423},[366,1248,396],{"class":383},[366,1250,428],{"class":423},[366,1252,1253,1255,1257,1260,1262,1265,1268,1270,1272,1274,1276,1278],{"class":368,"line":431},[366,1254,411],{"class":387},[366,1256,1110],{"class":391},[366,1258,1259],{"class":383}," user",[366,1261,647],{"class":391},[366,1263,1264],{"class":383}," card",[366,1266,1267],{"class":391}," }",[366,1269,417],{"class":391},[366,1271,441],{"class":372},[366,1273,444],{"class":379},[366,1275,384],{"class":423},[366,1277,396],{"class":383},[366,1279,428],{"class":423},[366,1281,1282],{"class":368,"line":453},[366,1283,457],{"emptyLinePlaceholder":456},[366,1285,1286,1288,1290,1292,1294],{"class":368,"line":460},[366,1287,487],{"class":383},[366,1289,490],{"class":391},[366,1291,493],{"class":379},[366,1293,384],{"class":423},[366,1295,498],{"class":391},[366,1297,1298,1300,1302],{"class":368,"line":467},[366,1299,504],{"class":423},[366,1301,507],{"class":391},[366,1303,405],{"class":391},[366,1305,1306,1308,1310,1312,1314,1316],{"class":368,"line":473},[366,1307,515],{"class":423},[366,1309,507],{"class":391},[366,1311,1259],{"class":383},[366,1313,490],{"class":391},[366,1315,524],{"class":383},[366,1317,527],{"class":391},[366,1319,1320,1322,1324,1326,1328,1331,1333,1335,1337],{"class":368,"line":478},[366,1321,533],{"class":423},[366,1323,507],{"class":391},[366,1325,538],{"class":379},[366,1327,384],{"class":423},[366,1329,1330],{"class":383},"user",[366,1332,490],{"class":391},[366,1334,548],{"class":383},[366,1336,399],{"class":423},[366,1338,527],{"class":391},[366,1340,1341],{"class":368,"line":484},[366,1342,564],{"class":391},[366,1344,1345,1348,1350],{"class":368,"line":501},[366,1346,1347],{"class":423},"    payment",[366,1349,507],{"class":391},[366,1351,405],{"class":391},[366,1353,1354,1357,1359,1361,1363,1365,1367,1370,1372],{"class":368,"line":512},[366,1355,1356],{"class":423},"      last4",[366,1358,507],{"class":391},[366,1360,805],{"class":379},[366,1362,384],{"class":423},[366,1364,810],{"class":383},[366,1366,490],{"class":391},[366,1368,1369],{"class":383},"number",[366,1371,399],{"class":423},[366,1373,527],{"class":391},[366,1375,1376],{"class":368,"line":530},[366,1377,1378],{"class":463},"      \u002F\u002F ❌ Never: number, cvv, expiry\n",[366,1380,1381],{"class":368,"line":555},[366,1382,564],{"class":391},[366,1384,1385,1387],{"class":368,"line":561},[366,1386,570],{"class":391},[366,1388,428],{"class":423},[366,1390,1391,1393],{"class":368,"line":567},[366,1392,578],{"class":391},[366,1394,428],{"class":383},[347,1396,1398],{"id":1397},"drain-hook-filtering","Drain Hook Filtering",[244,1400,1401],{},"As a last line of defense, filter sensitive data before sending to external services:",[355,1403,1406],{"className":357,"code":1404,"filename":1405,"language":360,"meta":361,"style":361},"const SENSITIVE_KEYS = ['password', 'token', 'secret', 'apiKey', 'authorization', 'cookie']\n\nfunction deepSanitize(obj: Record\u003Cstring, unknown>): Record\u003Cstring, unknown> {\n  const result: Record\u003Cstring, unknown> = {}\n\n  for (const [key, value] of Object.entries(obj)) {\n    \u002F\u002F Check if key contains any sensitive keyword (case-insensitive)\n    if (SENSITIVE_KEYS.some(k => key.toLowerCase().includes(k))) {\n      result[key] = '[REDACTED]'\n    } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n      \u002F\u002F Recursively sanitize nested objects\n      result[key] = deepSanitize(value as Record\u003Cstring, unknown>)\n    } else {\n      result[key] = value\n    }\n  }\n\n  return result\n}\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', (ctx) => {\n    \u002F\u002F Sanitize before sending to external service\n    ctx.event = deepSanitize(ctx.event) as typeof ctx.event\n  })\n})\n","server\u002Fplugins\u002Fevlog-sanitize.ts",[363,1407,1408,1468,1472,1513,1538,1542,1580,1585,1630,1651,1706,1711,1746,1754,1769,1773,1777,1781,1787,1791,1795,1817,1854,1859,1895,1901],{"__ignoreMap":361},[366,1409,1410,1412,1415,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1464,1466],{"class":368,"line":369},[366,1411,1130],{"class":387},[366,1413,1414],{"class":383}," SENSITIVE_KEYS ",[366,1416,1032],{"class":391},[366,1418,641],{"class":383},[366,1420,668],{"class":391},[366,1422,1039],{"class":671},[366,1424,668],{"class":391},[366,1426,647],{"class":391},[366,1428,697],{"class":391},[366,1430,1048],{"class":671},[366,1432,668],{"class":391},[366,1434,647],{"class":391},[366,1436,697],{"class":391},[366,1438,1057],{"class":671},[366,1440,668],{"class":391},[366,1442,647],{"class":391},[366,1444,697],{"class":391},[366,1446,1066],{"class":671},[366,1448,668],{"class":391},[366,1450,647],{"class":391},[366,1452,697],{"class":391},[366,1454,1075],{"class":671},[366,1456,668],{"class":391},[366,1458,647],{"class":391},[366,1460,697],{"class":391},[366,1462,1463],{"class":671},"cookie",[366,1465,668],{"class":391},[366,1467,1080],{"class":383},[366,1469,1470],{"class":368,"line":408},[366,1471,457],{"emptyLinePlaceholder":456},[366,1473,1474,1477,1480,1482,1484,1486,1488,1490,1492,1494,1496,1499,1501,1503,1505,1507,1509,1511],{"class":368,"line":431},[366,1475,1476],{"class":387},"function",[366,1478,1479],{"class":379}," deepSanitize",[366,1481,384],{"class":391},[366,1483,1116],{"class":395},[366,1485,507],{"class":391},[366,1487,990],{"class":626},[366,1489,981],{"class":391},[366,1491,995],{"class":626},[366,1493,647],{"class":391},[366,1495,1000],{"class":626},[366,1497,1498],{"class":391},">):",[366,1500,990],{"class":626},[366,1502,981],{"class":391},[366,1504,995],{"class":626},[366,1506,647],{"class":391},[366,1508,1000],{"class":626},[366,1510,1095],{"class":391},[366,1512,405],{"class":391},[366,1514,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535],{"class":368,"line":453},[366,1516,411],{"class":387},[366,1518,1105],{"class":383},[366,1520,507],{"class":391},[366,1522,990],{"class":626},[366,1524,981],{"class":391},[366,1526,995],{"class":626},[366,1528,647],{"class":391},[366,1530,1000],{"class":626},[366,1532,1095],{"class":391},[366,1534,417],{"class":391},[366,1536,1537],{"class":391}," {}\n",[366,1539,1540],{"class":368,"line":460},[366,1541,457],{"emptyLinePlaceholder":456},[366,1543,1544,1546,1548,1550,1552,1554,1556,1559,1561,1563,1566,1568,1571,1573,1575,1578],{"class":368,"line":467},[366,1545,1125],{"class":372},[366,1547,392],{"class":423},[366,1549,1130],{"class":387},[366,1551,641],{"class":391},[366,1553,1154],{"class":383},[366,1555,647],{"class":391},[366,1557,1558],{"class":383}," value",[366,1560,653],{"class":391},[366,1562,1136],{"class":391},[366,1564,1565],{"class":383}," Object",[366,1567,490],{"class":391},[366,1569,1570],{"class":379},"entries",[366,1572,384],{"class":423},[366,1574,1116],{"class":383},[366,1576,1577],{"class":423},")) ",[366,1579,498],{"class":391},[366,1581,1582],{"class":368,"line":473},[366,1583,1584],{"class":463},"    \u002F\u002F Check if key contains any sensitive keyword (case-insensitive)\n",[366,1586,1587,1589,1591,1594,1596,1599,1601,1604,1606,1608,1610,1613,1616,1618,1621,1623,1625,1628],{"class":368,"line":478},[366,1588,1149],{"class":372},[366,1590,392],{"class":423},[366,1592,1593],{"class":383},"SENSITIVE_KEYS",[366,1595,490],{"class":391},[366,1597,1598],{"class":379},"some",[366,1600,384],{"class":423},[366,1602,1603],{"class":395},"k",[366,1605,402],{"class":387},[366,1607,1133],{"class":383},[366,1609,490],{"class":391},[366,1611,1612],{"class":379},"toLowerCase",[366,1614,1615],{"class":423},"()",[366,1617,490],{"class":391},[366,1619,1620],{"class":379},"includes",[366,1622,384],{"class":423},[366,1624,1603],{"class":383},[366,1626,1627],{"class":423},"))) ",[366,1629,498],{"class":391},[366,1631,1632,1635,1637,1639,1642,1644,1646,1649],{"class":368,"line":484},[366,1633,1634],{"class":383},"      result",[366,1636,1174],{"class":423},[366,1638,1154],{"class":383},[366,1640,1641],{"class":423},"] ",[366,1643,1032],{"class":391},[366,1645,697],{"class":391},[366,1647,1648],{"class":671},"[REDACTED]",[366,1650,703],{"class":391},[366,1652,1653,1656,1659,1662,1664,1667,1670,1673,1675,1678,1680,1683,1685,1687,1690,1693,1695,1698,1700,1702,1704],{"class":368,"line":501},[366,1654,1655],{"class":391},"    }",[366,1657,1658],{"class":372}," else",[366,1660,1661],{"class":372}," if",[366,1663,392],{"class":423},[366,1665,1666],{"class":383},"value",[366,1668,1669],{"class":391}," &&",[366,1671,1672],{"class":391}," typeof",[366,1674,1558],{"class":383},[366,1676,1677],{"class":391}," ===",[366,1679,697],{"class":391},[366,1681,1682],{"class":671},"object",[366,1684,668],{"class":391},[366,1686,1669],{"class":391},[366,1688,1689],{"class":391}," !",[366,1691,1692],{"class":383},"Array",[366,1694,490],{"class":391},[366,1696,1697],{"class":379},"isArray",[366,1699,384],{"class":423},[366,1701,1666],{"class":383},[366,1703,1577],{"class":423},[366,1705,498],{"class":391},[366,1707,1708],{"class":368,"line":512},[366,1709,1710],{"class":463},"      \u002F\u002F Recursively sanitize nested objects\n",[366,1712,1713,1715,1717,1719,1721,1723,1725,1727,1729,1732,1734,1736,1738,1740,1742,1744],{"class":368,"line":530},[366,1714,1634],{"class":383},[366,1716,1174],{"class":423},[366,1718,1154],{"class":383},[366,1720,1641],{"class":423},[366,1722,1032],{"class":391},[366,1724,1479],{"class":379},[366,1726,384],{"class":423},[366,1728,1666],{"class":383},[366,1730,1731],{"class":372}," as",[366,1733,990],{"class":626},[366,1735,981],{"class":391},[366,1737,995],{"class":626},[366,1739,647],{"class":391},[366,1741,1000],{"class":626},[366,1743,1095],{"class":391},[366,1745,428],{"class":423},[366,1747,1748,1750,1752],{"class":368,"line":555},[366,1749,1655],{"class":391},[366,1751,1658],{"class":372},[366,1753,405],{"class":391},[366,1755,1756,1758,1760,1762,1764,1766],{"class":368,"line":561},[366,1757,1634],{"class":383},[366,1759,1174],{"class":423},[366,1761,1154],{"class":383},[366,1763,1641],{"class":423},[366,1765,1032],{"class":391},[366,1767,1768],{"class":383}," value\n",[366,1770,1771],{"class":368,"line":567},[366,1772,1184],{"class":391},[366,1774,1775],{"class":368,"line":575},[366,1776,1190],{"class":391},[366,1778,1779],{"class":368,"line":925},[366,1780,457],{"emptyLinePlaceholder":456},[366,1782,1783,1785],{"class":368,"line":955},[366,1784,742],{"class":372},[366,1786,1198],{"class":383},[366,1788,1789],{"class":368,"line":960},[366,1790,787],{"class":391},[366,1792,1793],{"class":368,"line":965},[366,1794,457],{"emptyLinePlaceholder":456},[366,1796,1797,1799,1801,1804,1806,1808,1811,1813,1815],{"class":368,"line":971},[366,1798,373],{"class":372},[366,1800,376],{"class":372},[366,1802,1803],{"class":379}," defineNitroPlugin",[366,1805,384],{"class":383},[366,1807,384],{"class":391},[366,1809,1810],{"class":395},"nitroApp",[366,1812,399],{"class":391},[366,1814,402],{"class":387},[366,1816,405],{"class":391},[366,1818,1819,1822,1824,1827,1829,1832,1834,1836,1839,1841,1843,1845,1848,1850,1852],{"class":368,"line":1006},[366,1820,1821],{"class":383},"  nitroApp",[366,1823,490],{"class":391},[366,1825,1826],{"class":383},"hooks",[366,1828,490],{"class":391},[366,1830,1831],{"class":379},"hook",[366,1833,384],{"class":423},[366,1835,668],{"class":391},[366,1837,1838],{"class":671},"evlog:drain",[366,1840,668],{"class":391},[366,1842,647],{"class":391},[366,1844,392],{"class":391},[366,1846,1847],{"class":395},"ctx",[366,1849,399],{"class":391},[366,1851,402],{"class":387},[366,1853,405],{"class":391},[366,1855,1856],{"class":368,"line":1019},[366,1857,1858],{"class":463},"    \u002F\u002F Sanitize before sending to external service\n",[366,1860,1861,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882,1885,1887,1890,1892],{"class":368,"line":1083},[366,1862,1863],{"class":383},"    ctx",[366,1865,490],{"class":391},[366,1867,396],{"class":383},[366,1869,417],{"class":391},[366,1871,1479],{"class":379},[366,1873,384],{"class":423},[366,1875,1847],{"class":383},[366,1877,490],{"class":391},[366,1879,396],{"class":383},[366,1881,691],{"class":423},[366,1883,1884],{"class":372},"as",[366,1886,1672],{"class":391},[366,1888,1889],{"class":383}," ctx",[366,1891,490],{"class":391},[366,1893,1894],{"class":383},"event\n",[366,1896,1897,1899],{"class":368,"line":1100},[366,1898,570],{"class":391},[366,1900,428],{"class":423},[366,1902,1903,1905],{"class":368,"line":1122},[366,1904,578],{"class":391},[366,1906,428],{"class":383},[338,1908,1911],{"color":1909,"icon":1910},"warning","i-lucide-lightbulb","Drain hook sanitization is a safety net, not a replacement for careful logging practices. Always sanitize at the source.",[248,1913,1915],{"id":1914},"production-checklist","Production Checklist",[244,1917,1918],{},"Before deploying to production, verify:",[347,1920,1922],{"id":1921},"logging-configuration","Logging Configuration",[1924,1925,1928,1941,1947,1953],"ul",{"className":1926},[1927],"contains-task-list",[1929,1930,1933,1937,1938,399],"li",{"className":1931},[1932],"task-list-item",[1934,1935],"input",{"disabled":456,"type":1936},"checkbox"," Service name is set (",[363,1939,1940],{},"env.service",[1929,1942,1944,1946],{"className":1943},[1932],[1934,1945],{"disabled":456,"type":1936}," Sampling is configured for high-traffic routes",[1929,1948,1950,1952],{"className":1949},[1932],[1934,1951],{"disabled":456,"type":1936}," Log draining is set up for external service (Axiom, Loki, etc.)",[1929,1954,1956,1958,1959,399],{"className":1955},[1932],[1934,1957],{"disabled":456,"type":1936}," Pretty mode is disabled in production (",[363,1960,1961],{},"pretty: false",[347,1963,1965],{"id":1964},"data-security","Data Security",[1924,1967,1969,1975,1981,1987,1993,1999],{"className":1968},[1927],[1929,1970,1972,1974],{"className":1971},[1932],[1934,1973],{"disabled":456,"type":1936}," No passwords or secrets in logs",[1929,1976,1978,1980],{"className":1977},[1932],[1934,1979],{"disabled":456,"type":1936}," No full credit card numbers (only last 4 digits)",[1929,1982,1984,1986],{"className":1983},[1932],[1934,1985],{"disabled":456,"type":1936}," No API keys or tokens",[1929,1988,1990,1992],{"className":1989},[1932],[1934,1991],{"disabled":456,"type":1936}," PII is masked or omitted (emails, phone numbers)",[1929,1994,1996,1998],{"className":1995},[1932],[1934,1997],{"disabled":456,"type":1936}," Session tokens are not logged",[1929,2000,2002,2004,2005,399],{"className":2001},[1932],[1934,2003],{"disabled":456,"type":1936}," Request bodies are selectively logged (not ",[363,2006,2007],{},"log.set({ body })",[347,2009,2011],{"id":2010},"error-handling","Error Handling",[1924,2013,2015,2025,2031],{"className":2014},[1927],[1929,2016,2018,2020,2021,2024],{"className":2017},[1932],[1934,2019],{"disabled":456,"type":1936}," Errors use ",[363,2022,2023],{},"createError()"," with structured fields",[1929,2026,2028,2030],{"className":2027},[1932],[1934,2029],{"disabled":456,"type":1936}," Sensitive data is not included in error messages",[1929,2032,2034,2036],{"className":2033},[1932],[1934,2035],{"disabled":456,"type":1936}," Stack traces don't expose internal paths in production",[248,2038,2040],{"id":2039},"field-naming-conventions","Field Naming Conventions",[244,2042,2043],{},"Use consistent, grouped field names across your codebase:",[355,2045,2047],{"className":357,"code":2046,"language":360,"meta":361,"style":361},"\u002F\u002F ✅ Good - grouped and descriptive\nlog.set({\n  user: { id, plan, accountAge },\n  cart: { items, total, currency },\n  payment: { method, provider, last4 },\n})\n\n\u002F\u002F ❌ Bad - flat and abbreviated\nlog.set({\n  uid: '123',\n  n: 3,\n  t: 9999,\n  pm: 'card',\n})\n",[363,2048,2049,2054,2067,2092,2116,2140,2146,2150,2155,2167,2183,2195,2207,2222],{"__ignoreMap":361},[366,2050,2051],{"class":368,"line":369},[366,2052,2053],{"class":463},"\u002F\u002F ✅ Good - grouped and descriptive\n",[366,2055,2056,2059,2061,2063,2065],{"class":368,"line":408},[366,2057,2058],{"class":383},"log",[366,2060,490],{"class":391},[366,2062,493],{"class":379},[366,2064,384],{"class":383},[366,2066,498],{"class":391},[366,2068,2069,2072,2074,2076,2079,2081,2084,2086,2089],{"class":368,"line":431},[366,2070,2071],{"class":423},"  user",[366,2073,507],{"class":391},[366,2075,1110],{"class":391},[366,2077,2078],{"class":383}," id",[366,2080,647],{"class":391},[366,2082,2083],{"class":383}," plan",[366,2085,647],{"class":391},[366,2087,2088],{"class":383}," accountAge ",[366,2090,2091],{"class":391},"},\n",[366,2093,2094,2097,2099,2101,2104,2106,2109,2111,2114],{"class":368,"line":453},[366,2095,2096],{"class":423},"  cart",[366,2098,507],{"class":391},[366,2100,1110],{"class":391},[366,2102,2103],{"class":383}," items",[366,2105,647],{"class":391},[366,2107,2108],{"class":383}," total",[366,2110,647],{"class":391},[366,2112,2113],{"class":383}," currency ",[366,2115,2091],{"class":391},[366,2117,2118,2121,2123,2125,2128,2130,2133,2135,2138],{"class":368,"line":460},[366,2119,2120],{"class":423},"  payment",[366,2122,507],{"class":391},[366,2124,1110],{"class":391},[366,2126,2127],{"class":383}," method",[366,2129,647],{"class":391},[366,2131,2132],{"class":383}," provider",[366,2134,647],{"class":391},[366,2136,2137],{"class":383}," last4 ",[366,2139,2091],{"class":391},[366,2141,2142,2144],{"class":368,"line":467},[366,2143,578],{"class":391},[366,2145,428],{"class":383},[366,2147,2148],{"class":368,"line":473},[366,2149,457],{"emptyLinePlaceholder":456},[366,2151,2152],{"class":368,"line":478},[366,2153,2154],{"class":463},"\u002F\u002F ❌ Bad - flat and abbreviated\n",[366,2156,2157,2159,2161,2163,2165],{"class":368,"line":484},[366,2158,2058],{"class":383},[366,2160,490],{"class":391},[366,2162,493],{"class":379},[366,2164,384],{"class":383},[366,2166,498],{"class":391},[366,2168,2169,2172,2174,2176,2179,2181],{"class":368,"line":501},[366,2170,2171],{"class":423},"  uid",[366,2173,507],{"class":391},[366,2175,697],{"class":391},[366,2177,2178],{"class":671},"123",[366,2180,668],{"class":391},[366,2182,527],{"class":391},[366,2184,2185,2188,2190,2193],{"class":368,"line":512},[366,2186,2187],{"class":423},"  n",[366,2189,507],{"class":391},[366,2191,2192],{"class":751}," 3",[366,2194,527],{"class":391},[366,2196,2197,2200,2202,2205],{"class":368,"line":530},[366,2198,2199],{"class":423},"  t",[366,2201,507],{"class":391},[366,2203,2204],{"class":751}," 9999",[366,2206,527],{"class":391},[366,2208,2209,2212,2214,2216,2218,2220],{"class":368,"line":555},[366,2210,2211],{"class":423},"  pm",[366,2213,507],{"class":391},[366,2215,697],{"class":391},[366,2217,810],{"class":671},[366,2219,668],{"class":391},[366,2221,527],{"class":391},[366,2223,2224,2226],{"class":368,"line":561},[366,2225,578],{"class":391},[366,2227,428],{"class":383},[347,2229,2231],{"id":2230},"recommended-field-structure","Recommended Field Structure",[260,2233,2234,2243],{},[263,2235,2236],{},[266,2237,2238,2240],{},[269,2239,271],{},[269,2241,2242],{},"Fields",[279,2244,2245,2265,2286,2311,2331],{},[266,2246,2247,2251],{},[284,2248,2249],{},[363,2250,1330],{},[284,2252,2253,2255,2256,2255,2259,2255,2262],{},[363,2254,524],{},", ",[363,2257,2258],{},"plan",[363,2260,2261],{},"role",[363,2263,2264],{},"accountAge",[266,2266,2267,2272],{},[284,2268,2269],{},[363,2270,2271],{},"request",[284,2273,2274,2255,2277,2255,2280,2255,2283],{},[363,2275,2276],{},"method",[363,2278,2279],{},"path",[363,2281,2282],{},"requestId",[363,2284,2285],{},"traceId",[266,2287,2288,2297],{},[284,2289,2290,2293,2294],{},[363,2291,2292],{},"cart"," \u002F ",[363,2295,2296],{},"order",[284,2298,2299,2255,2302,2255,2305,2255,2308],{},[363,2300,2301],{},"items",[363,2303,2304],{},"total",[363,2306,2307],{},"currency",[363,2309,2310],{},"coupon",[266,2312,2313,2318],{},[284,2314,2315],{},[363,2316,2317],{},"payment",[284,2319,2320,2255,2322,2255,2325,2255,2328],{},[363,2321,2276],{},[363,2323,2324],{},"provider",[363,2326,2327],{},"last4",[363,2329,2330],{},"status",[266,2332,2333,2338],{},[284,2334,2335],{},[363,2336,2337],{},"outcome",[284,2339,2340,2255,2342,2255,2345],{},[363,2341,2330],{},[363,2343,2344],{},"duration",[363,2346,340],{},[248,2348,2350],{"id":2349},"sampling-strategy","Sampling Strategy",[244,2352,2353],{},"At scale, log volume can become expensive. Use sampling wisely:",[355,2355,2358],{"className":357,"code":2356,"filename":2357,"language":360,"meta":361,"style":361},"export default defineNuxtConfig({\n  evlog: {\n    sampling: {\n      \u002F\u002F Head sampling: random percentage per level\n      rates: {\n        info: 10,    \u002F\u002F 10% of success logs\n        warn: 50,    \u002F\u002F 50% of warnings\n        debug: 0,    \u002F\u002F No debug logs in prod\n        error: 100,  \u002F\u002F Always keep errors\n      },\n      \u002F\u002F Tail sampling: force-keep based on outcome\n      keep: [\n        { duration: 1000 },           \u002F\u002F Slow requests (≥1s)\n        { status: 400 },              \u002F\u002F Client\u002Fserver errors\n        { path: '\u002Fapi\u002Fpayments\u002F**' }, \u002F\u002F Critical paths\n      ],\n    },\n  },\n})\n","nuxt.config.ts",[363,2359,2360,2373,2382,2391,2396,2405,2420,2435,2450,2465,2470,2475,2485,2504,2521,2542,2549,2553,2558],{"__ignoreMap":361},[366,2361,2362,2364,2366,2369,2371],{"class":368,"line":369},[366,2363,373],{"class":372},[366,2365,376],{"class":372},[366,2367,2368],{"class":379}," defineNuxtConfig",[366,2370,384],{"class":383},[366,2372,498],{"class":391},[366,2374,2375,2378,2380],{"class":368,"line":408},[366,2376,2377],{"class":423},"  evlog",[366,2379,507],{"class":391},[366,2381,405],{"class":391},[366,2383,2384,2387,2389],{"class":368,"line":431},[366,2385,2386],{"class":423},"    sampling",[366,2388,507],{"class":391},[366,2390,405],{"class":391},[366,2392,2393],{"class":368,"line":453},[366,2394,2395],{"class":463},"      \u002F\u002F Head sampling: random percentage per level\n",[366,2397,2398,2401,2403],{"class":368,"line":460},[366,2399,2400],{"class":423},"      rates",[366,2402,507],{"class":391},[366,2404,405],{"class":391},[366,2406,2407,2410,2412,2415,2417],{"class":368,"line":467},[366,2408,2409],{"class":423},"        info",[366,2411,507],{"class":391},[366,2413,2414],{"class":751}," 10",[366,2416,647],{"class":391},[366,2418,2419],{"class":463},"    \u002F\u002F 10% of success logs\n",[366,2421,2422,2425,2427,2430,2432],{"class":368,"line":473},[366,2423,2424],{"class":423},"        warn",[366,2426,507],{"class":391},[366,2428,2429],{"class":751}," 50",[366,2431,647],{"class":391},[366,2433,2434],{"class":463},"    \u002F\u002F 50% of warnings\n",[366,2436,2437,2440,2442,2445,2447],{"class":368,"line":478},[366,2438,2439],{"class":423},"        debug",[366,2441,507],{"class":391},[366,2443,2444],{"class":751}," 0",[366,2446,647],{"class":391},[366,2448,2449],{"class":463},"    \u002F\u002F No debug logs in prod\n",[366,2451,2452,2455,2457,2460,2462],{"class":368,"line":484},[366,2453,2454],{"class":423},"        error",[366,2456,507],{"class":391},[366,2458,2459],{"class":751}," 100",[366,2461,647],{"class":391},[366,2463,2464],{"class":463},"  \u002F\u002F Always keep errors\n",[366,2466,2467],{"class":368,"line":501},[366,2468,2469],{"class":391},"      },\n",[366,2471,2472],{"class":368,"line":512},[366,2473,2474],{"class":463},"      \u002F\u002F Tail sampling: force-keep based on outcome\n",[366,2476,2477,2480,2482],{"class":368,"line":530},[366,2478,2479],{"class":423},"      keep",[366,2481,507],{"class":391},[366,2483,2484],{"class":383}," [\n",[366,2486,2487,2490,2493,2495,2498,2501],{"class":368,"line":555},[366,2488,2489],{"class":391},"        {",[366,2491,2492],{"class":423}," duration",[366,2494,507],{"class":391},[366,2496,2497],{"class":751}," 1000",[366,2499,2500],{"class":391}," },",[366,2502,2503],{"class":463},"           \u002F\u002F Slow requests (≥1s)\n",[366,2505,2506,2508,2511,2513,2516,2518],{"class":368,"line":561},[366,2507,2489],{"class":391},[366,2509,2510],{"class":423}," status",[366,2512,507],{"class":391},[366,2514,2515],{"class":751}," 400",[366,2517,2500],{"class":391},[366,2519,2520],{"class":463},"              \u002F\u002F Client\u002Fserver errors\n",[366,2522,2523,2525,2528,2530,2532,2535,2537,2539],{"class":368,"line":567},[366,2524,2489],{"class":391},[366,2526,2527],{"class":423}," path",[366,2529,507],{"class":391},[366,2531,697],{"class":391},[366,2533,2534],{"class":671},"\u002Fapi\u002Fpayments\u002F**",[366,2536,668],{"class":391},[366,2538,2500],{"class":391},[366,2540,2541],{"class":463}," \u002F\u002F Critical paths\n",[366,2543,2544,2547],{"class":368,"line":575},[366,2545,2546],{"class":383},"      ]",[366,2548,527],{"class":391},[366,2550,2551],{"class":368,"line":925},[366,2552,564],{"class":391},[366,2554,2555],{"class":368,"line":955},[366,2556,2557],{"class":391},"  },\n",[366,2559,2560,2562],{"class":368,"line":960},[366,2561,578],{"class":391},[366,2563,428],{"class":383},[338,2565,2567,2568,2571,2572,490],{"color":2566,"icon":13},"info","Use ",[363,2569,2570],{},"$production"," override to keep full logging in development while sampling in production. See ",[2573,2574,2576],"a",{"href":2575},"\u002Fframeworks\u002Fnuxt#sampling","Nuxt framework guide",[248,2578,2580],{"id":2579},"next-steps","Next Steps",[1924,2582,2583,2588],{},[1929,2584,2585,2587],{},[2573,2586,121],{"href":122}," - Design effective wide events",[1929,2589,2590,2592],{},[2573,2591,126],{"href":127}," - Error handling patterns",[2594,2595,2596],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}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 .s6hCs, html code.shiki .s6hCs{--shiki-light:#9C3EDA;--shiki-light-font-style:italic;--shiki-default:#C792EA;--shiki-default-font-style:italic;--shiki-dark:#C792EA;--shiki-dark-font-style:italic}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 pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":361,"searchDepth":408,"depth":408,"links":2598},[2599,2600,2605,2610,2613,2614],{"id":250,"depth":408,"text":251},{"id":344,"depth":408,"text":345,"children":2601},[2602,2603,2604],{"id":349,"depth":431,"text":350},{"id":583,"depth":431,"text":584},{"id":1397,"depth":431,"text":1398},{"id":1914,"depth":408,"text":1915,"children":2606},[2607,2608,2609],{"id":1921,"depth":431,"text":1922},{"id":1964,"depth":431,"text":1965},{"id":2010,"depth":431,"text":2011},{"id":2039,"depth":408,"text":2040,"children":2611},[2612],{"id":2230,"depth":431,"text":2231},{"id":2349,"depth":408,"text":2350},{"id":2579,"depth":408,"text":2580},"Security guidelines, data sanitization, and production tips for evlog. Learn what not to log and how to protect sensitive data.","md",[2618],{"label":155,"icon":2619,"to":160,"color":2620,"variant":2621},"i-lucide-plug","neutral","subtle",{},{"icon":134},{"title":131,"description":2615},"l4NQ-wx4y1V54-gq1nYDA7gDmYnQDvarYoqlaE7PxyA",[2627,2629],{"title":126,"path":127,"stem":128,"description":2628,"icon":129,"children":-1},"Create errors that explain why they occurred and how to fix them. Add actionable context with why, fix, and link fields for humans and AI agents.",{"title":136,"path":137,"stem":138,"description":2630,"icon":99,"children":-1},"Add compile-time type safety to your wide events with TypeScript module augmentation. Prevent typos and ensure consistent field names across your codebase.",1773504117849]