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