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