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