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