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