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