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