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