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