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