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