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