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