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