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