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