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