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