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