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