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