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