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