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