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