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