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