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