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