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