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