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