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