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