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