[{"data":1,"prerenderedAt":2098},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-custom-integration":228,"-frameworks-custom-integration-surround":2093},[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":106,"body":230,"description":2086,"extension":2087,"links":2088,"meta":2089,"navigation":2090,"path":107,"seo":2091,"stem":108,"__hash__":2092},"docs\u002F2.frameworks\u002F14.custom-integration.md",{"type":231,"value":232,"toc":2077},"minimark",[233,242,253,258,315,319,499,523,527,530,538,608,614,618,621,1342,1349,1353,1458,1462,1465,1938,1942,1945,2062,2073],[234,235,236,237,241],"p",{},"Don't see your framework listed? The ",[238,239,240],"code",{},"evlog\u002Ftoolkit"," package exposes the same building blocks that power every built-in integration (Hono, Express, Fastify, Elysia, NestJS, SvelteKit). Build a full-featured evlog middleware for any HTTP framework in ~50 lines of code.",[243,244,247,248,252],"callout",{"color":245,"icon":246},"warning","i-lucide-flask-conical","The toolkit API is marked as ",[249,250,251],"strong",{},"beta",". The surface is stable (used by all built-in integrations) but may evolve based on community feedback.",[254,255,257],"h2",{"id":256},"install","Install",[259,260,261,286,301],"code-group",{},[262,263,269],"pre",{"className":264,"code":265,"filename":266,"language":267,"meta":268,"style":268},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[238,270,271],{"__ignoreMap":268},[272,273,276,279,283],"span",{"class":274,"line":275},"line",1,[272,277,266],{"class":278},"sBMFI",[272,280,282],{"class":281},"sfazB"," add",[272,284,285],{"class":281}," evlog\n",[262,287,290],{"className":264,"code":288,"filename":289,"language":267,"meta":268,"style":268},"npm install evlog\n","npm",[238,291,292],{"__ignoreMap":268},[272,293,294,296,299],{"class":274,"line":275},[272,295,289],{"class":278},[272,297,298],{"class":281}," install",[272,300,285],{"class":281},[262,302,305],{"className":264,"code":303,"filename":304,"language":267,"meta":268,"style":268},"bun add evlog\n","bun",[238,306,307],{"__ignoreMap":268},[272,308,309,311,313],{"class":274,"line":275},[272,310,304],{"class":278},[272,312,282],{"class":281},[272,314,285],{"class":281},[254,316,318],{"id":317},"whats-in-the-toolkit","What's in the Toolkit",[320,321,322,335],"table",{},[323,324,325],"thead",{},[326,327,328,332],"tr",{},[329,330,331],"th",{},"Export",[329,333,334],{},"Purpose",[336,337,338,349,378,403,416,430,444,461,479,489],"tbody",{},[326,339,340,346],{},[341,342,343],"td",{},[238,344,345],{},"createMiddlewareLogger(opts)",[341,347,348],{},"Full pipeline: logger creation, route filtering, tail sampling, emit, enrich, drain",[326,350,351,356],{},[341,352,353],{},[238,354,355],{},"BaseEvlogOptions",[341,357,358,359,362,363,362,366,362,369,362,372,362,375],{},"Base user-facing options type with ",[238,360,361],{},"drain",", ",[238,364,365],{},"enrich",[238,367,368],{},"keep",[238,370,371],{},"include",[238,373,374],{},"exclude",[238,376,377],{},"routes",[326,379,380,385],{},[341,381,382],{},[238,383,384],{},"MiddlewareLoggerOptions",[341,386,387,388,390,391,362,394,362,397,362,400],{},"Internal options extending ",[238,389,355],{}," with ",[238,392,393],{},"method",[238,395,396],{},"path",[238,398,399],{},"requestId",[238,401,402],{},"headers",[326,404,405,410],{},[341,406,407],{},[238,408,409],{},"MiddlewareLoggerResult",[341,411,412,413],{},"Return type: ",[238,414,415],{},"{ logger, finish, skipped }",[326,417,418,423],{},[341,419,420],{},[238,421,422],{},"extractSafeHeaders(headers)",[341,424,425,426,429],{},"Filter sensitive headers from a Web API ",[238,427,428],{},"Headers"," object (Hono, Elysia, Deno, Bun)",[326,431,432,437],{},[341,433,434],{},[238,435,436],{},"extractSafeNodeHeaders(headers)",[341,438,439,440,443],{},"Filter sensitive headers from Node.js ",[238,441,442],{},"IncomingHttpHeaders"," (Express, Fastify, NestJS)",[326,445,446,451],{},[341,447,448],{},[238,449,450],{},"createLoggerStorage(hint)",[341,452,453,454,457,458],{},"Factory returning ",[238,455,456],{},"{ storage, useLogger }"," backed by ",[238,459,460],{},"AsyncLocalStorage",[326,462,463,468],{},[341,464,465],{},[238,466,467],{},"extractErrorStatus(error)",[341,469,470,471,474,475,478],{},"Extract HTTP status from any error shape (",[238,472,473],{},"status"," or ",[238,476,477],{},"statusCode",")",[326,480,481,486],{},[341,482,483],{},[238,484,485],{},"shouldLog(path, include, exclude)",[341,487,488],{},"Route filtering logic (glob patterns)",[326,490,491,496],{},[341,492,493],{},[238,494,495],{},"getServiceForPath(path, routes)",[341,497,498],{},"Resolve per-route service name",[234,500,501,502,362,505,362,508,362,511,514,515,518,519,522],{},"Types like ",[238,503,504],{},"RequestLogger",[238,506,507],{},"DrainContext",[238,509,510],{},"EnrichContext",[238,512,513],{},"WideEvent",", and ",[238,516,517],{},"TailSamplingContext"," are exported from the main ",[238,520,521],{},"evlog"," package.",[254,524,526],{"id":525},"architecture","Architecture",[234,528,529],{},"Every evlog framework integration follows the same 5-step pattern:",[262,531,536],{"className":532,"code":534,"language":535},[533],"language-text","Request → createMiddlewareLogger() → store logger → handle request → finish()\n","text",[238,537,534],{"__ignoreMap":268},[539,540,541,557,566,579,596],"ol",{},[542,543,544,547,548,362,550,362,552,514,554,556],"li",{},[249,545,546],{},"Extract"," ",[238,549,393],{},[238,551,396],{},[238,553,399],{},[238,555,402],{}," from the framework request",[542,558,559,547,562,565],{},[249,560,561],{},"Call",[238,563,564],{},"createMiddlewareLogger()"," with those fields + user options",[542,567,568,547,571,574,575,578],{},[249,569,570],{},"Check",[238,572,573],{},"skipped"," — if ",[238,576,577],{},"true",", the route is filtered out, skip to next middleware",[542,580,581,584,585,588,589,362,592,595],{},[249,582,583],{},"Store"," the ",[238,586,587],{},"logger"," in the framework's idiomatic context (",[238,590,591],{},"req.log",[238,593,594],{},"c.set('log')",", etc.)",[542,597,598,547,600,603,604,607],{},[249,599,561],{},[238,601,602],{},"finish({ status })"," on success or ",[238,605,606],{},"finish({ error })"," on failure",[234,609,610,613],{},[238,611,612],{},"createMiddlewareLogger"," handles everything else: route filtering, service overrides, duration tracking, tail sampling, event emission, enrichment, and draining.",[254,615,617],{"id":616},"minimal-example","Minimal Example",[234,619,620],{},"Here's a complete integration for a generic Node.js HTTP framework:",[262,622,627],{"className":623,"code":624,"filename":625,"language":626,"meta":268,"style":268},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { RequestLogger } from 'evlog'\nimport {\n  createMiddlewareLogger,\n  extractSafeNodeHeaders,\n  createLoggerStorage,\n  type BaseEvlogOptions,\n} from 'evlog\u002Ftoolkit'\n\nexport type MyFrameworkEvlogOptions = BaseEvlogOptions\n\nconst { storage, useLogger } = createLoggerStorage(\n  'middleware context. Make sure evlog middleware is registered before your routes.',\n)\n\nexport { useLogger }\n\nexport function evlog(options: MyFrameworkEvlogOptions = {}) {\n  return async (req: IncomingMessage, res: ServerResponse, next: () => Promise\u003Cvoid>) => {\n    const { logger, finish, skipped } = createMiddlewareLogger({\n      method: req.method || 'GET',\n      path: req.url || '\u002F',\n      requestId: (req.headers['x-request-id'] as string) || crypto.randomUUID(),\n      headers: extractSafeNodeHeaders(req.headers),\n      ...options,\n    })\n\n    if (skipped) {\n      await next()\n      return\n    }\n\n    ;(req as IncomingMessage & { log: RequestLogger }).log = logger\n\n    try {\n      await storage.run(logger, () => next())\n      await finish({ status: res.statusCode })\n    } catch (error) {\n      await finish({ error: error as Error })\n      throw error\n    }\n  }\n}\n","my-framework-evlog.ts","typescript",[238,628,629,667,689,697,706,714,722,733,747,754,772,777,804,818,824,829,842,847,877,934,968,996,1022,1076,1099,1109,1117,1122,1136,1147,1153,1159,1164,1205,1210,1218,1245,1272,1289,1316,1325,1330,1336],{"__ignoreMap":268},[272,630,631,635,638,642,646,649,652,655,658,661,664],{"class":274,"line":275},[272,632,634],{"class":633},"s7zQu","import",[272,636,637],{"class":633}," type",[272,639,641],{"class":640},"sMK4o"," {",[272,643,645],{"class":644},"sTEyZ"," IncomingMessage",[272,647,648],{"class":640},",",[272,650,651],{"class":644}," ServerResponse",[272,653,654],{"class":640}," }",[272,656,657],{"class":633}," from",[272,659,660],{"class":640}," '",[272,662,663],{"class":281},"node:http",[272,665,666],{"class":640},"'\n",[272,668,670,672,674,676,679,681,683,685,687],{"class":274,"line":669},2,[272,671,634],{"class":633},[272,673,637],{"class":633},[272,675,641],{"class":640},[272,677,678],{"class":644}," RequestLogger",[272,680,654],{"class":640},[272,682,657],{"class":633},[272,684,660],{"class":640},[272,686,521],{"class":281},[272,688,666],{"class":640},[272,690,692,694],{"class":274,"line":691},3,[272,693,634],{"class":633},[272,695,696],{"class":640}," {\n",[272,698,700,703],{"class":274,"line":699},4,[272,701,702],{"class":644},"  createMiddlewareLogger",[272,704,705],{"class":640},",\n",[272,707,709,712],{"class":274,"line":708},5,[272,710,711],{"class":644},"  extractSafeNodeHeaders",[272,713,705],{"class":640},[272,715,717,720],{"class":274,"line":716},6,[272,718,719],{"class":644},"  createLoggerStorage",[272,721,705],{"class":640},[272,723,725,728,731],{"class":274,"line":724},7,[272,726,727],{"class":633},"  type",[272,729,730],{"class":644}," BaseEvlogOptions",[272,732,705],{"class":640},[272,734,736,739,741,743,745],{"class":274,"line":735},8,[272,737,738],{"class":640},"}",[272,740,657],{"class":633},[272,742,660],{"class":640},[272,744,240],{"class":281},[272,746,666],{"class":640},[272,748,750],{"class":274,"line":749},9,[272,751,753],{"emptyLinePlaceholder":752},true,"\n",[272,755,757,760,763,766,769],{"class":274,"line":756},10,[272,758,759],{"class":633},"export",[272,761,637],{"class":762},"spNyl",[272,764,765],{"class":278}," MyFrameworkEvlogOptions",[272,767,768],{"class":640}," =",[272,770,771],{"class":278}," BaseEvlogOptions\n",[272,773,775],{"class":274,"line":774},11,[272,776,753],{"emptyLinePlaceholder":752},[272,778,780,783,785,788,790,793,795,797,801],{"class":274,"line":779},12,[272,781,782],{"class":762},"const",[272,784,641],{"class":640},[272,786,787],{"class":644}," storage",[272,789,648],{"class":640},[272,791,792],{"class":644}," useLogger ",[272,794,738],{"class":640},[272,796,768],{"class":640},[272,798,800],{"class":799},"s2Zo4"," createLoggerStorage",[272,802,803],{"class":644},"(\n",[272,805,807,810,813,816],{"class":274,"line":806},13,[272,808,809],{"class":640},"  '",[272,811,812],{"class":281},"middleware context. Make sure evlog middleware is registered before your routes.",[272,814,815],{"class":640},"'",[272,817,705],{"class":640},[272,819,821],{"class":274,"line":820},14,[272,822,823],{"class":644},")\n",[272,825,827],{"class":274,"line":826},15,[272,828,753],{"emptyLinePlaceholder":752},[272,830,832,834,836,839],{"class":274,"line":831},16,[272,833,759],{"class":633},[272,835,641],{"class":640},[272,837,838],{"class":644}," useLogger",[272,840,841],{"class":640}," }\n",[272,843,845],{"class":274,"line":844},17,[272,846,753],{"emptyLinePlaceholder":752},[272,848,850,852,855,858,861,865,868,870,872,875],{"class":274,"line":849},18,[272,851,759],{"class":633},[272,853,854],{"class":762}," function",[272,856,857],{"class":799}," evlog",[272,859,860],{"class":640},"(",[272,862,864],{"class":863},"sHdIc","options",[272,866,867],{"class":640},":",[272,869,765],{"class":278},[272,871,768],{"class":640},[272,873,874],{"class":640}," {})",[272,876,696],{"class":640},[272,878,880,883,886,889,892,894,896,898,901,903,905,907,910,912,915,918,921,924,927,930,932],{"class":274,"line":879},19,[272,881,882],{"class":633},"  return",[272,884,885],{"class":762}," async",[272,887,888],{"class":640}," (",[272,890,891],{"class":863},"req",[272,893,867],{"class":640},[272,895,645],{"class":278},[272,897,648],{"class":640},[272,899,900],{"class":863}," res",[272,902,867],{"class":640},[272,904,651],{"class":278},[272,906,648],{"class":640},[272,908,909],{"class":799}," next",[272,911,867],{"class":640},[272,913,914],{"class":640}," ()",[272,916,917],{"class":762}," =>",[272,919,920],{"class":278}," Promise",[272,922,923],{"class":640},"\u003C",[272,925,926],{"class":278},"void",[272,928,929],{"class":640},">)",[272,931,917],{"class":762},[272,933,696],{"class":640},[272,935,937,940,942,945,947,950,952,955,957,959,962,965],{"class":274,"line":936},20,[272,938,939],{"class":762},"    const",[272,941,641],{"class":640},[272,943,944],{"class":644}," logger",[272,946,648],{"class":640},[272,948,949],{"class":644}," finish",[272,951,648],{"class":640},[272,953,954],{"class":644}," skipped",[272,956,654],{"class":640},[272,958,768],{"class":640},[272,960,961],{"class":799}," createMiddlewareLogger",[272,963,860],{"class":964},"swJcz",[272,966,967],{"class":640},"{\n",[272,969,971,974,976,979,982,984,987,989,992,994],{"class":274,"line":970},21,[272,972,973],{"class":964},"      method",[272,975,867],{"class":640},[272,977,978],{"class":644}," req",[272,980,981],{"class":640},".",[272,983,393],{"class":644},[272,985,986],{"class":640}," ||",[272,988,660],{"class":640},[272,990,991],{"class":281},"GET",[272,993,815],{"class":640},[272,995,705],{"class":640},[272,997,999,1002,1004,1006,1008,1011,1013,1015,1018,1020],{"class":274,"line":998},22,[272,1000,1001],{"class":964},"      path",[272,1003,867],{"class":640},[272,1005,978],{"class":644},[272,1007,981],{"class":640},[272,1009,1010],{"class":644},"url",[272,1012,986],{"class":640},[272,1014,660],{"class":640},[272,1016,1017],{"class":281},"\u002F",[272,1019,815],{"class":640},[272,1021,705],{"class":640},[272,1023,1025,1028,1030,1032,1034,1036,1038,1041,1043,1046,1048,1051,1054,1057,1060,1063,1066,1068,1071,1074],{"class":274,"line":1024},23,[272,1026,1027],{"class":964},"      requestId",[272,1029,867],{"class":640},[272,1031,888],{"class":964},[272,1033,891],{"class":644},[272,1035,981],{"class":640},[272,1037,402],{"class":644},[272,1039,1040],{"class":964},"[",[272,1042,815],{"class":640},[272,1044,1045],{"class":281},"x-request-id",[272,1047,815],{"class":640},[272,1049,1050],{"class":964},"] ",[272,1052,1053],{"class":633},"as",[272,1055,1056],{"class":278}," string",[272,1058,1059],{"class":964},") ",[272,1061,1062],{"class":640},"||",[272,1064,1065],{"class":644}," crypto",[272,1067,981],{"class":640},[272,1069,1070],{"class":799},"randomUUID",[272,1072,1073],{"class":964},"()",[272,1075,705],{"class":640},[272,1077,1079,1082,1084,1087,1089,1091,1093,1095,1097],{"class":274,"line":1078},24,[272,1080,1081],{"class":964},"      headers",[272,1083,867],{"class":640},[272,1085,1086],{"class":799}," extractSafeNodeHeaders",[272,1088,860],{"class":964},[272,1090,891],{"class":644},[272,1092,981],{"class":640},[272,1094,402],{"class":644},[272,1096,478],{"class":964},[272,1098,705],{"class":640},[272,1100,1102,1105,1107],{"class":274,"line":1101},25,[272,1103,1104],{"class":640},"      ...",[272,1106,864],{"class":644},[272,1108,705],{"class":640},[272,1110,1112,1115],{"class":274,"line":1111},26,[272,1113,1114],{"class":640},"    }",[272,1116,823],{"class":964},[272,1118,1120],{"class":274,"line":1119},27,[272,1121,753],{"emptyLinePlaceholder":752},[272,1123,1125,1128,1130,1132,1134],{"class":274,"line":1124},28,[272,1126,1127],{"class":633},"    if",[272,1129,888],{"class":964},[272,1131,573],{"class":644},[272,1133,1059],{"class":964},[272,1135,967],{"class":640},[272,1137,1139,1142,1144],{"class":274,"line":1138},29,[272,1140,1141],{"class":633},"      await",[272,1143,909],{"class":799},[272,1145,1146],{"class":964},"()\n",[272,1148,1150],{"class":274,"line":1149},30,[272,1151,1152],{"class":633},"      return\n",[272,1154,1156],{"class":274,"line":1155},31,[272,1157,1158],{"class":640},"    }\n",[272,1160,1162],{"class":274,"line":1161},32,[272,1163,753],{"emptyLinePlaceholder":752},[272,1165,1167,1170,1172,1174,1177,1179,1182,1184,1187,1189,1191,1193,1195,1197,1200,1202],{"class":274,"line":1166},33,[272,1168,1169],{"class":640},"    ;",[272,1171,860],{"class":964},[272,1173,891],{"class":644},[272,1175,1176],{"class":633}," as",[272,1178,645],{"class":278},[272,1180,1181],{"class":640}," &",[272,1183,641],{"class":640},[272,1185,1186],{"class":964}," log",[272,1188,867],{"class":640},[272,1190,678],{"class":278},[272,1192,654],{"class":640},[272,1194,478],{"class":964},[272,1196,981],{"class":640},[272,1198,1199],{"class":644},"log",[272,1201,768],{"class":640},[272,1203,1204],{"class":644}," logger\n",[272,1206,1208],{"class":274,"line":1207},34,[272,1209,753],{"emptyLinePlaceholder":752},[272,1211,1213,1216],{"class":274,"line":1212},35,[272,1214,1215],{"class":633},"    try",[272,1217,696],{"class":640},[272,1219,1221,1223,1225,1227,1230,1232,1234,1236,1238,1240,1242],{"class":274,"line":1220},36,[272,1222,1141],{"class":633},[272,1224,787],{"class":644},[272,1226,981],{"class":640},[272,1228,1229],{"class":799},"run",[272,1231,860],{"class":964},[272,1233,587],{"class":644},[272,1235,648],{"class":640},[272,1237,914],{"class":640},[272,1239,917],{"class":762},[272,1241,909],{"class":799},[272,1243,1244],{"class":964},"())\n",[272,1246,1248,1250,1252,1254,1257,1260,1262,1264,1266,1268,1270],{"class":274,"line":1247},37,[272,1249,1141],{"class":633},[272,1251,949],{"class":799},[272,1253,860],{"class":964},[272,1255,1256],{"class":640},"{",[272,1258,1259],{"class":964}," status",[272,1261,867],{"class":640},[272,1263,900],{"class":644},[272,1265,981],{"class":640},[272,1267,477],{"class":644},[272,1269,654],{"class":640},[272,1271,823],{"class":964},[272,1273,1275,1277,1280,1282,1285,1287],{"class":274,"line":1274},38,[272,1276,1114],{"class":640},[272,1278,1279],{"class":633}," catch",[272,1281,888],{"class":964},[272,1283,1284],{"class":644},"error",[272,1286,1059],{"class":964},[272,1288,967],{"class":640},[272,1290,1292,1294,1296,1298,1300,1303,1305,1307,1309,1312,1314],{"class":274,"line":1291},39,[272,1293,1141],{"class":633},[272,1295,949],{"class":799},[272,1297,860],{"class":964},[272,1299,1256],{"class":640},[272,1301,1302],{"class":964}," error",[272,1304,867],{"class":640},[272,1306,1302],{"class":644},[272,1308,1176],{"class":633},[272,1310,1311],{"class":278}," Error",[272,1313,654],{"class":640},[272,1315,823],{"class":964},[272,1317,1319,1322],{"class":274,"line":1318},40,[272,1320,1321],{"class":633},"      throw",[272,1323,1324],{"class":644}," error\n",[272,1326,1328],{"class":274,"line":1327},41,[272,1329,1158],{"class":640},[272,1331,1333],{"class":274,"line":1332},42,[272,1334,1335],{"class":640},"  }\n",[272,1337,1339],{"class":274,"line":1338},43,[272,1340,1341],{"class":640},"}\n",[234,1343,1344,1345,1348],{},"That's it. This middleware gets ",[249,1346,1347],{},"every feature"," for free: route filtering, drain adapters, enrichers, tail sampling, error capture, and duration tracking.",[254,1350,1352],{"id":1351},"key-rules","Key Rules",[539,1354,1355,1367,1387,1407,1425,1434,1443],{},[542,1356,1357,1362,1363,1366],{},[249,1358,1359,1360],{},"Always use ",[238,1361,612],{}," — never call ",[238,1364,1365],{},"createRequestLogger"," directly",[542,1368,1369,1372,1373,1376,1377,1379,1380,1383,1384,1386],{},[249,1370,1371],{},"Use the right header extractor"," — ",[238,1374,1375],{},"extractSafeHeaders"," for Web API ",[238,1378,428],{}," (Hono, Elysia, Deno), ",[238,1381,1382],{},"extractSafeNodeHeaders"," for Node.js ",[238,1385,442],{}," (Express, Fastify)",[542,1388,1389,1372,1392,1395,1396,362,1398,362,1400,362,1402,362,1404,1406],{},[249,1390,1391],{},"Spread user options",[238,1393,1394],{},"...options"," passes ",[238,1397,361],{},[238,1399,365],{},[238,1401,368],{},[238,1403,371],{},[238,1405,374],{}," to the pipeline automatically",[542,1408,1409,1416,1417,1420,1421,1424],{},[249,1410,1411,1412,1415],{},"Call ",[238,1413,1414],{},"finish()"," in both paths"," — success (",[238,1418,1419],{},"{ status }",") and error (",[238,1422,1423],{},"{ error }",") — it handles emit + enrich + drain",[542,1426,1427,1430,1431,1433],{},[249,1428,1429],{},"Re-throw errors"," after ",[238,1432,1414],{}," so framework error handlers still work",[542,1435,1436,1442],{},[249,1437,1438,1439],{},"Export ",[238,1440,1441],{},"useLogger()"," — consumers expect it for accessing the logger from service functions",[542,1444,1445,1448,1449,1451,1452,362,1454,362,1456],{},[249,1446,1447],{},"Export your options type"," extending ",[238,1450,355],{}," — for IDE completion on ",[238,1453,361],{},[238,1455,365],{},[238,1457,368],{},[254,1459,1461],{"id":1460},"usage","Usage",[234,1463,1464],{},"Once built, your integration is used like any other:",[262,1466,1468],{"className":623,"code":1467,"language":626,"meta":268,"style":268},"import { initLogger } from 'evlog'\nimport { evlog, useLogger } from '.\u002Fmy-framework-evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\ninitLogger({ env: { service: 'my-api' } })\n\napp.use(evlog({\n  include: ['\u002Fapi\u002F**'],\n  drain: createAxiomDrain(),\n  enrich: (ctx) => {\n    ctx.event.region = process.env.FLY_REGION\n  },\n  keep: (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n  },\n}))\n\napp.get('\u002Fapi\u002Fusers', (req, res) => {\n  req.log.set({ users: { count: 42 } })\n  res.json({ users: [] })\n})\n\n\u002F\u002F Access logger from anywhere in the call stack\nfunction findUsers() {\n  const log = useLogger()\n  log.set({ db: { query: 'SELECT * FROM users' } })\n}\n",[238,1469,1470,1489,1512,1532,1536,1570,1574,1592,1614,1627,1645,1675,1680,1697,1742,1746,1753,1757,1791,1830,1855,1861,1865,1871,1883,1896,1934],{"__ignoreMap":268},[272,1471,1472,1474,1476,1479,1481,1483,1485,1487],{"class":274,"line":275},[272,1473,634],{"class":633},[272,1475,641],{"class":640},[272,1477,1478],{"class":644}," initLogger",[272,1480,654],{"class":640},[272,1482,657],{"class":633},[272,1484,660],{"class":640},[272,1486,521],{"class":281},[272,1488,666],{"class":640},[272,1490,1491,1493,1495,1497,1499,1501,1503,1505,1507,1510],{"class":274,"line":669},[272,1492,634],{"class":633},[272,1494,641],{"class":640},[272,1496,857],{"class":644},[272,1498,648],{"class":640},[272,1500,838],{"class":644},[272,1502,654],{"class":640},[272,1504,657],{"class":633},[272,1506,660],{"class":640},[272,1508,1509],{"class":281},".\u002Fmy-framework-evlog",[272,1511,666],{"class":640},[272,1513,1514,1516,1518,1521,1523,1525,1527,1530],{"class":274,"line":691},[272,1515,634],{"class":633},[272,1517,641],{"class":640},[272,1519,1520],{"class":644}," createAxiomDrain",[272,1522,654],{"class":640},[272,1524,657],{"class":633},[272,1526,660],{"class":640},[272,1528,1529],{"class":281},"evlog\u002Faxiom",[272,1531,666],{"class":640},[272,1533,1534],{"class":274,"line":699},[272,1535,753],{"emptyLinePlaceholder":752},[272,1537,1538,1541,1543,1545,1548,1550,1552,1555,1557,1559,1562,1564,1566,1568],{"class":274,"line":708},[272,1539,1540],{"class":799},"initLogger",[272,1542,860],{"class":644},[272,1544,1256],{"class":640},[272,1546,1547],{"class":964}," env",[272,1549,867],{"class":640},[272,1551,641],{"class":640},[272,1553,1554],{"class":964}," service",[272,1556,867],{"class":640},[272,1558,660],{"class":640},[272,1560,1561],{"class":281},"my-api",[272,1563,815],{"class":640},[272,1565,654],{"class":640},[272,1567,654],{"class":640},[272,1569,823],{"class":644},[272,1571,1572],{"class":274,"line":716},[272,1573,753],{"emptyLinePlaceholder":752},[272,1575,1576,1579,1581,1584,1586,1588,1590],{"class":274,"line":724},[272,1577,1578],{"class":644},"app",[272,1580,981],{"class":640},[272,1582,1583],{"class":799},"use",[272,1585,860],{"class":644},[272,1587,521],{"class":799},[272,1589,860],{"class":644},[272,1591,967],{"class":640},[272,1593,1594,1597,1599,1602,1604,1607,1609,1612],{"class":274,"line":735},[272,1595,1596],{"class":964},"  include",[272,1598,867],{"class":640},[272,1600,1601],{"class":644}," [",[272,1603,815],{"class":640},[272,1605,1606],{"class":281},"\u002Fapi\u002F**",[272,1608,815],{"class":640},[272,1610,1611],{"class":644},"]",[272,1613,705],{"class":640},[272,1615,1616,1619,1621,1623,1625],{"class":274,"line":749},[272,1617,1618],{"class":964},"  drain",[272,1620,867],{"class":640},[272,1622,1520],{"class":799},[272,1624,1073],{"class":644},[272,1626,705],{"class":640},[272,1628,1629,1632,1634,1636,1639,1641,1643],{"class":274,"line":756},[272,1630,1631],{"class":799},"  enrich",[272,1633,867],{"class":640},[272,1635,888],{"class":640},[272,1637,1638],{"class":863},"ctx",[272,1640,478],{"class":640},[272,1642,917],{"class":762},[272,1644,696],{"class":640},[272,1646,1647,1650,1652,1655,1657,1660,1662,1665,1667,1670,1672],{"class":274,"line":774},[272,1648,1649],{"class":644},"    ctx",[272,1651,981],{"class":640},[272,1653,1654],{"class":644},"event",[272,1656,981],{"class":640},[272,1658,1659],{"class":644},"region",[272,1661,768],{"class":640},[272,1663,1664],{"class":644}," process",[272,1666,981],{"class":640},[272,1668,1669],{"class":644},"env",[272,1671,981],{"class":640},[272,1673,1674],{"class":644},"FLY_REGION\n",[272,1676,1677],{"class":274,"line":779},[272,1678,1679],{"class":640},"  },\n",[272,1681,1682,1685,1687,1689,1691,1693,1695],{"class":274,"line":806},[272,1683,1684],{"class":799},"  keep",[272,1686,867],{"class":640},[272,1688,888],{"class":640},[272,1690,1638],{"class":863},[272,1692,478],{"class":640},[272,1694,917],{"class":762},[272,1696,696],{"class":640},[272,1698,1699,1701,1703,1705,1707,1710,1713,1716,1718,1720,1723,1727,1729,1731,1733,1736,1738],{"class":274,"line":820},[272,1700,1127],{"class":633},[272,1702,888],{"class":964},[272,1704,1638],{"class":644},[272,1706,981],{"class":640},[272,1708,1709],{"class":644},"duration",[272,1711,1712],{"class":640}," &&",[272,1714,1715],{"class":644}," ctx",[272,1717,981],{"class":640},[272,1719,1709],{"class":644},[272,1721,1722],{"class":640}," >",[272,1724,1726],{"class":1725},"sbssI"," 2000",[272,1728,1059],{"class":964},[272,1730,1638],{"class":644},[272,1732,981],{"class":640},[272,1734,1735],{"class":644},"shouldKeep",[272,1737,768],{"class":640},[272,1739,1741],{"class":1740},"sfNiH"," true\n",[272,1743,1744],{"class":274,"line":826},[272,1745,1679],{"class":640},[272,1747,1748,1750],{"class":274,"line":831},[272,1749,738],{"class":640},[272,1751,1752],{"class":644},"))\n",[272,1754,1755],{"class":274,"line":844},[272,1756,753],{"emptyLinePlaceholder":752},[272,1758,1759,1761,1763,1766,1768,1770,1773,1775,1777,1779,1781,1783,1785,1787,1789],{"class":274,"line":849},[272,1760,1578],{"class":644},[272,1762,981],{"class":640},[272,1764,1765],{"class":799},"get",[272,1767,860],{"class":644},[272,1769,815],{"class":640},[272,1771,1772],{"class":281},"\u002Fapi\u002Fusers",[272,1774,815],{"class":640},[272,1776,648],{"class":640},[272,1778,888],{"class":640},[272,1780,891],{"class":863},[272,1782,648],{"class":640},[272,1784,900],{"class":863},[272,1786,478],{"class":640},[272,1788,917],{"class":762},[272,1790,696],{"class":640},[272,1792,1793,1796,1798,1800,1802,1805,1807,1809,1812,1814,1816,1819,1821,1824,1826,1828],{"class":274,"line":879},[272,1794,1795],{"class":644},"  req",[272,1797,981],{"class":640},[272,1799,1199],{"class":644},[272,1801,981],{"class":640},[272,1803,1804],{"class":799},"set",[272,1806,860],{"class":964},[272,1808,1256],{"class":640},[272,1810,1811],{"class":964}," users",[272,1813,867],{"class":640},[272,1815,641],{"class":640},[272,1817,1818],{"class":964}," count",[272,1820,867],{"class":640},[272,1822,1823],{"class":1725}," 42",[272,1825,654],{"class":640},[272,1827,654],{"class":640},[272,1829,823],{"class":964},[272,1831,1832,1835,1837,1840,1842,1844,1846,1848,1851,1853],{"class":274,"line":936},[272,1833,1834],{"class":644},"  res",[272,1836,981],{"class":640},[272,1838,1839],{"class":799},"json",[272,1841,860],{"class":964},[272,1843,1256],{"class":640},[272,1845,1811],{"class":964},[272,1847,867],{"class":640},[272,1849,1850],{"class":964}," [] ",[272,1852,738],{"class":640},[272,1854,823],{"class":964},[272,1856,1857,1859],{"class":274,"line":970},[272,1858,738],{"class":640},[272,1860,823],{"class":644},[272,1862,1863],{"class":274,"line":998},[272,1864,753],{"emptyLinePlaceholder":752},[272,1866,1867],{"class":274,"line":1024},[272,1868,1870],{"class":1869},"sHwdD","\u002F\u002F Access logger from anywhere in the call stack\n",[272,1872,1873,1876,1879,1881],{"class":274,"line":1078},[272,1874,1875],{"class":762},"function",[272,1877,1878],{"class":799}," findUsers",[272,1880,1073],{"class":640},[272,1882,696],{"class":640},[272,1884,1885,1888,1890,1892,1894],{"class":274,"line":1101},[272,1886,1887],{"class":762},"  const",[272,1889,1186],{"class":644},[272,1891,768],{"class":640},[272,1893,838],{"class":799},[272,1895,1146],{"class":964},[272,1897,1898,1901,1903,1905,1907,1909,1912,1914,1916,1919,1921,1923,1926,1928,1930,1932],{"class":274,"line":1111},[272,1899,1900],{"class":644},"  log",[272,1902,981],{"class":640},[272,1904,1804],{"class":799},[272,1906,860],{"class":964},[272,1908,1256],{"class":640},[272,1910,1911],{"class":964}," db",[272,1913,867],{"class":640},[272,1915,641],{"class":640},[272,1917,1918],{"class":964}," query",[272,1920,867],{"class":640},[272,1922,660],{"class":640},[272,1924,1925],{"class":281},"SELECT * FROM users",[272,1927,815],{"class":640},[272,1929,654],{"class":640},[272,1931,654],{"class":640},[272,1933,823],{"class":964},[272,1935,1936],{"class":274,"line":1119},[272,1937,1341],{"class":640},[254,1939,1941],{"id":1940},"reference-implementations","Reference Implementations",[234,1943,1944],{},"Study these built-in integrations for framework-specific patterns:",[320,1946,1947,1963],{},[323,1948,1949],{},[326,1950,1951,1954,1957,1960],{},[329,1952,1953],{},"Framework",[329,1955,1956],{},"Lines",[329,1958,1959],{},"Pattern",[329,1961,1962],{},"Source",[336,1964,1965,1988,2010,2036],{},[326,1966,1967,1969,1972,1979],{},[341,1968,76],{},[341,1970,1971],{},"~40",[341,1973,1974,1975,1978],{},"Web API Headers, ",[238,1976,1977],{},"c.set()",", try\u002Fcatch",[341,1980,1981],{},[1982,1983,1987],"a",{"href":1984,"rel":1985},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fhono\u002Findex.ts",[1986],"nofollow","hono\u002Findex.ts",[326,1989,1990,1992,1995,2003],{},[341,1991,71],{},[341,1993,1994],{},"~60",[341,1996,1997,1998,362,2000],{},"Node.js headers, ",[238,1999,591],{},[238,2001,2002],{},"res.on('finish')",[341,2004,2005],{},[1982,2006,2009],{"href":2007,"rel":2008},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fexpress\u002Findex.ts",[1986],"express\u002Findex.ts",[326,2011,2012,2014,2017,2029],{},[341,2013,86],{},[341,2015,2016],{},"~70",[341,2018,2019,2020,362,2023,1017,2026],{},"Plugin API, ",[238,2021,2022],{},"derive()",[238,2024,2025],{},"onAfterHandle",[238,2027,2028],{},"onError",[341,2030,2031],{},[1982,2032,2035],{"href":2033,"rel":2034},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Felysia\u002Findex.ts",[1986],"elysia\u002Findex.ts",[326,2037,2038,2040,2042,2055],{},[341,2039,81],{},[341,2041,2016],{},[341,2043,2044,2045,362,2048,1017,2051,2054],{},"Plugin, ",[238,2046,2047],{},"decorateRequest",[238,2049,2050],{},"onRequest",[238,2052,2053],{},"onResponse"," hooks",[341,2056,2057],{},[1982,2058,2061],{"href":2059,"rel":2060},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Ffastify\u002Findex.ts",[1986],"fastify\u002Findex.ts",[243,2063,2066,2067,2072],{"color":2064,"icon":2065},"neutral","i-lucide-heart","Built an integration for a framework we don't support? ",[1982,2068,2071],{"href":2069,"rel":2070},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fpulls",[1986],"Open a PR"," — the community will thank you.",[2074,2075,2076],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":268,"searchDepth":669,"depth":669,"links":2078},[2079,2080,2081,2082,2083,2084,2085],{"id":256,"depth":669,"text":257},{"id":317,"depth":669,"text":318},{"id":525,"depth":669,"text":526},{"id":616,"depth":669,"text":617},{"id":1351,"depth":669,"text":1352},{"id":1460,"depth":669,"text":1461},{"id":1940,"depth":669,"text":1941},"Build your own evlog framework integration using the toolkit API — createMiddlewareLogger, header extraction, AsyncLocalStorage, and the full drain\u002Fenrich\u002Fkeep pipeline.","md",null,{},{"title":106,"icon":109},{"title":106,"description":2086},"lIpor_hC8CH9HiO3m0PCCTI-058gmWm5GW4Z0_oAvbw",[2094,2096],{"title":101,"path":102,"stem":103,"description":2095,"icon":104,"children":-1},"Using evlog with Astro — wide events and structured errors in Astro server middleware.",{"title":116,"path":117,"stem":118,"description":2097,"icon":119,"children":-1},"Understand the full lifecycle of a request in evlog — from creation to drain. Every step from logger creation, context accumulation, sampling, enrichment, to external delivery.",1773428029410]