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