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