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