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