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