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