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