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