[{"data":1,"prerenderedAt":3874},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-nestjs":538,"-integrate-frameworks-nestjs-surround":3869},[4,30,80,128,308,440,499],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113,118,123],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":94,"path":95,"stem":96,"icon":97},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":99,"path":100,"stem":101,"icon":102},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":104,"path":105,"stem":106,"icon":107},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":109,"path":110,"stem":111,"icon":112},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":114,"path":115,"stem":116,"icon":117},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":119,"path":120,"stem":121,"icon":122},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":124,"path":125,"stem":126,"icon":127},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":129,"path":130,"stem":131,"children":132,"page":29},"Integrate","\u002Fintegrate","4.integrate",[133,137,220],{"title":36,"path":134,"stem":135,"icon":136},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[142,145,175,200],{"title":36,"path":143,"stem":144,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":146,"path":147,"stem":148,"children":149,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[150,155,160,165,170],{"title":151,"path":152,"stem":153,"icon":154},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":156,"path":157,"stem":158,"icon":159},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":161,"path":162,"stem":163,"icon":164},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":166,"path":167,"stem":168,"icon":169},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":171,"path":172,"stem":173,"icon":174},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[180,185,190,195],{"title":181,"path":182,"stem":183,"icon":184},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":186,"path":187,"stem":188,"icon":189},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":191,"path":192,"stem":193,"icon":194},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":196,"path":197,"stem":198,"icon":199},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":201,"path":202,"stem":203,"children":204,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[205,210,215],{"title":206,"path":207,"stem":208,"icon":209},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":211,"path":212,"stem":213,"icon":214},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":216,"path":217,"stem":218,"icon":219},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":221,"path":222,"stem":223,"children":224,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[225,229,234,239,244,249,254,259,264,269,274,279,284,289,293,298,303],{"title":36,"path":226,"stem":227,"icon":228},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":230,"path":231,"stem":232,"icon":233},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":235,"path":236,"stem":237,"icon":238},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":240,"path":241,"stem":242,"icon":243},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":245,"path":246,"stem":247,"icon":248},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":250,"path":251,"stem":252,"icon":253},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":255,"path":256,"stem":257,"icon":258},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":260,"path":261,"stem":262,"icon":263},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":265,"path":266,"stem":267,"icon":268},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":270,"path":271,"stem":272,"icon":273},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":275,"path":276,"stem":277,"icon":278},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":280,"path":281,"stem":282,"icon":283},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":285,"path":286,"stem":287,"icon":288},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":290,"path":291,"stem":292,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":294,"path":295,"stem":296,"icon":297},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":299,"path":300,"stem":301,"icon":302},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":304,"path":305,"stem":306,"icon":307},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":309,"path":310,"stem":311,"children":312,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[313,316,321,350,377,409,430,435],{"title":36,"path":314,"stem":315,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":317,"path":318,"stem":319,"icon":320},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":322,"icon":323,"path":324,"stem":325,"children":326,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[327,330,335,340,345],{"title":36,"path":328,"stem":329,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":331,"path":332,"stem":333,"icon":334},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":336,"path":337,"stem":338,"icon":339},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":341,"path":342,"stem":343,"icon":344},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":346,"path":347,"stem":348,"icon":349},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":351,"icon":352,"path":353,"stem":354,"children":355,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[356,359,364,369,373],{"title":36,"path":357,"stem":358,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":360,"path":361,"stem":362,"icon":363},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":365,"path":366,"stem":367,"icon":368},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":370,"path":371,"stem":372,"icon":320},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":374,"path":375,"stem":376,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":378,"icon":379,"path":380,"stem":381,"children":382,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[383,386,391,396,401,405],{"title":36,"path":384,"stem":385,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":387,"path":388,"stem":389,"icon":390},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":392,"path":393,"stem":394,"icon":395},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":397,"path":398,"stem":399,"icon":400},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":402,"path":403,"stem":404,"icon":379},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":406,"path":407,"stem":408,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":346,"icon":107,"path":410,"stem":411,"children":412,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[413,416,421,426],{"title":36,"path":414,"stem":415,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":417,"path":418,"stem":419,"icon":420},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":422,"path":423,"stem":424,"icon":425},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":427,"path":428,"stem":429,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":431,"path":432,"stem":433,"icon":434},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":436,"path":437,"stem":438,"icon":439},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":441,"path":442,"stem":443,"children":444,"page":29},"Extend","\u002Fextend","6.extend",[445,449,454,459,463,468,472,476,480,484,489,494],{"title":36,"path":446,"stem":447,"icon":448},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":450,"path":451,"stem":452,"icon":453},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":455,"path":456,"stem":457,"icon":458},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":460,"path":461,"stem":462,"icon":453},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":464,"path":465,"stem":466,"icon":467},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":406,"path":469,"stem":470,"icon":471},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":473,"path":474,"stem":475,"icon":448},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":477,"path":478,"stem":479,"icon":434},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":481,"path":482,"stem":483,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":485,"path":486,"stem":487,"icon":488},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":490,"path":491,"stem":492,"icon":493},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":495,"path":496,"stem":497,"icon":498},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":427,"path":500,"stem":501,"children":502,"page":29},"\u002Freference","7.reference",[503,507,512,515,520,524,529,533],{"title":36,"path":504,"stem":505,"icon":506},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":508,"path":509,"stem":510,"icon":511},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":374,"path":513,"stem":514,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":516,"path":517,"stem":518,"icon":519},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":521,"path":522,"stem":523,"icon":379},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":525,"path":526,"stem":527,"icon":528},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":530,"path":531,"stem":532,"icon":434},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":534,"path":535,"stem":536,"icon":537},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"id":539,"title":255,"body":540,"description":3859,"extension":3860,"links":3861,"meta":3865,"navigation":3866,"path":256,"seo":3867,"stem":257,"__hash__":3868},"docs\u002F4.integrate\u002Fframeworks\u002F06.nestjs.md",{"type":541,"value":542,"toc":3838},"minimark",[543,564,608,612,617,715,719,863,867,1038,1043,1046,1049,1445,1448,1512,1515,1521,1708,1812,1828,1835,1849,2009,2013,2031,2427,2430,2664,2667,2714,2717,2727,2731,2736,2976,2980,2990,3252,3256,3263,3451,3464,3468,3474,3576,3580,3590,3730,3734,3776,3784,3794,3798,3805,3834],[544,545,546,547,551,552,555,556,559,560,563],"p",{},"The ",[548,549,550],"code",{},"evlog\u002Fnestjs"," module provides ",[548,553,554],{},"EvlogModule.forRoot()"," which registers a global middleware, creating a request-scoped logger accessible via ",[548,557,558],{},"useLogger()"," or ",[548,561,562],{},"req.log",", emitting a wide event when the response completes.",[565,566,569,572,594],"prompt",{":actions":567,"description":568,"icon":258},"[\"copy\",\"cursor\",\"claude\"]","Set up evlog in my NestJS app",[544,570,571],{},"Set up evlog in my NestJS app.",[573,574,575,579,582,585,588,591],"ul",{},[576,577,578],"li",{},"Install evlog: pnpm add evlog",[576,580,581],{},"Import EvlogModule from 'evlog\u002Fnestjs' and add EvlogModule.forRoot() to AppModule imports",[576,583,584],{},"The global middleware auto-creates a request-scoped logger for every request",[576,586,587],{},"Use useLogger() in any controller or service to access the logger",[576,589,590],{},"Use log.set() to accumulate context, throw createError() for structured errors",[576,592,593],{},"Optionally pass drain, enrich, and keep callbacks to forRoot()",[544,595,596,597,603,604],{},"Docs: ",[598,599,600],"a",{"href":600,"rel":601},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Fnestjs",[602],"nofollow","\nAdapters: ",[598,605,606],{"href":606,"rel":607},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[602],[609,610,25],"h2",{"id":611},"quick-start",[613,614,616],"h3",{"id":615},"_1-install","1. Install",[618,619,620,654,674,694],"code-group",{},[621,622,628],"pre",{"className":623,"code":624,"filename":625,"language":626,"meta":627,"style":627},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog @nestjs\u002Fcommon @nestjs\u002Fcore @nestjs\u002Fplatform-express\n","pnpm","bash","",[548,629,630],{"__ignoreMap":627},[631,632,635,638,642,645,648,651],"span",{"class":633,"line":634},"line",1,[631,636,625],{"class":637},"sBMFI",[631,639,641],{"class":640},"sfazB"," add",[631,643,644],{"class":640}," evlog",[631,646,647],{"class":640}," @nestjs\u002Fcommon",[631,649,650],{"class":640}," @nestjs\u002Fcore",[631,652,653],{"class":640}," @nestjs\u002Fplatform-express\n",[621,655,658],{"className":623,"code":656,"filename":657,"language":626,"meta":627,"style":627},"bun add evlog @nestjs\u002Fcommon @nestjs\u002Fcore @nestjs\u002Fplatform-express\n","bun",[548,659,660],{"__ignoreMap":627},[631,661,662,664,666,668,670,672],{"class":633,"line":634},[631,663,657],{"class":637},[631,665,641],{"class":640},[631,667,644],{"class":640},[631,669,647],{"class":640},[631,671,650],{"class":640},[631,673,653],{"class":640},[621,675,678],{"className":623,"code":676,"filename":677,"language":626,"meta":627,"style":627},"yarn add evlog @nestjs\u002Fcommon @nestjs\u002Fcore @nestjs\u002Fplatform-express\n","yarn",[548,679,680],{"__ignoreMap":627},[631,681,682,684,686,688,690,692],{"class":633,"line":634},[631,683,677],{"class":637},[631,685,641],{"class":640},[631,687,644],{"class":640},[631,689,647],{"class":640},[631,691,650],{"class":640},[631,693,653],{"class":640},[621,695,698],{"className":623,"code":696,"filename":697,"language":626,"meta":627,"style":627},"npm install evlog @nestjs\u002Fcommon @nestjs\u002Fcore @nestjs\u002Fplatform-express\n","npm",[548,699,700],{"__ignoreMap":627},[631,701,702,704,707,709,711,713],{"class":633,"line":634},[631,703,697],{"class":637},[631,705,706],{"class":640}," install",[631,708,644],{"class":640},[631,710,647],{"class":640},[631,712,650],{"class":640},[631,714,653],{"class":640},[613,716,718],{"id":717},"_2-register-the-module","2. Register the module",[621,720,725],{"className":721,"code":722,"filename":723,"language":724,"meta":627,"style":627},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module } from '@nestjs\u002Fcommon'\nimport { EvlogModule } from 'evlog\u002Fnestjs'\n\n@Module({\n  imports: [\n    EvlogModule.forRoot(),\n  ],\n})\nexport class AppModule {}\n","src\u002Fapp.module.ts","typescript",[548,726,727,756,776,783,799,812,830,838,847],{"__ignoreMap":627},[631,728,729,733,737,741,744,747,750,753],{"class":633,"line":634},[631,730,732],{"class":731},"s7zQu","import",[631,734,736],{"class":735},"sMK4o"," {",[631,738,740],{"class":739},"sTEyZ"," Module",[631,742,743],{"class":735}," }",[631,745,746],{"class":731}," from",[631,748,749],{"class":735}," '",[631,751,752],{"class":640},"@nestjs\u002Fcommon",[631,754,755],{"class":735},"'\n",[631,757,759,761,763,766,768,770,772,774],{"class":633,"line":758},2,[631,760,732],{"class":731},[631,762,736],{"class":735},[631,764,765],{"class":739}," EvlogModule",[631,767,743],{"class":735},[631,769,746],{"class":731},[631,771,749],{"class":735},[631,773,550],{"class":640},[631,775,755],{"class":735},[631,777,779],{"class":633,"line":778},3,[631,780,782],{"emptyLinePlaceholder":781},true,"\n",[631,784,786,789,793,796],{"class":633,"line":785},4,[631,787,788],{"class":735},"@",[631,790,792],{"class":791},"s2Zo4","Module",[631,794,795],{"class":739},"(",[631,797,798],{"class":735},"{\n",[631,800,802,806,809],{"class":633,"line":801},5,[631,803,805],{"class":804},"swJcz","  imports",[631,807,808],{"class":735},":",[631,810,811],{"class":739}," [\n",[631,813,815,818,821,824,827],{"class":633,"line":814},6,[631,816,817],{"class":739},"    EvlogModule",[631,819,820],{"class":735},".",[631,822,823],{"class":791},"forRoot",[631,825,826],{"class":739},"()",[631,828,829],{"class":735},",\n",[631,831,833,836],{"class":633,"line":832},7,[631,834,835],{"class":739},"  ]",[631,837,829],{"class":735},[631,839,841,844],{"class":633,"line":840},8,[631,842,843],{"class":735},"}",[631,845,846],{"class":739},")\n",[631,848,850,853,857,860],{"class":633,"line":849},9,[631,851,852],{"class":731},"export",[631,854,856],{"class":855},"spNyl"," class",[631,858,859],{"class":637}," AppModule",[631,861,862],{"class":735}," {}\n",[613,864,866],{"id":865},"_3-bootstrap-with-evlog","3. Bootstrap with evlog",[621,868,871],{"className":721,"code":869,"filename":870,"language":724,"meta":627,"style":627},"import 'reflect-metadata'\nimport { NestFactory } from '@nestjs\u002Fcore'\nimport { initLogger } from 'evlog'\nimport { AppModule } from '.\u002Fapp.module'\n\ninitLogger({\n  env: { service: 'my-api' },\n})\n\nconst app = await NestFactory.create(AppModule)\nawait app.listen(3000)\n","src\u002Fmain.ts",[548,872,873,884,904,924,943,947,956,981,987,991,1016],{"__ignoreMap":627},[631,874,875,877,879,882],{"class":633,"line":634},[631,876,732],{"class":731},[631,878,749],{"class":735},[631,880,881],{"class":640},"reflect-metadata",[631,883,755],{"class":735},[631,885,886,888,890,893,895,897,899,902],{"class":633,"line":758},[631,887,732],{"class":731},[631,889,736],{"class":735},[631,891,892],{"class":739}," NestFactory",[631,894,743],{"class":735},[631,896,746],{"class":731},[631,898,749],{"class":735},[631,900,901],{"class":640},"@nestjs\u002Fcore",[631,903,755],{"class":735},[631,905,906,908,910,913,915,917,919,922],{"class":633,"line":778},[631,907,732],{"class":731},[631,909,736],{"class":735},[631,911,912],{"class":739}," initLogger",[631,914,743],{"class":735},[631,916,746],{"class":731},[631,918,749],{"class":735},[631,920,921],{"class":640},"evlog",[631,923,755],{"class":735},[631,925,926,928,930,932,934,936,938,941],{"class":633,"line":785},[631,927,732],{"class":731},[631,929,736],{"class":735},[631,931,859],{"class":739},[631,933,743],{"class":735},[631,935,746],{"class":731},[631,937,749],{"class":735},[631,939,940],{"class":640},".\u002Fapp.module",[631,942,755],{"class":735},[631,944,945],{"class":633,"line":801},[631,946,782],{"emptyLinePlaceholder":781},[631,948,949,952,954],{"class":633,"line":814},[631,950,951],{"class":791},"initLogger",[631,953,795],{"class":739},[631,955,798],{"class":735},[631,957,958,961,963,965,968,970,972,975,978],{"class":633,"line":832},[631,959,960],{"class":804},"  env",[631,962,808],{"class":735},[631,964,736],{"class":735},[631,966,967],{"class":804}," service",[631,969,808],{"class":735},[631,971,749],{"class":735},[631,973,974],{"class":640},"my-api",[631,976,977],{"class":735},"'",[631,979,980],{"class":735}," },\n",[631,982,983,985],{"class":633,"line":840},[631,984,843],{"class":735},[631,986,846],{"class":739},[631,988,989],{"class":633,"line":849},[631,990,782],{"emptyLinePlaceholder":781},[631,992,994,997,1000,1003,1006,1008,1010,1013],{"class":633,"line":993},10,[631,995,996],{"class":855},"const",[631,998,999],{"class":739}," app ",[631,1001,1002],{"class":735},"=",[631,1004,1005],{"class":731}," await",[631,1007,892],{"class":739},[631,1009,820],{"class":735},[631,1011,1012],{"class":791},"create",[631,1014,1015],{"class":739},"(AppModule)\n",[631,1017,1019,1022,1025,1027,1030,1032,1036],{"class":633,"line":1018},11,[631,1020,1021],{"class":731},"await",[631,1023,1024],{"class":739}," app",[631,1026,820],{"class":735},[631,1028,1029],{"class":791},"listen",[631,1031,795],{"class":739},[631,1033,1035],{"class":1034},"sbssI","3000",[631,1037,846],{"class":739},[544,1039,1040,1042],{},[548,1041,554],{}," registers as a global module, so the middleware is automatically applied to all routes.",[609,1044,46],{"id":1045},"wide-events",[544,1047,1048],{},"Build up context progressively through your controllers and services. One request = one wide event:",[621,1050,1053],{"className":721,"code":1051,"filename":1052,"language":724,"meta":627,"style":627},"import { Controller, Get, Param } from '@nestjs\u002Fcommon'\nimport { useLogger } from 'evlog\u002Fnestjs'\n\n@Controller('users')\nexport class UsersController {\n  @Get(':id')\n  async findOne(@Param('id') id: string) {\n    const log = useLogger()\n\n    log.set({ user: { id } })\n\n    const user = await db.findUser(id)\n    log.set({ user: { name: user.name, plan: user.plan } })\n\n    const orders = await db.findOrders(id)\n    log.set({ orders: { count: orders.length, totalRevenue: sum(orders) } })\n\n    return { user, orders }\n  }\n}\n","src\u002Fusers.controller.ts",[548,1054,1055,1085,1104,1108,1126,1138,1157,1196,1212,1216,1247,1251,1276,1327,1332,1357,1411,1416,1433,1439],{"__ignoreMap":627},[631,1056,1057,1059,1061,1064,1067,1070,1072,1075,1077,1079,1081,1083],{"class":633,"line":634},[631,1058,732],{"class":731},[631,1060,736],{"class":735},[631,1062,1063],{"class":739}," Controller",[631,1065,1066],{"class":735},",",[631,1068,1069],{"class":739}," Get",[631,1071,1066],{"class":735},[631,1073,1074],{"class":739}," Param",[631,1076,743],{"class":735},[631,1078,746],{"class":731},[631,1080,749],{"class":735},[631,1082,752],{"class":640},[631,1084,755],{"class":735},[631,1086,1087,1089,1091,1094,1096,1098,1100,1102],{"class":633,"line":758},[631,1088,732],{"class":731},[631,1090,736],{"class":735},[631,1092,1093],{"class":739}," useLogger",[631,1095,743],{"class":735},[631,1097,746],{"class":731},[631,1099,749],{"class":735},[631,1101,550],{"class":640},[631,1103,755],{"class":735},[631,1105,1106],{"class":633,"line":778},[631,1107,782],{"emptyLinePlaceholder":781},[631,1109,1110,1112,1115,1117,1119,1122,1124],{"class":633,"line":785},[631,1111,788],{"class":735},[631,1113,1114],{"class":791},"Controller",[631,1116,795],{"class":739},[631,1118,977],{"class":735},[631,1120,1121],{"class":640},"users",[631,1123,977],{"class":735},[631,1125,846],{"class":739},[631,1127,1128,1130,1132,1135],{"class":633,"line":801},[631,1129,852],{"class":731},[631,1131,856],{"class":855},[631,1133,1134],{"class":637}," UsersController",[631,1136,1137],{"class":735}," {\n",[631,1139,1140,1143,1146,1148,1150,1153,1155],{"class":633,"line":814},[631,1141,1142],{"class":735},"  @",[631,1144,1145],{"class":791},"Get",[631,1147,795],{"class":739},[631,1149,977],{"class":735},[631,1151,1152],{"class":640},":id",[631,1154,977],{"class":735},[631,1156,846],{"class":739},[631,1158,1159,1162,1165,1168,1171,1173,1175,1178,1180,1183,1186,1188,1191,1194],{"class":633,"line":832},[631,1160,1161],{"class":855},"  async",[631,1163,1164],{"class":804}," findOne",[631,1166,1167],{"class":735},"(@",[631,1169,1170],{"class":791},"Param",[631,1172,795],{"class":739},[631,1174,977],{"class":735},[631,1176,1177],{"class":640},"id",[631,1179,977],{"class":735},[631,1181,1182],{"class":739},") ",[631,1184,1177],{"class":1185},"sHdIc",[631,1187,808],{"class":735},[631,1189,1190],{"class":637}," string",[631,1192,1193],{"class":735},")",[631,1195,1137],{"class":735},[631,1197,1198,1201,1204,1207,1209],{"class":633,"line":840},[631,1199,1200],{"class":855},"    const",[631,1202,1203],{"class":739}," log",[631,1205,1206],{"class":735}," =",[631,1208,1093],{"class":791},[631,1210,1211],{"class":804},"()\n",[631,1213,1214],{"class":633,"line":849},[631,1215,782],{"emptyLinePlaceholder":781},[631,1217,1218,1221,1223,1226,1228,1231,1234,1236,1238,1241,1243,1245],{"class":633,"line":993},[631,1219,1220],{"class":739},"    log",[631,1222,820],{"class":735},[631,1224,1225],{"class":791},"set",[631,1227,795],{"class":804},[631,1229,1230],{"class":735},"{",[631,1232,1233],{"class":804}," user",[631,1235,808],{"class":735},[631,1237,736],{"class":735},[631,1239,1240],{"class":739}," id",[631,1242,743],{"class":735},[631,1244,743],{"class":735},[631,1246,846],{"class":804},[631,1248,1249],{"class":633,"line":1018},[631,1250,782],{"emptyLinePlaceholder":781},[631,1252,1254,1256,1258,1260,1262,1265,1267,1270,1272,1274],{"class":633,"line":1253},12,[631,1255,1200],{"class":855},[631,1257,1233],{"class":739},[631,1259,1206],{"class":735},[631,1261,1005],{"class":731},[631,1263,1264],{"class":739}," db",[631,1266,820],{"class":735},[631,1268,1269],{"class":791},"findUser",[631,1271,795],{"class":804},[631,1273,1177],{"class":739},[631,1275,846],{"class":804},[631,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1298,1300,1302,1304,1307,1309,1312,1314,1316,1318,1321,1323,1325],{"class":633,"line":1278},13,[631,1280,1220],{"class":739},[631,1282,820],{"class":735},[631,1284,1225],{"class":791},[631,1286,795],{"class":804},[631,1288,1230],{"class":735},[631,1290,1233],{"class":804},[631,1292,808],{"class":735},[631,1294,736],{"class":735},[631,1296,1297],{"class":804}," name",[631,1299,808],{"class":735},[631,1301,1233],{"class":739},[631,1303,820],{"class":735},[631,1305,1306],{"class":739},"name",[631,1308,1066],{"class":735},[631,1310,1311],{"class":804}," plan",[631,1313,808],{"class":735},[631,1315,1233],{"class":739},[631,1317,820],{"class":735},[631,1319,1320],{"class":739},"plan",[631,1322,743],{"class":735},[631,1324,743],{"class":735},[631,1326,846],{"class":804},[631,1328,1330],{"class":633,"line":1329},14,[631,1331,782],{"emptyLinePlaceholder":781},[631,1333,1335,1337,1340,1342,1344,1346,1348,1351,1353,1355],{"class":633,"line":1334},15,[631,1336,1200],{"class":855},[631,1338,1339],{"class":739}," orders",[631,1341,1206],{"class":735},[631,1343,1005],{"class":731},[631,1345,1264],{"class":739},[631,1347,820],{"class":735},[631,1349,1350],{"class":791},"findOrders",[631,1352,795],{"class":804},[631,1354,1177],{"class":739},[631,1356,846],{"class":804},[631,1358,1360,1362,1364,1366,1368,1370,1372,1374,1376,1379,1381,1383,1385,1388,1390,1393,1395,1398,1400,1403,1405,1407,1409],{"class":633,"line":1359},16,[631,1361,1220],{"class":739},[631,1363,820],{"class":735},[631,1365,1225],{"class":791},[631,1367,795],{"class":804},[631,1369,1230],{"class":735},[631,1371,1339],{"class":804},[631,1373,808],{"class":735},[631,1375,736],{"class":735},[631,1377,1378],{"class":804}," count",[631,1380,808],{"class":735},[631,1382,1339],{"class":739},[631,1384,820],{"class":735},[631,1386,1387],{"class":739},"length",[631,1389,1066],{"class":735},[631,1391,1392],{"class":804}," totalRevenue",[631,1394,808],{"class":735},[631,1396,1397],{"class":791}," sum",[631,1399,795],{"class":804},[631,1401,1402],{"class":739},"orders",[631,1404,1182],{"class":804},[631,1406,843],{"class":735},[631,1408,743],{"class":735},[631,1410,846],{"class":804},[631,1412,1414],{"class":633,"line":1413},17,[631,1415,782],{"emptyLinePlaceholder":781},[631,1417,1419,1422,1424,1426,1428,1430],{"class":633,"line":1418},18,[631,1420,1421],{"class":731},"    return",[631,1423,736],{"class":735},[631,1425,1233],{"class":739},[631,1427,1066],{"class":735},[631,1429,1339],{"class":739},[631,1431,1432],{"class":735}," }\n",[631,1434,1436],{"class":633,"line":1435},19,[631,1437,1438],{"class":735},"  }\n",[631,1440,1442],{"class":633,"line":1441},20,[631,1443,1444],{"class":735},"}\n",[544,1446,1447],{},"All fields are merged into a single wide event emitted when the request completes:",[621,1449,1452],{"className":623,"code":1450,"filename":1451,"language":626,"meta":627,"style":627},"14:58:15 INFO [my-api] GET \u002Fusers\u002Fusr_123 200 in 12ms\n  ├─ orders: count=2 totalRevenue=6298\n  ├─ user: id=usr_123 name=Alice plan=pro\n  └─ requestId: 4a8ff3a8-...\n","Terminal output",[548,1453,1454,1465,1485,1501],{"__ignoreMap":627},[631,1455,1456,1459,1462],{"class":633,"line":634},[631,1457,1458],{"class":637},"14:58:15",[631,1460,1461],{"class":640}," INFO",[631,1463,1464],{"class":739}," [my-api] GET \u002Fusers\u002Fusr_123 200 in 12ms\n",[631,1466,1467,1470,1473,1476,1479,1482],{"class":633,"line":758},[631,1468,1469],{"class":637},"  ├─",[631,1471,1472],{"class":640}," orders:",[631,1474,1475],{"class":640}," count=",[631,1477,1478],{"class":1034},"2",[631,1480,1481],{"class":640}," totalRevenue=",[631,1483,1484],{"class":1034},"6298\n",[631,1486,1487,1489,1492,1495,1498],{"class":633,"line":778},[631,1488,1469],{"class":637},[631,1490,1491],{"class":640}," user:",[631,1493,1494],{"class":640}," id=usr_123",[631,1496,1497],{"class":640}," name=Alice",[631,1499,1500],{"class":640}," plan=pro\n",[631,1502,1503,1506,1509],{"class":633,"line":785},[631,1504,1505],{"class":637},"  └─",[631,1507,1508],{"class":640}," requestId:",[631,1510,1511],{"class":640}," 4a8ff3a8-...\n",[609,1513,558],{"id":1514},"uselogger",[544,1516,1517,1518,1520],{},"Use ",[548,1519,558],{}," to access the request-scoped logger from anywhere in the call stack without injecting the request object through your service layer:",[621,1522,1525],{"className":721,"code":1523,"filename":1524,"language":724,"meta":627,"style":627},"import { useLogger } from 'evlog\u002Fnestjs'\n\nexport class UsersService {\n  async findUser(id: string) {\n    const log = useLogger()\n    log.set({ user: { id } })\n\n    const user = await db.findUser(id)\n    log.set({ user: { name: user.name, plan: user.plan } })\n\n    return user\n  }\n}\n","src\u002Fusers.service.ts",[548,1526,1527,1545,1549,1560,1579,1591,1617,1621,1643,1689,1693,1700,1704],{"__ignoreMap":627},[631,1528,1529,1531,1533,1535,1537,1539,1541,1543],{"class":633,"line":634},[631,1530,732],{"class":731},[631,1532,736],{"class":735},[631,1534,1093],{"class":739},[631,1536,743],{"class":735},[631,1538,746],{"class":731},[631,1540,749],{"class":735},[631,1542,550],{"class":640},[631,1544,755],{"class":735},[631,1546,1547],{"class":633,"line":758},[631,1548,782],{"emptyLinePlaceholder":781},[631,1550,1551,1553,1555,1558],{"class":633,"line":778},[631,1552,852],{"class":731},[631,1554,856],{"class":855},[631,1556,1557],{"class":637}," UsersService",[631,1559,1137],{"class":735},[631,1561,1562,1564,1567,1569,1571,1573,1575,1577],{"class":633,"line":785},[631,1563,1161],{"class":855},[631,1565,1566],{"class":804}," findUser",[631,1568,795],{"class":735},[631,1570,1177],{"class":1185},[631,1572,808],{"class":735},[631,1574,1190],{"class":637},[631,1576,1193],{"class":735},[631,1578,1137],{"class":735},[631,1580,1581,1583,1585,1587,1589],{"class":633,"line":801},[631,1582,1200],{"class":855},[631,1584,1203],{"class":739},[631,1586,1206],{"class":735},[631,1588,1093],{"class":791},[631,1590,1211],{"class":804},[631,1592,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615],{"class":633,"line":814},[631,1594,1220],{"class":739},[631,1596,820],{"class":735},[631,1598,1225],{"class":791},[631,1600,795],{"class":804},[631,1602,1230],{"class":735},[631,1604,1233],{"class":804},[631,1606,808],{"class":735},[631,1608,736],{"class":735},[631,1610,1240],{"class":739},[631,1612,743],{"class":735},[631,1614,743],{"class":735},[631,1616,846],{"class":804},[631,1618,1619],{"class":633,"line":832},[631,1620,782],{"emptyLinePlaceholder":781},[631,1622,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641],{"class":633,"line":840},[631,1624,1200],{"class":855},[631,1626,1233],{"class":739},[631,1628,1206],{"class":735},[631,1630,1005],{"class":731},[631,1632,1264],{"class":739},[631,1634,820],{"class":735},[631,1636,1269],{"class":791},[631,1638,795],{"class":804},[631,1640,1177],{"class":739},[631,1642,846],{"class":804},[631,1644,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687],{"class":633,"line":849},[631,1646,1220],{"class":739},[631,1648,820],{"class":735},[631,1650,1225],{"class":791},[631,1652,795],{"class":804},[631,1654,1230],{"class":735},[631,1656,1233],{"class":804},[631,1658,808],{"class":735},[631,1660,736],{"class":735},[631,1662,1297],{"class":804},[631,1664,808],{"class":735},[631,1666,1233],{"class":739},[631,1668,820],{"class":735},[631,1670,1306],{"class":739},[631,1672,1066],{"class":735},[631,1674,1311],{"class":804},[631,1676,808],{"class":735},[631,1678,1233],{"class":739},[631,1680,820],{"class":735},[631,1682,1320],{"class":739},[631,1684,743],{"class":735},[631,1686,743],{"class":735},[631,1688,846],{"class":804},[631,1690,1691],{"class":633,"line":993},[631,1692,782],{"emptyLinePlaceholder":781},[631,1694,1695,1697],{"class":633,"line":1018},[631,1696,1421],{"class":731},[631,1698,1699],{"class":739}," user\n",[631,1701,1702],{"class":633,"line":1253},[631,1703,1438],{"class":735},[631,1705,1706],{"class":633,"line":1278},[631,1707,1444],{"class":735},[621,1709,1711],{"className":721,"code":1710,"filename":1052,"language":724,"meta":627,"style":627},"@Controller('users')\nexport class UsersController {\n  @Get(':id')\n  findOne(@Param('id') id: string) {\n    return this.usersService.findUser(id)\n  }\n}\n",[548,1712,1713,1729,1739,1755,1784,1804,1808],{"__ignoreMap":627},[631,1714,1715,1717,1719,1721,1723,1725,1727],{"class":633,"line":634},[631,1716,788],{"class":735},[631,1718,1114],{"class":791},[631,1720,795],{"class":739},[631,1722,977],{"class":735},[631,1724,1121],{"class":640},[631,1726,977],{"class":735},[631,1728,846],{"class":739},[631,1730,1731,1733,1735,1737],{"class":633,"line":758},[631,1732,852],{"class":731},[631,1734,856],{"class":855},[631,1736,1134],{"class":637},[631,1738,1137],{"class":735},[631,1740,1741,1743,1745,1747,1749,1751,1753],{"class":633,"line":778},[631,1742,1142],{"class":735},[631,1744,1145],{"class":791},[631,1746,795],{"class":739},[631,1748,977],{"class":735},[631,1750,1152],{"class":640},[631,1752,977],{"class":735},[631,1754,846],{"class":739},[631,1756,1757,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1782],{"class":633,"line":785},[631,1758,1759],{"class":804},"  findOne",[631,1761,1167],{"class":735},[631,1763,1170],{"class":791},[631,1765,795],{"class":739},[631,1767,977],{"class":735},[631,1769,1177],{"class":640},[631,1771,977],{"class":735},[631,1773,1182],{"class":739},[631,1775,1177],{"class":1185},[631,1777,808],{"class":735},[631,1779,1190],{"class":637},[631,1781,1193],{"class":735},[631,1783,1137],{"class":735},[631,1785,1786,1788,1791,1794,1796,1798,1800,1802],{"class":633,"line":801},[631,1787,1421],{"class":731},[631,1789,1790],{"class":735}," this.",[631,1792,1793],{"class":739},"usersService",[631,1795,820],{"class":735},[631,1797,1269],{"class":791},[631,1799,795],{"class":804},[631,1801,1177],{"class":739},[631,1803,846],{"class":804},[631,1805,1806],{"class":633,"line":814},[631,1807,1438],{"class":735},[631,1809,1810],{"class":633,"line":832},[631,1811,1444],{"class":735},[544,1813,1814,1815,1817,1818,1820,1821,1823,1824,1827],{},"Both ",[548,1816,562],{}," and ",[548,1819,558],{}," return the same logger instance. ",[548,1822,558],{}," uses ",[548,1825,1826],{},"AsyncLocalStorage"," to propagate the logger across async boundaries.",[609,1829,1831,1832,1193],{"id":1830},"background-work-logfork","Background work (",[548,1833,1834],{},"log.fork",[544,1836,1517,1837,1840,1841,1843,1844,1848],{},[548,1838,1839],{},"req.log.fork(label, fn)"," (or the logger from ",[548,1842,558],{}," in the same request) for child wide events. See ",[598,1845,1847],{"href":1846},"\u002Flearn\u002Fwide-events#after-emit-sealing-and-background-work","After emit"," in Wide events.",[621,1850,1853],{"className":721,"code":1851,"filename":1852,"language":724,"meta":627,"style":627},"import { useLogger } from 'evlog\u002Fnestjs'\n\n@Post()\ncreate(@Req() req: Express.Request) {\n  req.log.fork!('enqueue', async () => {\n    const log = useLogger()\n    log.set({ queued: true })\n  })\n  return { ok: true }\n}\n","src\u002Forders.controller.ts",[548,1854,1855,1873,1877,1886,1905,1945,1957,1982,1989,2005],{"__ignoreMap":627},[631,1856,1857,1859,1861,1863,1865,1867,1869,1871],{"class":633,"line":634},[631,1858,732],{"class":731},[631,1860,736],{"class":735},[631,1862,1093],{"class":739},[631,1864,743],{"class":735},[631,1866,746],{"class":731},[631,1868,749],{"class":735},[631,1870,550],{"class":640},[631,1872,755],{"class":735},[631,1874,1875],{"class":633,"line":758},[631,1876,782],{"emptyLinePlaceholder":781},[631,1878,1879,1881,1884],{"class":633,"line":778},[631,1880,788],{"class":735},[631,1882,1883],{"class":791},"Post",[631,1885,1211],{"class":739},[631,1887,1888,1890,1892,1895,1898,1900,1903],{"class":633,"line":785},[631,1889,1012],{"class":791},[631,1891,1167],{"class":739},[631,1893,1894],{"class":791},"Req",[631,1896,1897],{"class":739},"() req: Express",[631,1899,820],{"class":735},[631,1901,1902],{"class":739},"Request) ",[631,1904,798],{"class":735},[631,1906,1907,1910,1912,1915,1917,1920,1923,1925,1927,1930,1932,1934,1937,1940,1943],{"class":633,"line":801},[631,1908,1909],{"class":739},"  req",[631,1911,820],{"class":735},[631,1913,1914],{"class":739},"log",[631,1916,820],{"class":735},[631,1918,1919],{"class":791},"fork",[631,1921,1922],{"class":735},"!",[631,1924,795],{"class":804},[631,1926,977],{"class":735},[631,1928,1929],{"class":640},"enqueue",[631,1931,977],{"class":735},[631,1933,1066],{"class":735},[631,1935,1936],{"class":855}," async",[631,1938,1939],{"class":735}," ()",[631,1941,1942],{"class":855}," =>",[631,1944,1137],{"class":735},[631,1946,1947,1949,1951,1953,1955],{"class":633,"line":814},[631,1948,1200],{"class":855},[631,1950,1203],{"class":739},[631,1952,1206],{"class":735},[631,1954,1093],{"class":791},[631,1956,1211],{"class":804},[631,1958,1959,1961,1963,1965,1967,1969,1972,1974,1978,1980],{"class":633,"line":832},[631,1960,1220],{"class":739},[631,1962,820],{"class":735},[631,1964,1225],{"class":791},[631,1966,795],{"class":804},[631,1968,1230],{"class":735},[631,1970,1971],{"class":804}," queued",[631,1973,808],{"class":735},[631,1975,1977],{"class":1976},"sfNiH"," true",[631,1979,743],{"class":735},[631,1981,846],{"class":804},[631,1983,1984,1987],{"class":633,"line":840},[631,1985,1986],{"class":735},"  }",[631,1988,846],{"class":804},[631,1990,1991,1994,1996,1999,2001,2003],{"class":633,"line":849},[631,1992,1993],{"class":731},"  return",[631,1995,736],{"class":735},[631,1997,1998],{"class":804}," ok",[631,2000,808],{"class":735},[631,2002,1977],{"class":1976},[631,2004,1432],{"class":735},[631,2006,2007],{"class":633,"line":993},[631,2008,1444],{"class":735},[609,2010,2012],{"id":2011},"error-handling","Error Handling",[544,2014,1517,2015,2018,2019,2022,2023,2026,2027,2030],{},[548,2016,2017],{},"createError"," for structured errors with ",[548,2020,2021],{},"why",", ",[548,2024,2025],{},"fix",", and ",[548,2028,2029],{},"link"," fields. Create a NestJS exception filter to log and format errors:",[621,2032,2035],{"className":721,"code":2033,"filename":2034,"language":724,"meta":627,"style":627},"import { Catch } from '@nestjs\u002Fcommon'\nimport type { ExceptionFilter, ArgumentsHost } from '@nestjs\u002Fcommon'\nimport { parseError } from 'evlog'\nimport { useLogger } from 'evlog\u002Fnestjs'\n\n@Catch()\nexport class EvlogExceptionFilter implements ExceptionFilter {\n  catch(exception: unknown, host: ArgumentsHost) {\n    const response = host.switchToHttp().getResponse()\n    const error = exception instanceof Error ? exception : new Error(String(exception))\n\n    try {\n      useLogger().error(error)\n    } catch {\n      \u002F\u002F Outside an evlog request scope — log is unavailable\n    }\n\n    const parsed = parseError(error)\n    response.status(parsed.status).json({\n      message: parsed.message,\n      why: parsed.why,\n      fix: parsed.fix,\n      link: parsed.link,\n    })\n  }\n}\n","src\u002Fevlog-exception.filter.ts",[548,2036,2037,2056,2083,2102,2120,2124,2133,2149,2177,2202,2245,2249,2256,2274,2284,2290,2295,2299,2316,2346,2362,2378,2394,2410,2417,2422],{"__ignoreMap":627},[631,2038,2039,2041,2043,2046,2048,2050,2052,2054],{"class":633,"line":634},[631,2040,732],{"class":731},[631,2042,736],{"class":735},[631,2044,2045],{"class":739}," Catch",[631,2047,743],{"class":735},[631,2049,746],{"class":731},[631,2051,749],{"class":735},[631,2053,752],{"class":640},[631,2055,755],{"class":735},[631,2057,2058,2060,2063,2065,2068,2070,2073,2075,2077,2079,2081],{"class":633,"line":758},[631,2059,732],{"class":731},[631,2061,2062],{"class":731}," type",[631,2064,736],{"class":735},[631,2066,2067],{"class":739}," ExceptionFilter",[631,2069,1066],{"class":735},[631,2071,2072],{"class":739}," ArgumentsHost",[631,2074,743],{"class":735},[631,2076,746],{"class":731},[631,2078,749],{"class":735},[631,2080,752],{"class":640},[631,2082,755],{"class":735},[631,2084,2085,2087,2089,2092,2094,2096,2098,2100],{"class":633,"line":778},[631,2086,732],{"class":731},[631,2088,736],{"class":735},[631,2090,2091],{"class":739}," parseError",[631,2093,743],{"class":735},[631,2095,746],{"class":731},[631,2097,749],{"class":735},[631,2099,921],{"class":640},[631,2101,755],{"class":735},[631,2103,2104,2106,2108,2110,2112,2114,2116,2118],{"class":633,"line":785},[631,2105,732],{"class":731},[631,2107,736],{"class":735},[631,2109,1093],{"class":739},[631,2111,743],{"class":735},[631,2113,746],{"class":731},[631,2115,749],{"class":735},[631,2117,550],{"class":640},[631,2119,755],{"class":735},[631,2121,2122],{"class":633,"line":801},[631,2123,782],{"emptyLinePlaceholder":781},[631,2125,2126,2128,2131],{"class":633,"line":814},[631,2127,788],{"class":735},[631,2129,2130],{"class":791},"Catch",[631,2132,1211],{"class":739},[631,2134,2135,2137,2139,2142,2145,2147],{"class":633,"line":832},[631,2136,852],{"class":731},[631,2138,856],{"class":855},[631,2140,2141],{"class":637}," EvlogExceptionFilter",[631,2143,2144],{"class":855}," implements",[631,2146,2067],{"class":637},[631,2148,1137],{"class":735},[631,2150,2151,2154,2156,2159,2161,2164,2166,2169,2171,2173,2175],{"class":633,"line":840},[631,2152,2153],{"class":804},"  catch",[631,2155,795],{"class":735},[631,2157,2158],{"class":1185},"exception",[631,2160,808],{"class":735},[631,2162,2163],{"class":637}," unknown",[631,2165,1066],{"class":735},[631,2167,2168],{"class":1185}," host",[631,2170,808],{"class":735},[631,2172,2072],{"class":637},[631,2174,1193],{"class":735},[631,2176,1137],{"class":735},[631,2178,2179,2181,2184,2186,2188,2190,2193,2195,2197,2200],{"class":633,"line":849},[631,2180,1200],{"class":855},[631,2182,2183],{"class":739}," response",[631,2185,1206],{"class":735},[631,2187,2168],{"class":739},[631,2189,820],{"class":735},[631,2191,2192],{"class":791},"switchToHttp",[631,2194,826],{"class":804},[631,2196,820],{"class":735},[631,2198,2199],{"class":791},"getResponse",[631,2201,1211],{"class":804},[631,2203,2204,2206,2209,2211,2214,2217,2220,2223,2225,2228,2231,2233,2235,2238,2240,2242],{"class":633,"line":993},[631,2205,1200],{"class":855},[631,2207,2208],{"class":739}," error",[631,2210,1206],{"class":735},[631,2212,2213],{"class":739}," exception",[631,2215,2216],{"class":735}," instanceof",[631,2218,2219],{"class":637}," Error",[631,2221,2222],{"class":735}," ?",[631,2224,2213],{"class":739},[631,2226,2227],{"class":735}," :",[631,2229,2230],{"class":735}," new",[631,2232,2219],{"class":791},[631,2234,795],{"class":804},[631,2236,2237],{"class":791},"String",[631,2239,795],{"class":804},[631,2241,2158],{"class":739},[631,2243,2244],{"class":804},"))\n",[631,2246,2247],{"class":633,"line":1018},[631,2248,782],{"emptyLinePlaceholder":781},[631,2250,2251,2254],{"class":633,"line":1253},[631,2252,2253],{"class":731},"    try",[631,2255,1137],{"class":735},[631,2257,2258,2261,2263,2265,2268,2270,2272],{"class":633,"line":1278},[631,2259,2260],{"class":791},"      useLogger",[631,2262,826],{"class":804},[631,2264,820],{"class":735},[631,2266,2267],{"class":791},"error",[631,2269,795],{"class":804},[631,2271,2267],{"class":739},[631,2273,846],{"class":804},[631,2275,2276,2279,2282],{"class":633,"line":1329},[631,2277,2278],{"class":735},"    }",[631,2280,2281],{"class":731}," catch",[631,2283,1137],{"class":735},[631,2285,2286],{"class":633,"line":1334},[631,2287,2289],{"class":2288},"sHwdD","      \u002F\u002F Outside an evlog request scope — log is unavailable\n",[631,2291,2292],{"class":633,"line":1359},[631,2293,2294],{"class":735},"    }\n",[631,2296,2297],{"class":633,"line":1413},[631,2298,782],{"emptyLinePlaceholder":781},[631,2300,2301,2303,2306,2308,2310,2312,2314],{"class":633,"line":1418},[631,2302,1200],{"class":855},[631,2304,2305],{"class":739}," parsed",[631,2307,1206],{"class":735},[631,2309,2091],{"class":791},[631,2311,795],{"class":804},[631,2313,2267],{"class":739},[631,2315,846],{"class":804},[631,2317,2318,2321,2323,2326,2328,2331,2333,2335,2337,2339,2342,2344],{"class":633,"line":1435},[631,2319,2320],{"class":739},"    response",[631,2322,820],{"class":735},[631,2324,2325],{"class":791},"status",[631,2327,795],{"class":804},[631,2329,2330],{"class":739},"parsed",[631,2332,820],{"class":735},[631,2334,2325],{"class":739},[631,2336,1193],{"class":804},[631,2338,820],{"class":735},[631,2340,2341],{"class":791},"json",[631,2343,795],{"class":804},[631,2345,798],{"class":735},[631,2347,2348,2351,2353,2355,2357,2360],{"class":633,"line":1441},[631,2349,2350],{"class":804},"      message",[631,2352,808],{"class":735},[631,2354,2305],{"class":739},[631,2356,820],{"class":735},[631,2358,2359],{"class":739},"message",[631,2361,829],{"class":735},[631,2363,2365,2368,2370,2372,2374,2376],{"class":633,"line":2364},21,[631,2366,2367],{"class":804},"      why",[631,2369,808],{"class":735},[631,2371,2305],{"class":739},[631,2373,820],{"class":735},[631,2375,2021],{"class":739},[631,2377,829],{"class":735},[631,2379,2381,2384,2386,2388,2390,2392],{"class":633,"line":2380},22,[631,2382,2383],{"class":804},"      fix",[631,2385,808],{"class":735},[631,2387,2305],{"class":739},[631,2389,820],{"class":735},[631,2391,2025],{"class":739},[631,2393,829],{"class":735},[631,2395,2397,2400,2402,2404,2406,2408],{"class":633,"line":2396},23,[631,2398,2399],{"class":804},"      link",[631,2401,808],{"class":735},[631,2403,2305],{"class":739},[631,2405,820],{"class":735},[631,2407,2029],{"class":739},[631,2409,829],{"class":735},[631,2411,2413,2415],{"class":633,"line":2412},24,[631,2414,2278],{"class":735},[631,2416,846],{"class":804},[631,2418,2420],{"class":633,"line":2419},25,[631,2421,1438],{"class":735},[631,2423,2425],{"class":633,"line":2424},26,[631,2426,1444],{"class":735},[544,2428,2429],{},"Apply it to your controllers:",[621,2431,2434],{"className":721,"code":2432,"filename":2433,"language":724,"meta":627,"style":627},"import { Controller, Get, UseFilters } from '@nestjs\u002Fcommon'\nimport { createError } from 'evlog'\nimport { EvlogExceptionFilter } from '.\u002Fevlog-exception.filter'\n\n@Controller()\n@UseFilters(new EvlogExceptionFilter())\nexport class CheckoutController {\n  @Get('checkout')\n  checkout() {\n    throw createError({\n      message: 'Payment failed',\n      status: 402,\n      why: 'Card declined by issuer',\n      fix: 'Try a different payment method',\n      link: 'https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined',\n    })\n  }\n}\n","src\u002Fcheckout.controller.ts",[548,2435,2436,2463,2482,2501,2505,2513,2530,2541,2558,2567,2578,2593,2605,2620,2635,2650,2656,2660],{"__ignoreMap":627},[631,2437,2438,2440,2442,2444,2446,2448,2450,2453,2455,2457,2459,2461],{"class":633,"line":634},[631,2439,732],{"class":731},[631,2441,736],{"class":735},[631,2443,1063],{"class":739},[631,2445,1066],{"class":735},[631,2447,1069],{"class":739},[631,2449,1066],{"class":735},[631,2451,2452],{"class":739}," UseFilters",[631,2454,743],{"class":735},[631,2456,746],{"class":731},[631,2458,749],{"class":735},[631,2460,752],{"class":640},[631,2462,755],{"class":735},[631,2464,2465,2467,2469,2472,2474,2476,2478,2480],{"class":633,"line":758},[631,2466,732],{"class":731},[631,2468,736],{"class":735},[631,2470,2471],{"class":739}," createError",[631,2473,743],{"class":735},[631,2475,746],{"class":731},[631,2477,749],{"class":735},[631,2479,921],{"class":640},[631,2481,755],{"class":735},[631,2483,2484,2486,2488,2490,2492,2494,2496,2499],{"class":633,"line":778},[631,2485,732],{"class":731},[631,2487,736],{"class":735},[631,2489,2141],{"class":739},[631,2491,743],{"class":735},[631,2493,746],{"class":731},[631,2495,749],{"class":735},[631,2497,2498],{"class":640},".\u002Fevlog-exception.filter",[631,2500,755],{"class":735},[631,2502,2503],{"class":633,"line":785},[631,2504,782],{"emptyLinePlaceholder":781},[631,2506,2507,2509,2511],{"class":633,"line":801},[631,2508,788],{"class":735},[631,2510,1114],{"class":791},[631,2512,1211],{"class":739},[631,2514,2515,2517,2520,2522,2525,2527],{"class":633,"line":814},[631,2516,788],{"class":735},[631,2518,2519],{"class":791},"UseFilters",[631,2521,795],{"class":739},[631,2523,2524],{"class":735},"new",[631,2526,2141],{"class":791},[631,2528,2529],{"class":739},"())\n",[631,2531,2532,2534,2536,2539],{"class":633,"line":832},[631,2533,852],{"class":731},[631,2535,856],{"class":855},[631,2537,2538],{"class":637}," CheckoutController",[631,2540,1137],{"class":735},[631,2542,2543,2545,2547,2549,2551,2554,2556],{"class":633,"line":840},[631,2544,1142],{"class":735},[631,2546,1145],{"class":791},[631,2548,795],{"class":739},[631,2550,977],{"class":735},[631,2552,2553],{"class":640},"checkout",[631,2555,977],{"class":735},[631,2557,846],{"class":739},[631,2559,2560,2563,2565],{"class":633,"line":849},[631,2561,2562],{"class":804},"  checkout",[631,2564,826],{"class":735},[631,2566,1137],{"class":735},[631,2568,2569,2572,2574,2576],{"class":633,"line":993},[631,2570,2571],{"class":731},"    throw",[631,2573,2471],{"class":791},[631,2575,795],{"class":804},[631,2577,798],{"class":735},[631,2579,2580,2582,2584,2586,2589,2591],{"class":633,"line":1018},[631,2581,2350],{"class":804},[631,2583,808],{"class":735},[631,2585,749],{"class":735},[631,2587,2588],{"class":640},"Payment failed",[631,2590,977],{"class":735},[631,2592,829],{"class":735},[631,2594,2595,2598,2600,2603],{"class":633,"line":1253},[631,2596,2597],{"class":804},"      status",[631,2599,808],{"class":735},[631,2601,2602],{"class":1034}," 402",[631,2604,829],{"class":735},[631,2606,2607,2609,2611,2613,2616,2618],{"class":633,"line":1278},[631,2608,2367],{"class":804},[631,2610,808],{"class":735},[631,2612,749],{"class":735},[631,2614,2615],{"class":640},"Card declined by issuer",[631,2617,977],{"class":735},[631,2619,829],{"class":735},[631,2621,2622,2624,2626,2628,2631,2633],{"class":633,"line":1329},[631,2623,2383],{"class":804},[631,2625,808],{"class":735},[631,2627,749],{"class":735},[631,2629,2630],{"class":640},"Try a different payment method",[631,2632,977],{"class":735},[631,2634,829],{"class":735},[631,2636,2637,2639,2641,2643,2646,2648],{"class":633,"line":1334},[631,2638,2399],{"class":804},[631,2640,808],{"class":735},[631,2642,749],{"class":735},[631,2644,2645],{"class":640},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[631,2647,977],{"class":735},[631,2649,829],{"class":735},[631,2651,2652,2654],{"class":633,"line":1359},[631,2653,2278],{"class":735},[631,2655,846],{"class":804},[631,2657,2658],{"class":633,"line":1413},[631,2659,1438],{"class":735},[631,2661,2662],{"class":633,"line":1418},[631,2663,1444],{"class":735},[544,2665,2666],{},"The error is captured and logged with both the custom context and structured error fields:",[621,2668,2670],{"className":623,"code":2669,"filename":1451,"language":626,"meta":627,"style":627},"14:58:20 ERROR [my-api] GET \u002Fcheckout 402 in 3ms\n  ├─ error: name=EvlogError message=Payment failed status=402\n  └─ requestId: 880a50ac-...\n",[548,2671,2672,2683,2705],{"__ignoreMap":627},[631,2673,2674,2677,2680],{"class":633,"line":634},[631,2675,2676],{"class":637},"14:58:20",[631,2678,2679],{"class":640}," ERROR",[631,2681,2682],{"class":739}," [my-api] GET \u002Fcheckout 402 in 3ms\n",[631,2684,2685,2687,2690,2693,2696,2699,2702],{"class":633,"line":758},[631,2686,1469],{"class":637},[631,2688,2689],{"class":640}," error:",[631,2691,2692],{"class":640}," name=EvlogError",[631,2694,2695],{"class":640}," message=Payment",[631,2697,2698],{"class":640}," failed",[631,2700,2701],{"class":640}," status=",[631,2703,2704],{"class":1034},"402\n",[631,2706,2707,2709,2711],{"class":633,"line":778},[631,2708,1505],{"class":637},[631,2710,1508],{"class":640},[631,2712,2713],{"class":640}," 880a50ac-...\n",[609,2715,508],{"id":2716},"configuration",[544,2718,2719,2720,2723,2724,2726],{},"See the ",[598,2721,2722],{"href":509},"Configuration reference"," for all available options (",[548,2725,951],{},", middleware options, sampling, silent mode, etc.).",[609,2728,2730],{"id":2729},"drain-enrichers","Drain & Enrichers",[544,2732,2733,2734,808],{},"Configure drain adapters and enrichers in ",[548,2735,554],{},[621,2737,2739],{"className":721,"code":2738,"filename":723,"language":724,"meta":627,"style":627},"import { Module } from '@nestjs\u002Fcommon'\nimport { EvlogModule } from 'evlog\u002Fnestjs'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createUserAgentEnricher } from 'evlog\u002Fenrichers'\n\nconst userAgent = createUserAgentEnricher()\n\n@Module({\n  imports: [\n    EvlogModule.forRoot({\n      drain: createAxiomDrain(),\n      enrich: (ctx) => {\n        userAgent(ctx)\n        ctx.event.region = process.env.FLY_REGION\n      },\n    }),\n  ],\n})\nexport class AppModule {}\n",[548,2740,2741,2759,2777,2797,2817,2821,2834,2838,2848,2856,2868,2881,2900,2911,2941,2946,2954,2960,2966],{"__ignoreMap":627},[631,2742,2743,2745,2747,2749,2751,2753,2755,2757],{"class":633,"line":634},[631,2744,732],{"class":731},[631,2746,736],{"class":735},[631,2748,740],{"class":739},[631,2750,743],{"class":735},[631,2752,746],{"class":731},[631,2754,749],{"class":735},[631,2756,752],{"class":640},[631,2758,755],{"class":735},[631,2760,2761,2763,2765,2767,2769,2771,2773,2775],{"class":633,"line":758},[631,2762,732],{"class":731},[631,2764,736],{"class":735},[631,2766,765],{"class":739},[631,2768,743],{"class":735},[631,2770,746],{"class":731},[631,2772,749],{"class":735},[631,2774,550],{"class":640},[631,2776,755],{"class":735},[631,2778,2779,2781,2783,2786,2788,2790,2792,2795],{"class":633,"line":778},[631,2780,732],{"class":731},[631,2782,736],{"class":735},[631,2784,2785],{"class":739}," createAxiomDrain",[631,2787,743],{"class":735},[631,2789,746],{"class":731},[631,2791,749],{"class":735},[631,2793,2794],{"class":640},"evlog\u002Faxiom",[631,2796,755],{"class":735},[631,2798,2799,2801,2803,2806,2808,2810,2812,2815],{"class":633,"line":785},[631,2800,732],{"class":731},[631,2802,736],{"class":735},[631,2804,2805],{"class":739}," createUserAgentEnricher",[631,2807,743],{"class":735},[631,2809,746],{"class":731},[631,2811,749],{"class":735},[631,2813,2814],{"class":640},"evlog\u002Fenrichers",[631,2816,755],{"class":735},[631,2818,2819],{"class":633,"line":801},[631,2820,782],{"emptyLinePlaceholder":781},[631,2822,2823,2825,2828,2830,2832],{"class":633,"line":814},[631,2824,996],{"class":855},[631,2826,2827],{"class":739}," userAgent ",[631,2829,1002],{"class":735},[631,2831,2805],{"class":791},[631,2833,1211],{"class":739},[631,2835,2836],{"class":633,"line":832},[631,2837,782],{"emptyLinePlaceholder":781},[631,2839,2840,2842,2844,2846],{"class":633,"line":840},[631,2841,788],{"class":735},[631,2843,792],{"class":791},[631,2845,795],{"class":739},[631,2847,798],{"class":735},[631,2849,2850,2852,2854],{"class":633,"line":849},[631,2851,805],{"class":804},[631,2853,808],{"class":735},[631,2855,811],{"class":739},[631,2857,2858,2860,2862,2864,2866],{"class":633,"line":993},[631,2859,817],{"class":739},[631,2861,820],{"class":735},[631,2863,823],{"class":791},[631,2865,795],{"class":739},[631,2867,798],{"class":735},[631,2869,2870,2873,2875,2877,2879],{"class":633,"line":1018},[631,2871,2872],{"class":804},"      drain",[631,2874,808],{"class":735},[631,2876,2785],{"class":791},[631,2878,826],{"class":739},[631,2880,829],{"class":735},[631,2882,2883,2886,2888,2891,2894,2896,2898],{"class":633,"line":1253},[631,2884,2885],{"class":791},"      enrich",[631,2887,808],{"class":735},[631,2889,2890],{"class":735}," (",[631,2892,2893],{"class":1185},"ctx",[631,2895,1193],{"class":735},[631,2897,1942],{"class":855},[631,2899,1137],{"class":735},[631,2901,2902,2905,2907,2909],{"class":633,"line":1278},[631,2903,2904],{"class":791},"        userAgent",[631,2906,795],{"class":804},[631,2908,2893],{"class":739},[631,2910,846],{"class":804},[631,2912,2913,2916,2918,2921,2923,2926,2928,2931,2933,2936,2938],{"class":633,"line":1329},[631,2914,2915],{"class":739},"        ctx",[631,2917,820],{"class":735},[631,2919,2920],{"class":739},"event",[631,2922,820],{"class":735},[631,2924,2925],{"class":739},"region",[631,2927,1206],{"class":735},[631,2929,2930],{"class":739}," process",[631,2932,820],{"class":735},[631,2934,2935],{"class":739},"env",[631,2937,820],{"class":735},[631,2939,2940],{"class":739},"FLY_REGION\n",[631,2942,2943],{"class":633,"line":1334},[631,2944,2945],{"class":735},"      },\n",[631,2947,2948,2950,2952],{"class":633,"line":1359},[631,2949,2278],{"class":735},[631,2951,1193],{"class":739},[631,2953,829],{"class":735},[631,2955,2956,2958],{"class":633,"line":1413},[631,2957,835],{"class":739},[631,2959,829],{"class":735},[631,2961,2962,2964],{"class":633,"line":1418},[631,2963,843],{"class":735},[631,2965,846],{"class":739},[631,2967,2968,2970,2972,2974],{"class":633,"line":1435},[631,2969,852],{"class":731},[631,2971,856],{"class":855},[631,2973,859],{"class":637},[631,2975,862],{"class":735},[613,2977,2979],{"id":2978},"async-configuration","Async Configuration",[544,2981,1517,2982,2985,2986,2989],{},[548,2983,2984],{},"forRootAsync()"," when options depend on other providers (e.g. ",[548,2987,2988],{},"ConfigService","):",[621,2991,2993],{"className":721,"code":2992,"filename":723,"language":724,"meta":627,"style":627},"import { Module } from '@nestjs\u002Fcommon'\nimport { ConfigModule, ConfigService } from '@nestjs\u002Fconfig'\nimport { EvlogModule } from 'evlog\u002Fnestjs'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\n@Module({\n  imports: [\n    ConfigModule.forRoot(),\n    EvlogModule.forRootAsync({\n      imports: [ConfigModule],\n      inject: [ConfigService],\n      useFactory: (config: ConfigService) => ({\n        drain: createAxiomDrain({ apiKey: config.get('AXIOM_API_KEY') }),\n      }),\n    }),\n  ],\n})\nexport class AppModule {}\n",[548,2994,2995,3013,3038,3056,3074,3078,3088,3096,3109,3122,3134,3146,3170,3213,3222,3230,3236,3242],{"__ignoreMap":627},[631,2996,2997,2999,3001,3003,3005,3007,3009,3011],{"class":633,"line":634},[631,2998,732],{"class":731},[631,3000,736],{"class":735},[631,3002,740],{"class":739},[631,3004,743],{"class":735},[631,3006,746],{"class":731},[631,3008,749],{"class":735},[631,3010,752],{"class":640},[631,3012,755],{"class":735},[631,3014,3015,3017,3019,3022,3024,3027,3029,3031,3033,3036],{"class":633,"line":758},[631,3016,732],{"class":731},[631,3018,736],{"class":735},[631,3020,3021],{"class":739}," ConfigModule",[631,3023,1066],{"class":735},[631,3025,3026],{"class":739}," ConfigService",[631,3028,743],{"class":735},[631,3030,746],{"class":731},[631,3032,749],{"class":735},[631,3034,3035],{"class":640},"@nestjs\u002Fconfig",[631,3037,755],{"class":735},[631,3039,3040,3042,3044,3046,3048,3050,3052,3054],{"class":633,"line":778},[631,3041,732],{"class":731},[631,3043,736],{"class":735},[631,3045,765],{"class":739},[631,3047,743],{"class":735},[631,3049,746],{"class":731},[631,3051,749],{"class":735},[631,3053,550],{"class":640},[631,3055,755],{"class":735},[631,3057,3058,3060,3062,3064,3066,3068,3070,3072],{"class":633,"line":785},[631,3059,732],{"class":731},[631,3061,736],{"class":735},[631,3063,2785],{"class":739},[631,3065,743],{"class":735},[631,3067,746],{"class":731},[631,3069,749],{"class":735},[631,3071,2794],{"class":640},[631,3073,755],{"class":735},[631,3075,3076],{"class":633,"line":801},[631,3077,782],{"emptyLinePlaceholder":781},[631,3079,3080,3082,3084,3086],{"class":633,"line":814},[631,3081,788],{"class":735},[631,3083,792],{"class":791},[631,3085,795],{"class":739},[631,3087,798],{"class":735},[631,3089,3090,3092,3094],{"class":633,"line":832},[631,3091,805],{"class":804},[631,3093,808],{"class":735},[631,3095,811],{"class":739},[631,3097,3098,3101,3103,3105,3107],{"class":633,"line":840},[631,3099,3100],{"class":739},"    ConfigModule",[631,3102,820],{"class":735},[631,3104,823],{"class":791},[631,3106,826],{"class":739},[631,3108,829],{"class":735},[631,3110,3111,3113,3115,3118,3120],{"class":633,"line":849},[631,3112,817],{"class":739},[631,3114,820],{"class":735},[631,3116,3117],{"class":791},"forRootAsync",[631,3119,795],{"class":739},[631,3121,798],{"class":735},[631,3123,3124,3127,3129,3132],{"class":633,"line":993},[631,3125,3126],{"class":804},"      imports",[631,3128,808],{"class":735},[631,3130,3131],{"class":739}," [ConfigModule]",[631,3133,829],{"class":735},[631,3135,3136,3139,3141,3144],{"class":633,"line":1018},[631,3137,3138],{"class":804},"      inject",[631,3140,808],{"class":735},[631,3142,3143],{"class":739}," [ConfigService]",[631,3145,829],{"class":735},[631,3147,3148,3151,3153,3155,3158,3160,3162,3164,3166,3168],{"class":633,"line":1253},[631,3149,3150],{"class":791},"      useFactory",[631,3152,808],{"class":735},[631,3154,2890],{"class":735},[631,3156,3157],{"class":1185},"config",[631,3159,808],{"class":735},[631,3161,3026],{"class":637},[631,3163,1193],{"class":735},[631,3165,1942],{"class":855},[631,3167,2890],{"class":739},[631,3169,798],{"class":735},[631,3171,3172,3175,3177,3179,3181,3183,3186,3188,3191,3193,3196,3198,3200,3203,3205,3207,3209,3211],{"class":633,"line":1278},[631,3173,3174],{"class":804},"        drain",[631,3176,808],{"class":735},[631,3178,2785],{"class":791},[631,3180,795],{"class":739},[631,3182,1230],{"class":735},[631,3184,3185],{"class":804}," apiKey",[631,3187,808],{"class":735},[631,3189,3190],{"class":739}," config",[631,3192,820],{"class":735},[631,3194,3195],{"class":791},"get",[631,3197,795],{"class":739},[631,3199,977],{"class":735},[631,3201,3202],{"class":640},"AXIOM_API_KEY",[631,3204,977],{"class":735},[631,3206,1182],{"class":739},[631,3208,843],{"class":735},[631,3210,1193],{"class":739},[631,3212,829],{"class":735},[631,3214,3215,3218,3220],{"class":633,"line":1329},[631,3216,3217],{"class":735},"      }",[631,3219,1193],{"class":739},[631,3221,829],{"class":735},[631,3223,3224,3226,3228],{"class":633,"line":1334},[631,3225,2278],{"class":735},[631,3227,1193],{"class":739},[631,3229,829],{"class":735},[631,3231,3232,3234],{"class":633,"line":1359},[631,3233,835],{"class":739},[631,3235,829],{"class":735},[631,3237,3238,3240],{"class":633,"line":1413},[631,3239,843],{"class":735},[631,3241,846],{"class":739},[631,3243,3244,3246,3248,3250],{"class":633,"line":1418},[631,3245,852],{"class":731},[631,3247,856],{"class":855},[631,3249,859],{"class":637},[631,3251,862],{"class":735},[613,3253,3255],{"id":3254},"pipeline-batching-retry","Pipeline (Batching & Retry)",[544,3257,3258,3259,3262],{},"For production, wrap your adapter with ",[548,3260,3261],{},"createDrainPipeline"," to batch events and retry on failure:",[621,3264,3266],{"className":721,"code":3265,"filename":723,"language":724,"meta":627,"style":627},"import type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 50, intervalMs: 5000 },\n  retry: { maxAttempts: 3 },\n})\nconst drain = pipeline(createAxiomDrain())\n\nEvlogModule.forRoot({ drain })\n",[548,3267,3268,3289,3307,3327,3331,3355,3384,3403,3409,3428,3432],{"__ignoreMap":627},[631,3269,3270,3272,3274,3276,3279,3281,3283,3285,3287],{"class":633,"line":634},[631,3271,732],{"class":731},[631,3273,2062],{"class":731},[631,3275,736],{"class":735},[631,3277,3278],{"class":739}," DrainContext",[631,3280,743],{"class":735},[631,3282,746],{"class":731},[631,3284,749],{"class":735},[631,3286,921],{"class":640},[631,3288,755],{"class":735},[631,3290,3291,3293,3295,3297,3299,3301,3303,3305],{"class":633,"line":758},[631,3292,732],{"class":731},[631,3294,736],{"class":735},[631,3296,2785],{"class":739},[631,3298,743],{"class":735},[631,3300,746],{"class":731},[631,3302,749],{"class":735},[631,3304,2794],{"class":640},[631,3306,755],{"class":735},[631,3308,3309,3311,3313,3316,3318,3320,3322,3325],{"class":633,"line":778},[631,3310,732],{"class":731},[631,3312,736],{"class":735},[631,3314,3315],{"class":739}," createDrainPipeline",[631,3317,743],{"class":735},[631,3319,746],{"class":731},[631,3321,749],{"class":735},[631,3323,3324],{"class":640},"evlog\u002Fpipeline",[631,3326,755],{"class":735},[631,3328,3329],{"class":633,"line":785},[631,3330,782],{"emptyLinePlaceholder":781},[631,3332,3333,3335,3338,3340,3342,3345,3348,3351,3353],{"class":633,"line":801},[631,3334,996],{"class":855},[631,3336,3337],{"class":739}," pipeline ",[631,3339,1002],{"class":735},[631,3341,3315],{"class":791},[631,3343,3344],{"class":735},"\u003C",[631,3346,3347],{"class":637},"DrainContext",[631,3349,3350],{"class":735},">",[631,3352,795],{"class":739},[631,3354,798],{"class":735},[631,3356,3357,3360,3362,3364,3367,3369,3372,3374,3377,3379,3382],{"class":633,"line":814},[631,3358,3359],{"class":804},"  batch",[631,3361,808],{"class":735},[631,3363,736],{"class":735},[631,3365,3366],{"class":804}," size",[631,3368,808],{"class":735},[631,3370,3371],{"class":1034}," 50",[631,3373,1066],{"class":735},[631,3375,3376],{"class":804}," intervalMs",[631,3378,808],{"class":735},[631,3380,3381],{"class":1034}," 5000",[631,3383,980],{"class":735},[631,3385,3386,3389,3391,3393,3396,3398,3401],{"class":633,"line":832},[631,3387,3388],{"class":804},"  retry",[631,3390,808],{"class":735},[631,3392,736],{"class":735},[631,3394,3395],{"class":804}," maxAttempts",[631,3397,808],{"class":735},[631,3399,3400],{"class":1034}," 3",[631,3402,980],{"class":735},[631,3404,3405,3407],{"class":633,"line":840},[631,3406,843],{"class":735},[631,3408,846],{"class":739},[631,3410,3411,3413,3416,3418,3421,3423,3426],{"class":633,"line":849},[631,3412,996],{"class":855},[631,3414,3415],{"class":739}," drain ",[631,3417,1002],{"class":735},[631,3419,3420],{"class":791}," pipeline",[631,3422,795],{"class":739},[631,3424,3425],{"class":791},"createAxiomDrain",[631,3427,2529],{"class":739},[631,3429,3430],{"class":633,"line":993},[631,3431,782],{"emptyLinePlaceholder":781},[631,3433,3434,3437,3439,3441,3443,3445,3447,3449],{"class":633,"line":1018},[631,3435,3436],{"class":739},"EvlogModule",[631,3438,820],{"class":735},[631,3440,823],{"class":791},[631,3442,795],{"class":739},[631,3444,1230],{"class":735},[631,3446,3415],{"class":739},[631,3448,843],{"class":735},[631,3450,846],{"class":739},[3452,3453,3455,3456,3459,3460,3463],"callout",{"color":3454,"icon":13},"info","Call ",[548,3457,3458],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[598,3461,3462],{"href":496},"Pipeline docs"," for all options.",[609,3465,3467],{"id":3466},"tail-sampling","Tail Sampling",[544,3469,1517,3470,3473],{},[548,3471,3472],{},"keep"," to force-retain specific events regardless of head sampling:",[621,3475,3477],{"className":721,"code":3476,"filename":723,"language":724,"meta":627,"style":627},"EvlogModule.forRoot({\n  drain: createAxiomDrain(),\n  keep: (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n  },\n})\n",[548,3478,3479,3491,3504,3521,3565,3570],{"__ignoreMap":627},[631,3480,3481,3483,3485,3487,3489],{"class":633,"line":634},[631,3482,3436],{"class":739},[631,3484,820],{"class":735},[631,3486,823],{"class":791},[631,3488,795],{"class":739},[631,3490,798],{"class":735},[631,3492,3493,3496,3498,3500,3502],{"class":633,"line":758},[631,3494,3495],{"class":804},"  drain",[631,3497,808],{"class":735},[631,3499,2785],{"class":791},[631,3501,826],{"class":739},[631,3503,829],{"class":735},[631,3505,3506,3509,3511,3513,3515,3517,3519],{"class":633,"line":778},[631,3507,3508],{"class":791},"  keep",[631,3510,808],{"class":735},[631,3512,2890],{"class":735},[631,3514,2893],{"class":1185},[631,3516,1193],{"class":735},[631,3518,1942],{"class":855},[631,3520,1137],{"class":735},[631,3522,3523,3526,3528,3530,3532,3535,3538,3541,3543,3545,3548,3551,3553,3555,3557,3560,3562],{"class":633,"line":785},[631,3524,3525],{"class":731},"    if",[631,3527,2890],{"class":804},[631,3529,2893],{"class":739},[631,3531,820],{"class":735},[631,3533,3534],{"class":739},"duration",[631,3536,3537],{"class":735}," &&",[631,3539,3540],{"class":739}," ctx",[631,3542,820],{"class":735},[631,3544,3534],{"class":739},[631,3546,3547],{"class":735}," >",[631,3549,3550],{"class":1034}," 2000",[631,3552,1182],{"class":804},[631,3554,2893],{"class":739},[631,3556,820],{"class":735},[631,3558,3559],{"class":739},"shouldKeep",[631,3561,1206],{"class":735},[631,3563,3564],{"class":1976}," true\n",[631,3566,3567],{"class":633,"line":801},[631,3568,3569],{"class":735},"  },\n",[631,3571,3572,3574],{"class":633,"line":814},[631,3573,843],{"class":735},[631,3575,846],{"class":739},[609,3577,3579],{"id":3578},"route-filtering","Route Filtering",[544,3581,3582,3583,1817,3586,3589],{},"Control which routes are logged with ",[548,3584,3585],{},"include",[548,3587,3588],{},"exclude"," patterns:",[621,3591,3593],{"className":721,"code":3592,"filename":723,"language":724,"meta":627,"style":627},"EvlogModule.forRoot({\n  include: ['\u002Fapi\u002F**'],\n  exclude: ['\u002F_internal\u002F**', '\u002Fhealth'],\n  routes: {\n    '\u002Fapi\u002Fauth\u002F**': { service: 'auth-service' },\n    '\u002Fapi\u002Fpayment\u002F**': { service: 'payment-service' },\n  },\n})\n",[548,3594,3595,3607,3629,3658,3667,3694,3720,3724],{"__ignoreMap":627},[631,3596,3597,3599,3601,3603,3605],{"class":633,"line":634},[631,3598,3436],{"class":739},[631,3600,820],{"class":735},[631,3602,823],{"class":791},[631,3604,795],{"class":739},[631,3606,798],{"class":735},[631,3608,3609,3612,3614,3617,3619,3622,3624,3627],{"class":633,"line":758},[631,3610,3611],{"class":804},"  include",[631,3613,808],{"class":735},[631,3615,3616],{"class":739}," [",[631,3618,977],{"class":735},[631,3620,3621],{"class":640},"\u002Fapi\u002F**",[631,3623,977],{"class":735},[631,3625,3626],{"class":739},"]",[631,3628,829],{"class":735},[631,3630,3631,3634,3636,3638,3640,3643,3645,3647,3649,3652,3654,3656],{"class":633,"line":778},[631,3632,3633],{"class":804},"  exclude",[631,3635,808],{"class":735},[631,3637,3616],{"class":739},[631,3639,977],{"class":735},[631,3641,3642],{"class":640},"\u002F_internal\u002F**",[631,3644,977],{"class":735},[631,3646,1066],{"class":735},[631,3648,749],{"class":735},[631,3650,3651],{"class":640},"\u002Fhealth",[631,3653,977],{"class":735},[631,3655,3626],{"class":739},[631,3657,829],{"class":735},[631,3659,3660,3663,3665],{"class":633,"line":785},[631,3661,3662],{"class":804},"  routes",[631,3664,808],{"class":735},[631,3666,1137],{"class":735},[631,3668,3669,3672,3675,3677,3679,3681,3683,3685,3687,3690,3692],{"class":633,"line":801},[631,3670,3671],{"class":735},"    '",[631,3673,3674],{"class":804},"\u002Fapi\u002Fauth\u002F**",[631,3676,977],{"class":735},[631,3678,808],{"class":735},[631,3680,736],{"class":735},[631,3682,967],{"class":804},[631,3684,808],{"class":735},[631,3686,749],{"class":735},[631,3688,3689],{"class":640},"auth-service",[631,3691,977],{"class":735},[631,3693,980],{"class":735},[631,3695,3696,3698,3701,3703,3705,3707,3709,3711,3713,3716,3718],{"class":633,"line":814},[631,3697,3671],{"class":735},[631,3699,3700],{"class":804},"\u002Fapi\u002Fpayment\u002F**",[631,3702,977],{"class":735},[631,3704,808],{"class":735},[631,3706,736],{"class":735},[631,3708,967],{"class":804},[631,3710,808],{"class":735},[631,3712,749],{"class":735},[631,3714,3715],{"class":640},"payment-service",[631,3717,977],{"class":735},[631,3719,980],{"class":735},[631,3721,3722],{"class":633,"line":832},[631,3723,3569],{"class":735},[631,3725,3726,3728],{"class":633,"line":840},[631,3727,843],{"class":735},[631,3729,846],{"class":739},[609,3731,3733],{"id":3732},"run-locally","Run Locally",[621,3735,3738],{"className":623,"code":3736,"filename":3737,"language":626,"meta":627,"style":627},"git clone https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\ncd evlog\npnpm install\npnpm example nestjs\n","Terminal",[548,3739,3740,3751,3759,3766],{"__ignoreMap":627},[631,3741,3742,3745,3748],{"class":633,"line":634},[631,3743,3744],{"class":637},"git",[631,3746,3747],{"class":640}," clone",[631,3749,3750],{"class":640}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[631,3752,3753,3756],{"class":633,"line":758},[631,3754,3755],{"class":791},"cd",[631,3757,3758],{"class":640}," evlog\n",[631,3760,3761,3763],{"class":633,"line":778},[631,3762,625],{"class":637},[631,3764,3765],{"class":640}," install\n",[631,3767,3768,3770,3773],{"class":633,"line":785},[631,3769,625],{"class":637},[631,3771,3772],{"class":640}," example",[631,3774,3775],{"class":640}," nestjs\n",[544,3777,3778,3779,3783],{},"Open ",[598,3780,3781],{"href":3781,"rel":3782},"http:\u002F\u002Flocalhost:3000",[602]," to explore the interactive test UI.",[3785,3786,3787],"card-group",{},[3788,3789,3793],"card",{"icon":3790,"title":3791,"to":3792},"i-simple-icons-github","Source Code","https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fnestjs","Browse the complete NestJS example source on GitHub.",[609,3795,3797],{"id":3796},"next-steps","Next Steps",[544,3799,3800,3801,3804],{},"Deepen your ",[3802,3803,255],"strong",{}," integration:",[573,3806,3807,3812,3817,3822],{},[576,3808,3809,3811],{},[598,3810,46],{"href":47},": Design comprehensive events with context layering",[576,3813,3814,3816],{},[598,3815,138],{"href":143},": Send logs to Axiom, Sentry, PostHog, and more",[576,3818,3819,3821],{},[598,3820,61],{"href":62},": Control log volume with head and tail sampling",[576,3823,3824,3826,3827,2022,3829,2026,3831,3833],{},[598,3825,51],{"href":52},": Throw errors with ",[548,3828,2021],{},[548,3830,2025],{},[548,3832,2029],{}," fields",[3835,3836,3837],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}",{"title":627,"searchDepth":758,"depth":758,"links":3839},[3840,3845,3846,3847,3849,3850,3851,3855,3856,3857,3858],{"id":611,"depth":758,"text":25,"children":3841},[3842,3843,3844],{"id":615,"depth":778,"text":616},{"id":717,"depth":778,"text":718},{"id":865,"depth":778,"text":866},{"id":1045,"depth":758,"text":46},{"id":1514,"depth":758,"text":558},{"id":1830,"depth":758,"text":3848},"Background work (log.fork)",{"id":2011,"depth":758,"text":2012},{"id":2716,"depth":758,"text":508},{"id":2729,"depth":758,"text":2730,"children":3852},[3853,3854],{"id":2978,"depth":778,"text":2979},{"id":3254,"depth":778,"text":3255},{"id":3466,"depth":758,"text":3467},{"id":3578,"depth":758,"text":3579},{"id":3732,"depth":758,"text":3733},{"id":3796,"depth":758,"text":3797},"`EvlogModule.forRoot()` registers the middleware, the exception filter and `useLogger()` across a NestJS app, with async config where you need it.","md",[3862],{"label":3791,"icon":3790,"to":3792,"color":3863,"variant":3864},"neutral","subtle",{},{"title":255,"icon":258},{"title":255,"description":3859},"PWRAszC7S0tTMG5LW2_GY2zr7OUPG9lrOmuJL5V4Cs4",[3870,3872],{"title":250,"path":251,"stem":252,"description":3871,"icon":253,"children":-1},"Automatic wide events, structured errors, and logging in TanStack Start API routes and server functions.",{"title":260,"path":261,"stem":262,"description":3873,"icon":263,"children":-1},"One `app.use(evlog())` puts a request logger on `req.log`, emits the wide event when the response finishes, and feeds your error handler.",1786817435235]