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