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