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