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