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