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