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