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