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