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