[{"data":1,"prerenderedAt":3031},["ShallowReactive",2],{"navigation_docs":3,"-adapters-custom":263,"-adapters-custom-surround":3026},[4,30,115,174,233,249],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Frameworks","\u002Fframeworks","2.frameworks",[35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Fframeworks\u002Foverview","2.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":41,"path":42,"stem":43,"icon":44},"Nuxt","\u002Fframeworks\u002Fnuxt","2.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":46,"path":47,"stem":48,"icon":49},"Next.js","\u002Fframeworks\u002Fnextjs","2.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":51,"path":52,"stem":53,"icon":54},"SvelteKit","\u002Fframeworks\u002Fsveltekit","2.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":56,"path":57,"stem":58,"icon":59},"Nitro","\u002Fframeworks\u002Fnitro","2.frameworks\u002F04.nitro","i-custom-nitro",{"title":61,"path":62,"stem":63,"icon":64},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","2.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":66,"path":67,"stem":68,"icon":69},"NestJS","\u002Fframeworks\u002Fnestjs","2.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":71,"path":72,"stem":73,"icon":74},"Express","\u002Fframeworks\u002Fexpress","2.frameworks\u002F07.express","i-simple-icons-express",{"title":76,"path":77,"stem":78,"icon":79},"Hono","\u002Fframeworks\u002Fhono","2.frameworks\u002F08.hono","i-simple-icons-hono",{"title":81,"path":82,"stem":83,"icon":84},"Fastify","\u002Fframeworks\u002Ffastify","2.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":86,"path":87,"stem":88,"icon":89},"Elysia","\u002Fframeworks\u002Felysia","2.frameworks\u002F10.elysia","i-custom-elysia",{"title":91,"path":92,"stem":93,"icon":94},"React Router","\u002Fframeworks\u002Freact-router","2.frameworks\u002F11.react-router","i-simple-icons-reactrouter",{"title":96,"path":97,"stem":98,"icon":99},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","2.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":101,"path":102,"stem":103,"icon":104},"Standalone","\u002Fframeworks\u002Fstandalone","2.frameworks\u002F13.standalone","i-simple-icons-typescript",{"title":106,"path":107,"stem":108,"icon":109},"Astro","\u002Fframeworks\u002Fastro","2.frameworks\u002F14.astro","i-simple-icons-astro",{"title":111,"path":112,"stem":113,"icon":114},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","2.frameworks\u002F15.custom-integration","i-lucide-puzzle",{"title":116,"path":117,"stem":118,"children":119,"page":29},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[120,125,130,135,140,145,150,154,159,164,169],{"title":121,"path":122,"stem":123,"icon":124},"Request Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":126,"path":127,"stem":128,"icon":129},"Wide Events","\u002Fcore-concepts\u002Fwide-events","3.core-concepts\u002F1.wide-events","i-lucide-layers",{"title":131,"path":132,"stem":133,"icon":134},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F10.vite-plugin","i-custom-vite",{"title":136,"path":137,"stem":138,"icon":139},"AI SDK Integration","\u002Fcore-concepts\u002Fai-sdk","3.core-concepts\u002F11.ai-sdk","i-simple-icons-vercel",{"title":141,"path":142,"stem":143,"icon":144},"Structured Errors","\u002Fcore-concepts\u002Fstructured-errors","3.core-concepts\u002F2.structured-errors","i-lucide-shield-alert",{"title":146,"path":147,"stem":148,"icon":149},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F3.best-practices","i-lucide-shield-check",{"title":151,"path":152,"stem":153,"icon":104},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F4.typed-fields",{"title":155,"path":156,"stem":157,"icon":158},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F5.sampling","i-lucide-filter",{"title":160,"path":161,"stem":162,"icon":163},"Client Logging","\u002Fcore-concepts\u002Fclient-logging","3.core-concepts\u002F6.client-logging","i-lucide-monitor",{"title":165,"path":166,"stem":167,"icon":168},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F7.configuration","i-lucide-settings",{"title":170,"path":171,"stem":172,"icon":173},"Performance","\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F8.performance","i-lucide-gauge",{"title":175,"path":176,"stem":177,"children":178,"page":29},"Adapters","\u002Fadapters","4.adapters",[179,183,188,193,198,203,208,213,218,223,228],{"title":36,"path":180,"stem":181,"icon":182},"\u002Fadapters\u002Foverview","4.adapters\u002F1.overview","i-custom-plug",{"title":184,"path":185,"stem":186,"icon":187},"Pipeline","\u002Fadapters\u002Fpipeline","4.adapters\u002F10.pipeline","i-lucide-workflow",{"title":189,"path":190,"stem":191,"icon":192},"Browser","\u002Fadapters\u002Fbrowser","4.adapters\u002F11.browser","i-lucide-globe",{"title":194,"path":195,"stem":196,"icon":197},"Axiom","\u002Fadapters\u002Faxiom","4.adapters\u002F2.axiom","i-custom-axiom",{"title":199,"path":200,"stem":201,"icon":202},"OTLP","\u002Fadapters\u002Fotlp","4.adapters\u002F3.otlp","i-simple-icons-opentelemetry",{"title":204,"path":205,"stem":206,"icon":207},"PostHog","\u002Fadapters\u002Fposthog","4.adapters\u002F4.posthog","i-simple-icons-posthog",{"title":209,"path":210,"stem":211,"icon":212},"Sentry","\u002Fadapters\u002Fsentry","4.adapters\u002F5.sentry","i-simple-icons-sentry",{"title":214,"path":215,"stem":216,"icon":217},"Better Stack","\u002Fadapters\u002Fbetter-stack","4.adapters\u002F6.better-stack","i-simple-icons-betterstack",{"title":219,"path":220,"stem":221,"icon":222},"File System","\u002Fadapters\u002Ffs","4.adapters\u002F7.fs","i-lucide-hard-drive",{"title":224,"path":225,"stem":226,"icon":227},"HyperDX","\u002Fadapters\u002Fhyperdx","4.adapters\u002F8.hyperdx","i-custom-hyperdx",{"title":229,"path":230,"stem":231,"icon":232},"Custom Adapters","\u002Fadapters\u002Fcustom","4.adapters\u002F9.custom","i-lucide-code",{"title":234,"path":235,"stem":236,"children":237,"page":29},"Enrichers","\u002Fenrichers","5.enrichers",[238,241,245],{"title":36,"path":239,"stem":240,"icon":28},"\u002Fenrichers\u002Foverview","5.enrichers\u002F1.overview",{"title":242,"path":243,"stem":244,"icon":114},"Built-in","\u002Fenrichers\u002Fbuilt-in","5.enrichers\u002F2.built-in",{"title":246,"path":247,"stem":248,"icon":232},"Custom","\u002Fenrichers\u002Fcustom","5.enrichers\u002F3.custom",{"title":250,"path":251,"stem":252,"children":253,"page":29},"NuxtHub","\u002Fnuxthub","6.nuxthub",[254,258],{"title":36,"path":255,"stem":256,"icon":257},"\u002Fnuxthub\u002Foverview","6.nuxthub\u002F1.overview","i-lucide-database",{"title":259,"path":260,"stem":261,"icon":262},"Retention","\u002Fnuxthub\u002Fretention","6.nuxthub\u002F2.retention","i-lucide-clock",{"id":264,"title":229,"body":265,"description":3015,"extension":3016,"links":3017,"meta":3022,"navigation":3023,"path":230,"seo":3024,"stem":231,"__hash__":3025},"docs\u002F4.adapters\u002F9.custom.md",{"type":266,"value":267,"toc":3004},"minimark",[268,277,282,288,498,501,737,741,1024,1028,1031,1634,1637,1684,1688,1691,1884,1888,1891,2035,2039,2042,2387,2391,2399,2619,2628,2632,2665,2970,2974,3000],[269,270,271,272,276],"p",{},"You can create custom adapters to send logs to any service or destination. An adapter is simply a function that receives a ",[273,274,275],"code",{},"DrainContext"," and sends the data somewhere.",[278,279,281],"h2",{"id":280},"basic-structure","Basic Structure",[269,283,284,285,287],{},"A drain is a function that receives a ",[273,286,275],{}," and sends data somewhere:",[289,290,296],"pre",{"className":291,"code":292,"filename":293,"language":294,"meta":295,"style":295},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { DrainContext } from 'evlog'\n\nconst drain = async (ctx: DrainContext) => {\n  await fetch('https:\u002F\u002Fyour-service.com\u002Flogs', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify(ctx.event),\n  })\n}\n","lib\u002Fmy-drain.ts","typescript","",[273,297,298,334,341,379,406,424,453,483,492],{"__ignoreMap":295},[299,300,303,307,310,314,318,321,324,327,331],"span",{"class":301,"line":302},"line",1,[299,304,306],{"class":305},"s7zQu","import",[299,308,309],{"class":305}," type",[299,311,313],{"class":312},"sMK4o"," {",[299,315,317],{"class":316},"sTEyZ"," DrainContext",[299,319,320],{"class":312}," }",[299,322,323],{"class":305}," from",[299,325,326],{"class":312}," '",[299,328,330],{"class":329},"sfazB","evlog",[299,332,333],{"class":312},"'\n",[299,335,337],{"class":301,"line":336},2,[299,338,340],{"emptyLinePlaceholder":339},true,"\n",[299,342,344,348,351,354,357,360,364,367,370,373,376],{"class":301,"line":343},3,[299,345,347],{"class":346},"spNyl","const",[299,349,350],{"class":316}," drain ",[299,352,353],{"class":312},"=",[299,355,356],{"class":346}," async",[299,358,359],{"class":312}," (",[299,361,363],{"class":362},"sHdIc","ctx",[299,365,366],{"class":312},":",[299,368,317],{"class":369},"sBMFI",[299,371,372],{"class":312},")",[299,374,375],{"class":346}," =>",[299,377,378],{"class":312}," {\n",[299,380,382,385,389,393,396,399,401,404],{"class":301,"line":381},4,[299,383,384],{"class":305},"  await",[299,386,388],{"class":387},"s2Zo4"," fetch",[299,390,392],{"class":391},"swJcz","(",[299,394,395],{"class":312},"'",[299,397,398],{"class":329},"https:\u002F\u002Fyour-service.com\u002Flogs",[299,400,395],{"class":312},[299,402,403],{"class":312},",",[299,405,378],{"class":312},[299,407,409,412,414,416,419,421],{"class":301,"line":408},5,[299,410,411],{"class":391},"    method",[299,413,366],{"class":312},[299,415,326],{"class":312},[299,417,418],{"class":329},"POST",[299,420,395],{"class":312},[299,422,423],{"class":312},",\n",[299,425,427,430,432,434,436,439,441,443,445,448,450],{"class":301,"line":426},6,[299,428,429],{"class":391},"    headers",[299,431,366],{"class":312},[299,433,313],{"class":312},[299,435,326],{"class":312},[299,437,438],{"class":391},"Content-Type",[299,440,395],{"class":312},[299,442,366],{"class":312},[299,444,326],{"class":312},[299,446,447],{"class":329},"application\u002Fjson",[299,449,395],{"class":312},[299,451,452],{"class":312}," },\n",[299,454,456,459,461,464,467,470,472,474,476,479,481],{"class":301,"line":455},7,[299,457,458],{"class":391},"    body",[299,460,366],{"class":312},[299,462,463],{"class":316}," JSON",[299,465,466],{"class":312},".",[299,468,469],{"class":387},"stringify",[299,471,392],{"class":391},[299,473,363],{"class":316},[299,475,466],{"class":312},[299,477,478],{"class":316},"event",[299,480,372],{"class":391},[299,482,423],{"class":312},[299,484,486,489],{"class":301,"line":485},8,[299,487,488],{"class":312},"  }",[299,490,491],{"class":391},")\n",[299,493,495],{"class":301,"line":494},9,[299,496,497],{"class":312},"}\n",[269,499,500],{},"Then wire it to your framework:",[502,503,504,578,609,635,666,692,717],"code-group",{},[289,505,508],{"className":291,"code":506,"filename":507,"language":294,"meta":295,"style":295},"\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', drain)\n})\n","Nuxt \u002F Nitro",[273,509,510,516,540,571],{"__ignoreMap":295},[299,511,512],{"class":301,"line":302},[299,513,515],{"class":514},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[299,517,518,521,524,527,529,531,534,536,538],{"class":301,"line":336},[299,519,520],{"class":305},"export",[299,522,523],{"class":305}," default",[299,525,526],{"class":387}," defineNitroPlugin",[299,528,392],{"class":316},[299,530,392],{"class":312},[299,532,533],{"class":362},"nitroApp",[299,535,372],{"class":312},[299,537,375],{"class":346},[299,539,378],{"class":312},[299,541,542,545,547,550,552,555,557,559,562,564,566,569],{"class":301,"line":343},[299,543,544],{"class":316},"  nitroApp",[299,546,466],{"class":312},[299,548,549],{"class":316},"hooks",[299,551,466],{"class":312},[299,553,554],{"class":387},"hook",[299,556,392],{"class":391},[299,558,395],{"class":312},[299,560,561],{"class":329},"evlog:drain",[299,563,395],{"class":312},[299,565,403],{"class":312},[299,567,568],{"class":316}," drain",[299,570,491],{"class":391},[299,572,573,576],{"class":301,"line":381},[299,574,575],{"class":312},"}",[299,577,491],{"class":316},[289,579,581],{"className":291,"code":580,"filename":76,"language":294,"meta":295,"style":295},"app.use(evlog({ drain }))\n",[273,582,583],{"__ignoreMap":295},[299,584,585,588,590,593,595,597,599,602,604,606],{"class":301,"line":302},[299,586,587],{"class":316},"app",[299,589,466],{"class":312},[299,591,592],{"class":387},"use",[299,594,392],{"class":316},[299,596,330],{"class":387},[299,598,392],{"class":316},[299,600,601],{"class":312},"{",[299,603,350],{"class":316},[299,605,575],{"class":312},[299,607,608],{"class":316},"))\n",[289,610,611],{"className":291,"code":580,"filename":71,"language":294,"meta":295,"style":295},[273,612,613],{"__ignoreMap":295},[299,614,615,617,619,621,623,625,627,629,631,633],{"class":301,"line":302},[299,616,587],{"class":316},[299,618,466],{"class":312},[299,620,592],{"class":387},[299,622,392],{"class":316},[299,624,330],{"class":387},[299,626,392],{"class":316},[299,628,601],{"class":312},[299,630,350],{"class":316},[299,632,575],{"class":312},[299,634,608],{"class":316},[289,636,638],{"className":291,"code":637,"filename":81,"language":294,"meta":295,"style":295},"await app.register(evlog, { drain })\n",[273,639,640],{"__ignoreMap":295},[299,641,642,645,648,650,653,656,658,660,662,664],{"class":301,"line":302},[299,643,644],{"class":305},"await",[299,646,647],{"class":316}," app",[299,649,466],{"class":312},[299,651,652],{"class":387},"register",[299,654,655],{"class":316},"(evlog",[299,657,403],{"class":312},[299,659,313],{"class":312},[299,661,350],{"class":316},[299,663,575],{"class":312},[299,665,491],{"class":316},[289,667,668],{"className":291,"code":580,"filename":86,"language":294,"meta":295,"style":295},[273,669,670],{"__ignoreMap":295},[299,671,672,674,676,678,680,682,684,686,688,690],{"class":301,"line":302},[299,673,587],{"class":316},[299,675,466],{"class":312},[299,677,592],{"class":387},[299,679,392],{"class":316},[299,681,330],{"class":387},[299,683,392],{"class":316},[299,685,601],{"class":312},[299,687,350],{"class":316},[299,689,575],{"class":312},[299,691,608],{"class":316},[289,693,695],{"className":291,"code":694,"filename":66,"language":294,"meta":295,"style":295},"EvlogModule.forRoot({ drain })\n",[273,696,697],{"__ignoreMap":295},[299,698,699,702,704,707,709,711,713,715],{"class":301,"line":302},[299,700,701],{"class":316},"EvlogModule",[299,703,466],{"class":312},[299,705,706],{"class":387},"forRoot",[299,708,392],{"class":316},[299,710,601],{"class":312},[299,712,350],{"class":316},[299,714,575],{"class":312},[299,716,491],{"class":316},[289,718,720],{"className":291,"code":719,"filename":101,"language":294,"meta":295,"style":295},"initLogger({ drain })\n",[273,721,722],{"__ignoreMap":295},[299,723,724,727,729,731,733,735],{"class":301,"line":302},[299,725,726],{"class":387},"initLogger",[299,728,392],{"class":316},[299,730,601],{"class":312},[299,732,350],{"class":316},[299,734,575],{"class":312},[299,736,491],{"class":316},[278,738,740],{"id":739},"draincontext-reference","DrainContext Reference",[289,742,745],{"className":291,"code":743,"filename":744,"language":294,"meta":295,"style":295},"interface DrainContext {\n  \u002F** The complete wide event with all accumulated context *\u002F\n  event: WideEvent\n\n  \u002F** Request metadata *\u002F\n  request?: {\n    method: string\n    path: string\n    requestId: string\n  }\n\n  \u002F** Safe HTTP headers (sensitive headers filtered) *\u002F\n  headers?: Record\u003Cstring, string>\n}\n\ninterface WideEvent {\n  timestamp: string\n  level: 'debug' | 'info' | 'warn' | 'error'\n  service: string\n  environment?: string\n  version?: string\n  region?: string\n  commitHash?: string\n  requestId?: string\n  \u002F\u002F ... plus all fields added via log.set()\n  [key: string]: unknown\n}\n","types.ts",[273,746,747,756,761,771,775,780,790,799,808,817,823,828,834,859,864,869,879,889,932,942,952,962,972,982,992,998,1019],{"__ignoreMap":295},[299,748,749,752,754],{"class":301,"line":302},[299,750,751],{"class":346},"interface",[299,753,317],{"class":369},[299,755,378],{"class":312},[299,757,758],{"class":301,"line":336},[299,759,760],{"class":514},"  \u002F** The complete wide event with all accumulated context *\u002F\n",[299,762,763,766,768],{"class":301,"line":343},[299,764,765],{"class":391},"  event",[299,767,366],{"class":312},[299,769,770],{"class":369}," WideEvent\n",[299,772,773],{"class":301,"line":381},[299,774,340],{"emptyLinePlaceholder":339},[299,776,777],{"class":301,"line":408},[299,778,779],{"class":514},"  \u002F** Request metadata *\u002F\n",[299,781,782,785,788],{"class":301,"line":426},[299,783,784],{"class":391},"  request",[299,786,787],{"class":312},"?:",[299,789,378],{"class":312},[299,791,792,794,796],{"class":301,"line":455},[299,793,411],{"class":391},[299,795,366],{"class":312},[299,797,798],{"class":369}," string\n",[299,800,801,804,806],{"class":301,"line":485},[299,802,803],{"class":391},"    path",[299,805,366],{"class":312},[299,807,798],{"class":369},[299,809,810,813,815],{"class":301,"line":494},[299,811,812],{"class":391},"    requestId",[299,814,366],{"class":312},[299,816,798],{"class":369},[299,818,820],{"class":301,"line":819},10,[299,821,822],{"class":312},"  }\n",[299,824,826],{"class":301,"line":825},11,[299,827,340],{"emptyLinePlaceholder":339},[299,829,831],{"class":301,"line":830},12,[299,832,833],{"class":514},"  \u002F** Safe HTTP headers (sensitive headers filtered) *\u002F\n",[299,835,837,840,842,845,848,851,853,856],{"class":301,"line":836},13,[299,838,839],{"class":391},"  headers",[299,841,787],{"class":312},[299,843,844],{"class":369}," Record",[299,846,847],{"class":312},"\u003C",[299,849,850],{"class":369},"string",[299,852,403],{"class":312},[299,854,855],{"class":369}," string",[299,857,858],{"class":312},">\n",[299,860,862],{"class":301,"line":861},14,[299,863,497],{"class":312},[299,865,867],{"class":301,"line":866},15,[299,868,340],{"emptyLinePlaceholder":339},[299,870,872,874,877],{"class":301,"line":871},16,[299,873,751],{"class":346},[299,875,876],{"class":369}," WideEvent",[299,878,378],{"class":312},[299,880,882,885,887],{"class":301,"line":881},17,[299,883,884],{"class":391},"  timestamp",[299,886,366],{"class":312},[299,888,798],{"class":369},[299,890,892,895,897,899,902,904,907,909,912,914,916,918,921,923,925,927,930],{"class":301,"line":891},18,[299,893,894],{"class":391},"  level",[299,896,366],{"class":312},[299,898,326],{"class":312},[299,900,901],{"class":329},"debug",[299,903,395],{"class":312},[299,905,906],{"class":312}," |",[299,908,326],{"class":312},[299,910,911],{"class":329},"info",[299,913,395],{"class":312},[299,915,906],{"class":312},[299,917,326],{"class":312},[299,919,920],{"class":329},"warn",[299,922,395],{"class":312},[299,924,906],{"class":312},[299,926,326],{"class":312},[299,928,929],{"class":329},"error",[299,931,333],{"class":312},[299,933,935,938,940],{"class":301,"line":934},19,[299,936,937],{"class":391},"  service",[299,939,366],{"class":312},[299,941,798],{"class":369},[299,943,945,948,950],{"class":301,"line":944},20,[299,946,947],{"class":391},"  environment",[299,949,787],{"class":312},[299,951,798],{"class":369},[299,953,955,958,960],{"class":301,"line":954},21,[299,956,957],{"class":391},"  version",[299,959,787],{"class":312},[299,961,798],{"class":369},[299,963,965,968,970],{"class":301,"line":964},22,[299,966,967],{"class":391},"  region",[299,969,787],{"class":312},[299,971,798],{"class":369},[299,973,975,978,980],{"class":301,"line":974},23,[299,976,977],{"class":391},"  commitHash",[299,979,787],{"class":312},[299,981,798],{"class":369},[299,983,985,988,990],{"class":301,"line":984},24,[299,986,987],{"class":391},"  requestId",[299,989,787],{"class":312},[299,991,798],{"class":369},[299,993,995],{"class":301,"line":994},25,[299,996,997],{"class":514},"  \u002F\u002F ... plus all fields added via log.set()\n",[299,999,1001,1004,1007,1009,1011,1014,1016],{"class":301,"line":1000},26,[299,1002,1003],{"class":316},"  [",[299,1005,1006],{"class":362},"key",[299,1008,366],{"class":312},[299,1010,855],{"class":369},[299,1012,1013],{"class":316},"]",[299,1015,366],{"class":312},[299,1017,1018],{"class":369}," unknown\n",[299,1020,1022],{"class":301,"line":1021},27,[299,1023,497],{"class":312},[278,1025,1027],{"id":1026},"factory-pattern","Factory Pattern",[269,1029,1030],{},"For reusable adapters, use the factory pattern:",[289,1032,1035],{"className":291,"code":1033,"filename":1034,"language":294,"meta":295,"style":295},"import type { DrainContext } from 'evlog'\n\nexport interface MyAdapterConfig {\n  apiKey: string\n  endpoint?: string\n  timeout?: number\n}\n\nexport function createMyAdapter(config: MyAdapterConfig) {\n  const endpoint = config.endpoint ?? 'https:\u002F\u002Fapi.myservice.com\u002Fingest'\n  const timeout = config.timeout ?? 5000\n\n  return async (ctx: DrainContext) => {\n    const controller = new AbortController()\n    const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n    try {\n      const response = await fetch(endpoint, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application\u002Fjson',\n          'X-API-Key': config.apiKey,\n        },\n        body: JSON.stringify(ctx.event),\n        signal: controller.signal,\n      })\n\n      if (!response.ok) {\n        console.error(`[my-adapter] Failed: ${response.status}`)\n      }\n    } catch (error) {\n      if (error instanceof Error && error.name === 'AbortError') {\n        console.error('[my-adapter] Request timed out')\n      } else {\n        console.error('[my-adapter] Error:', error)\n      }\n    } finally {\n      clearTimeout(timeoutId)\n    }\n  }\n}\n","lib\u002Fmy-adapter.ts",[273,1036,1037,1057,1061,1073,1082,1091,1101,1105,1109,1132,1161,1183,1187,1208,1227,1261,1265,1272,1295,1310,1319,1338,1358,1363,1388,1404,1411,1415,1440,1473,1479,1496,1536,1556,1566,1590,1595,1605,1618,1624,1629],{"__ignoreMap":295},[299,1038,1039,1041,1043,1045,1047,1049,1051,1053,1055],{"class":301,"line":302},[299,1040,306],{"class":305},[299,1042,309],{"class":305},[299,1044,313],{"class":312},[299,1046,317],{"class":316},[299,1048,320],{"class":312},[299,1050,323],{"class":305},[299,1052,326],{"class":312},[299,1054,330],{"class":329},[299,1056,333],{"class":312},[299,1058,1059],{"class":301,"line":336},[299,1060,340],{"emptyLinePlaceholder":339},[299,1062,1063,1065,1068,1071],{"class":301,"line":343},[299,1064,520],{"class":305},[299,1066,1067],{"class":346}," interface",[299,1069,1070],{"class":369}," MyAdapterConfig",[299,1072,378],{"class":312},[299,1074,1075,1078,1080],{"class":301,"line":381},[299,1076,1077],{"class":391},"  apiKey",[299,1079,366],{"class":312},[299,1081,798],{"class":369},[299,1083,1084,1087,1089],{"class":301,"line":408},[299,1085,1086],{"class":391},"  endpoint",[299,1088,787],{"class":312},[299,1090,798],{"class":369},[299,1092,1093,1096,1098],{"class":301,"line":426},[299,1094,1095],{"class":391},"  timeout",[299,1097,787],{"class":312},[299,1099,1100],{"class":369}," number\n",[299,1102,1103],{"class":301,"line":455},[299,1104,497],{"class":312},[299,1106,1107],{"class":301,"line":485},[299,1108,340],{"emptyLinePlaceholder":339},[299,1110,1111,1113,1116,1119,1121,1124,1126,1128,1130],{"class":301,"line":494},[299,1112,520],{"class":305},[299,1114,1115],{"class":346}," function",[299,1117,1118],{"class":387}," createMyAdapter",[299,1120,392],{"class":312},[299,1122,1123],{"class":362},"config",[299,1125,366],{"class":312},[299,1127,1070],{"class":369},[299,1129,372],{"class":312},[299,1131,378],{"class":312},[299,1133,1134,1137,1140,1143,1146,1148,1151,1154,1156,1159],{"class":301,"line":819},[299,1135,1136],{"class":346},"  const",[299,1138,1139],{"class":316}," endpoint",[299,1141,1142],{"class":312}," =",[299,1144,1145],{"class":316}," config",[299,1147,466],{"class":312},[299,1149,1150],{"class":316},"endpoint",[299,1152,1153],{"class":312}," ??",[299,1155,326],{"class":312},[299,1157,1158],{"class":329},"https:\u002F\u002Fapi.myservice.com\u002Fingest",[299,1160,333],{"class":312},[299,1162,1163,1165,1168,1170,1172,1174,1177,1179],{"class":301,"line":825},[299,1164,1136],{"class":346},[299,1166,1167],{"class":316}," timeout",[299,1169,1142],{"class":312},[299,1171,1145],{"class":316},[299,1173,466],{"class":312},[299,1175,1176],{"class":316},"timeout",[299,1178,1153],{"class":312},[299,1180,1182],{"class":1181},"sbssI"," 5000\n",[299,1184,1185],{"class":301,"line":830},[299,1186,340],{"emptyLinePlaceholder":339},[299,1188,1189,1192,1194,1196,1198,1200,1202,1204,1206],{"class":301,"line":836},[299,1190,1191],{"class":305},"  return",[299,1193,356],{"class":346},[299,1195,359],{"class":312},[299,1197,363],{"class":362},[299,1199,366],{"class":312},[299,1201,317],{"class":369},[299,1203,372],{"class":312},[299,1205,375],{"class":346},[299,1207,378],{"class":312},[299,1209,1210,1213,1216,1218,1221,1224],{"class":301,"line":861},[299,1211,1212],{"class":346},"    const",[299,1214,1215],{"class":316}," controller",[299,1217,1142],{"class":312},[299,1219,1220],{"class":312}," new",[299,1222,1223],{"class":387}," AbortController",[299,1225,1226],{"class":391},"()\n",[299,1228,1229,1231,1234,1236,1239,1241,1244,1246,1248,1250,1253,1255,1257,1259],{"class":301,"line":866},[299,1230,1212],{"class":346},[299,1232,1233],{"class":316}," timeoutId",[299,1235,1142],{"class":312},[299,1237,1238],{"class":387}," setTimeout",[299,1240,392],{"class":391},[299,1242,1243],{"class":312},"()",[299,1245,375],{"class":346},[299,1247,1215],{"class":316},[299,1249,466],{"class":312},[299,1251,1252],{"class":387},"abort",[299,1254,1243],{"class":391},[299,1256,403],{"class":312},[299,1258,1167],{"class":316},[299,1260,491],{"class":391},[299,1262,1263],{"class":301,"line":871},[299,1264,340],{"emptyLinePlaceholder":339},[299,1266,1267,1270],{"class":301,"line":881},[299,1268,1269],{"class":305},"    try",[299,1271,378],{"class":312},[299,1273,1274,1277,1280,1282,1285,1287,1289,1291,1293],{"class":301,"line":891},[299,1275,1276],{"class":346},"      const",[299,1278,1279],{"class":316}," response",[299,1281,1142],{"class":312},[299,1283,1284],{"class":305}," await",[299,1286,388],{"class":387},[299,1288,392],{"class":391},[299,1290,1150],{"class":316},[299,1292,403],{"class":312},[299,1294,378],{"class":312},[299,1296,1297,1300,1302,1304,1306,1308],{"class":301,"line":934},[299,1298,1299],{"class":391},"        method",[299,1301,366],{"class":312},[299,1303,326],{"class":312},[299,1305,418],{"class":329},[299,1307,395],{"class":312},[299,1309,423],{"class":312},[299,1311,1312,1315,1317],{"class":301,"line":944},[299,1313,1314],{"class":391},"        headers",[299,1316,366],{"class":312},[299,1318,378],{"class":312},[299,1320,1321,1324,1326,1328,1330,1332,1334,1336],{"class":301,"line":954},[299,1322,1323],{"class":312},"          '",[299,1325,438],{"class":391},[299,1327,395],{"class":312},[299,1329,366],{"class":312},[299,1331,326],{"class":312},[299,1333,447],{"class":329},[299,1335,395],{"class":312},[299,1337,423],{"class":312},[299,1339,1340,1342,1345,1347,1349,1351,1353,1356],{"class":301,"line":964},[299,1341,1323],{"class":312},[299,1343,1344],{"class":391},"X-API-Key",[299,1346,395],{"class":312},[299,1348,366],{"class":312},[299,1350,1145],{"class":316},[299,1352,466],{"class":312},[299,1354,1355],{"class":316},"apiKey",[299,1357,423],{"class":312},[299,1359,1360],{"class":301,"line":974},[299,1361,1362],{"class":312},"        },\n",[299,1364,1365,1368,1370,1372,1374,1376,1378,1380,1382,1384,1386],{"class":301,"line":984},[299,1366,1367],{"class":391},"        body",[299,1369,366],{"class":312},[299,1371,463],{"class":316},[299,1373,466],{"class":312},[299,1375,469],{"class":387},[299,1377,392],{"class":391},[299,1379,363],{"class":316},[299,1381,466],{"class":312},[299,1383,478],{"class":316},[299,1385,372],{"class":391},[299,1387,423],{"class":312},[299,1389,1390,1393,1395,1397,1399,1402],{"class":301,"line":994},[299,1391,1392],{"class":391},"        signal",[299,1394,366],{"class":312},[299,1396,1215],{"class":316},[299,1398,466],{"class":312},[299,1400,1401],{"class":316},"signal",[299,1403,423],{"class":312},[299,1405,1406,1409],{"class":301,"line":1000},[299,1407,1408],{"class":312},"      }",[299,1410,491],{"class":391},[299,1412,1413],{"class":301,"line":1021},[299,1414,340],{"emptyLinePlaceholder":339},[299,1416,1418,1421,1423,1426,1429,1431,1434,1437],{"class":301,"line":1417},28,[299,1419,1420],{"class":305},"      if",[299,1422,359],{"class":391},[299,1424,1425],{"class":312},"!",[299,1427,1428],{"class":316},"response",[299,1430,466],{"class":312},[299,1432,1433],{"class":316},"ok",[299,1435,1436],{"class":391},") ",[299,1438,1439],{"class":312},"{\n",[299,1441,1443,1446,1448,1450,1452,1455,1458,1461,1463,1465,1468,1471],{"class":301,"line":1442},29,[299,1444,1445],{"class":316},"        console",[299,1447,466],{"class":312},[299,1449,929],{"class":387},[299,1451,392],{"class":391},[299,1453,1454],{"class":312},"`",[299,1456,1457],{"class":329},"[my-adapter] Failed: ",[299,1459,1460],{"class":312},"${",[299,1462,1428],{"class":316},[299,1464,466],{"class":312},[299,1466,1467],{"class":316},"status",[299,1469,1470],{"class":312},"}`",[299,1472,491],{"class":391},[299,1474,1476],{"class":301,"line":1475},30,[299,1477,1478],{"class":312},"      }\n",[299,1480,1482,1485,1488,1490,1492,1494],{"class":301,"line":1481},31,[299,1483,1484],{"class":312},"    }",[299,1486,1487],{"class":305}," catch",[299,1489,359],{"class":391},[299,1491,929],{"class":316},[299,1493,1436],{"class":391},[299,1495,1439],{"class":312},[299,1497,1499,1501,1503,1505,1508,1511,1514,1517,1519,1522,1525,1527,1530,1532,1534],{"class":301,"line":1498},32,[299,1500,1420],{"class":305},[299,1502,359],{"class":391},[299,1504,929],{"class":316},[299,1506,1507],{"class":312}," instanceof",[299,1509,1510],{"class":369}," Error",[299,1512,1513],{"class":312}," &&",[299,1515,1516],{"class":316}," error",[299,1518,466],{"class":312},[299,1520,1521],{"class":316},"name",[299,1523,1524],{"class":312}," ===",[299,1526,326],{"class":312},[299,1528,1529],{"class":329},"AbortError",[299,1531,395],{"class":312},[299,1533,1436],{"class":391},[299,1535,1439],{"class":312},[299,1537,1539,1541,1543,1545,1547,1549,1552,1554],{"class":301,"line":1538},33,[299,1540,1445],{"class":316},[299,1542,466],{"class":312},[299,1544,929],{"class":387},[299,1546,392],{"class":391},[299,1548,395],{"class":312},[299,1550,1551],{"class":329},"[my-adapter] Request timed out",[299,1553,395],{"class":312},[299,1555,491],{"class":391},[299,1557,1559,1561,1564],{"class":301,"line":1558},34,[299,1560,1408],{"class":312},[299,1562,1563],{"class":305}," else",[299,1565,378],{"class":312},[299,1567,1569,1571,1573,1575,1577,1579,1582,1584,1586,1588],{"class":301,"line":1568},35,[299,1570,1445],{"class":316},[299,1572,466],{"class":312},[299,1574,929],{"class":387},[299,1576,392],{"class":391},[299,1578,395],{"class":312},[299,1580,1581],{"class":329},"[my-adapter] Error:",[299,1583,395],{"class":312},[299,1585,403],{"class":312},[299,1587,1516],{"class":316},[299,1589,491],{"class":391},[299,1591,1593],{"class":301,"line":1592},36,[299,1594,1478],{"class":312},[299,1596,1598,1600,1603],{"class":301,"line":1597},37,[299,1599,1484],{"class":312},[299,1601,1602],{"class":305}," finally",[299,1604,378],{"class":312},[299,1606,1608,1611,1613,1616],{"class":301,"line":1607},38,[299,1609,1610],{"class":387},"      clearTimeout",[299,1612,392],{"class":391},[299,1614,1615],{"class":316},"timeoutId",[299,1617,491],{"class":391},[299,1619,1621],{"class":301,"line":1620},39,[299,1622,1623],{"class":312},"    }\n",[299,1625,1627],{"class":301,"line":1626},40,[299,1628,822],{"class":312},[299,1630,1632],{"class":301,"line":1631},41,[299,1633,497],{"class":312},[269,1635,1636],{},"Then pass the adapter to your framework like any other drain:",[289,1638,1640],{"className":291,"code":1639,"language":294,"meta":295,"style":295},"const drain = createMyAdapter({\n  apiKey: process.env.MY_SERVICE_API_KEY!,\n})\n",[273,1641,1642,1656,1678],{"__ignoreMap":295},[299,1643,1644,1646,1648,1650,1652,1654],{"class":301,"line":302},[299,1645,347],{"class":346},[299,1647,350],{"class":316},[299,1649,353],{"class":312},[299,1651,1118],{"class":387},[299,1653,392],{"class":316},[299,1655,1439],{"class":312},[299,1657,1658,1660,1662,1665,1667,1670,1672,1675],{"class":301,"line":336},[299,1659,1077],{"class":391},[299,1661,366],{"class":312},[299,1663,1664],{"class":316}," process",[299,1666,466],{"class":312},[299,1668,1669],{"class":316},"env",[299,1671,466],{"class":312},[299,1673,1674],{"class":316},"MY_SERVICE_API_KEY",[299,1676,1677],{"class":312},"!,\n",[299,1679,1680,1682],{"class":301,"line":343},[299,1681,575],{"class":312},[299,1683,491],{"class":316},[278,1685,1687],{"id":1686},"reading-configuration","Reading Configuration",[269,1689,1690],{},"The recommended pattern is: overrides > environment variables. If you also need Nuxt\u002FNitro runtimeConfig support, add it as a fallback:",[289,1692,1694],{"className":291,"code":1693,"filename":1034,"language":294,"meta":295,"style":295},"export function createMyAdapter(overrides?: Partial\u003CMyAdapterConfig>) {\n  return async (ctx: DrainContext) => {\n    const config = {\n      apiKey: overrides?.apiKey ?? process.env.MY_SERVICE_API_KEY,\n      endpoint: overrides?.endpoint ?? process.env.MY_SERVICE_ENDPOINT,\n    }\n\n    if (!config.apiKey) {\n      console.error('[my-adapter] Missing API key')\n      return\n    }\n\n    \u002F\u002F Send the event...\n  }\n}\n",[273,1695,1696,1724,1744,1754,1783,1811,1815,1819,1838,1858,1863,1867,1871,1876,1880],{"__ignoreMap":295},[299,1697,1698,1700,1702,1704,1706,1709,1711,1714,1716,1719,1722],{"class":301,"line":302},[299,1699,520],{"class":305},[299,1701,1115],{"class":346},[299,1703,1118],{"class":387},[299,1705,392],{"class":312},[299,1707,1708],{"class":362},"overrides",[299,1710,787],{"class":312},[299,1712,1713],{"class":369}," Partial",[299,1715,847],{"class":312},[299,1717,1718],{"class":369},"MyAdapterConfig",[299,1720,1721],{"class":312},">)",[299,1723,378],{"class":312},[299,1725,1726,1728,1730,1732,1734,1736,1738,1740,1742],{"class":301,"line":336},[299,1727,1191],{"class":305},[299,1729,356],{"class":346},[299,1731,359],{"class":312},[299,1733,363],{"class":362},[299,1735,366],{"class":312},[299,1737,317],{"class":369},[299,1739,372],{"class":312},[299,1741,375],{"class":346},[299,1743,378],{"class":312},[299,1745,1746,1748,1750,1752],{"class":301,"line":343},[299,1747,1212],{"class":346},[299,1749,1145],{"class":316},[299,1751,1142],{"class":312},[299,1753,378],{"class":312},[299,1755,1756,1759,1761,1764,1767,1769,1771,1773,1775,1777,1779,1781],{"class":301,"line":381},[299,1757,1758],{"class":391},"      apiKey",[299,1760,366],{"class":312},[299,1762,1763],{"class":316}," overrides",[299,1765,1766],{"class":312},"?.",[299,1768,1355],{"class":316},[299,1770,1153],{"class":312},[299,1772,1664],{"class":316},[299,1774,466],{"class":312},[299,1776,1669],{"class":316},[299,1778,466],{"class":312},[299,1780,1674],{"class":316},[299,1782,423],{"class":312},[299,1784,1785,1788,1790,1792,1794,1796,1798,1800,1802,1804,1806,1809],{"class":301,"line":408},[299,1786,1787],{"class":391},"      endpoint",[299,1789,366],{"class":312},[299,1791,1763],{"class":316},[299,1793,1766],{"class":312},[299,1795,1150],{"class":316},[299,1797,1153],{"class":312},[299,1799,1664],{"class":316},[299,1801,466],{"class":312},[299,1803,1669],{"class":316},[299,1805,466],{"class":312},[299,1807,1808],{"class":316},"MY_SERVICE_ENDPOINT",[299,1810,423],{"class":312},[299,1812,1813],{"class":301,"line":426},[299,1814,1623],{"class":312},[299,1816,1817],{"class":301,"line":455},[299,1818,340],{"emptyLinePlaceholder":339},[299,1820,1821,1824,1826,1828,1830,1832,1834,1836],{"class":301,"line":485},[299,1822,1823],{"class":305},"    if",[299,1825,359],{"class":391},[299,1827,1425],{"class":312},[299,1829,1123],{"class":316},[299,1831,466],{"class":312},[299,1833,1355],{"class":316},[299,1835,1436],{"class":391},[299,1837,1439],{"class":312},[299,1839,1840,1843,1845,1847,1849,1851,1854,1856],{"class":301,"line":494},[299,1841,1842],{"class":316},"      console",[299,1844,466],{"class":312},[299,1846,929],{"class":387},[299,1848,392],{"class":391},[299,1850,395],{"class":312},[299,1852,1853],{"class":329},"[my-adapter] Missing API key",[299,1855,395],{"class":312},[299,1857,491],{"class":391},[299,1859,1860],{"class":301,"line":819},[299,1861,1862],{"class":305},"      return\n",[299,1864,1865],{"class":301,"line":825},[299,1866,1623],{"class":312},[299,1868,1869],{"class":301,"line":830},[299,1870,340],{"emptyLinePlaceholder":339},[299,1872,1873],{"class":301,"line":836},[299,1874,1875],{"class":514},"    \u002F\u002F Send the event...\n",[299,1877,1878],{"class":301,"line":861},[299,1879,822],{"class":312},[299,1881,1882],{"class":301,"line":866},[299,1883,497],{"class":312},[278,1885,1887],{"id":1886},"filtering-events","Filtering Events",[269,1889,1890],{},"Filter which events to send inside the drain function:",[289,1892,1894],{"className":291,"code":1893,"filename":293,"language":294,"meta":295,"style":295},"const drain = async (ctx: DrainContext) => {\n  if (ctx.event.level !== 'error') return\n  if (ctx.request?.path === '\u002Fhealth') return\n  if (ctx.event._sampled === false) return\n\n  await sendToMyService(ctx.event)\n}\n",[273,1895,1896,1920,1952,1983,2010,2014,2031],{"__ignoreMap":295},[299,1897,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918],{"class":301,"line":302},[299,1899,347],{"class":346},[299,1901,350],{"class":316},[299,1903,353],{"class":312},[299,1905,356],{"class":346},[299,1907,359],{"class":312},[299,1909,363],{"class":362},[299,1911,366],{"class":312},[299,1913,317],{"class":369},[299,1915,372],{"class":312},[299,1917,375],{"class":346},[299,1919,378],{"class":312},[299,1921,1922,1925,1927,1929,1931,1933,1935,1938,1941,1943,1945,1947,1949],{"class":301,"line":336},[299,1923,1924],{"class":305},"  if",[299,1926,359],{"class":391},[299,1928,363],{"class":316},[299,1930,466],{"class":312},[299,1932,478],{"class":316},[299,1934,466],{"class":312},[299,1936,1937],{"class":316},"level",[299,1939,1940],{"class":312}," !==",[299,1942,326],{"class":312},[299,1944,929],{"class":329},[299,1946,395],{"class":312},[299,1948,1436],{"class":391},[299,1950,1951],{"class":305},"return\n",[299,1953,1954,1956,1958,1960,1962,1965,1967,1970,1972,1974,1977,1979,1981],{"class":301,"line":343},[299,1955,1924],{"class":305},[299,1957,359],{"class":391},[299,1959,363],{"class":316},[299,1961,466],{"class":312},[299,1963,1964],{"class":316},"request",[299,1966,1766],{"class":312},[299,1968,1969],{"class":316},"path",[299,1971,1524],{"class":312},[299,1973,326],{"class":312},[299,1975,1976],{"class":329},"\u002Fhealth",[299,1978,395],{"class":312},[299,1980,1436],{"class":391},[299,1982,1951],{"class":305},[299,1984,1985,1987,1989,1991,1993,1995,1997,2000,2002,2006,2008],{"class":301,"line":381},[299,1986,1924],{"class":305},[299,1988,359],{"class":391},[299,1990,363],{"class":316},[299,1992,466],{"class":312},[299,1994,478],{"class":316},[299,1996,466],{"class":312},[299,1998,1999],{"class":316},"_sampled",[299,2001,1524],{"class":312},[299,2003,2005],{"class":2004},"sfNiH"," false",[299,2007,1436],{"class":391},[299,2009,1951],{"class":305},[299,2011,2012],{"class":301,"line":408},[299,2013,340],{"emptyLinePlaceholder":339},[299,2015,2016,2018,2021,2023,2025,2027,2029],{"class":301,"line":426},[299,2017,384],{"class":305},[299,2019,2020],{"class":387}," sendToMyService",[299,2022,392],{"class":391},[299,2024,363],{"class":316},[299,2026,466],{"class":312},[299,2028,478],{"class":316},[299,2030,491],{"class":391},[299,2032,2033],{"class":301,"line":455},[299,2034,497],{"class":312},[278,2036,2038],{"id":2037},"transforming-events","Transforming Events",[269,2040,2041],{},"Transform events before sending:",[289,2043,2045],{"className":291,"code":2044,"filename":293,"language":294,"meta":295,"style":295},"const drain = async (ctx: DrainContext) => {\n  const payload = {\n    ts: new Date(ctx.event.timestamp).getTime(),\n    severity: ctx.event.level.toUpperCase(),\n    message: JSON.stringify(ctx.event),\n    labels: {\n      service: ctx.event.service,\n      env: ctx.event.environment,\n    },\n    attributes: {\n      method: ctx.event.method,\n      path: ctx.event.path,\n      status: ctx.event.status,\n      duration: ctx.event.duration,\n    },\n  }\n\n  await fetch('https:\u002F\u002Flogs.example.com\u002Fv1\u002Fpush', {\n    method: 'POST',\n    body: JSON.stringify(payload),\n  })\n}\n",[273,2046,2047,2071,2082,2118,2145,2170,2179,2199,2219,2224,2233,2253,2272,2291,2311,2315,2319,2323,2342,2356,2377,2383],{"__ignoreMap":295},[299,2048,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069],{"class":301,"line":302},[299,2050,347],{"class":346},[299,2052,350],{"class":316},[299,2054,353],{"class":312},[299,2056,356],{"class":346},[299,2058,359],{"class":312},[299,2060,363],{"class":362},[299,2062,366],{"class":312},[299,2064,317],{"class":369},[299,2066,372],{"class":312},[299,2068,375],{"class":346},[299,2070,378],{"class":312},[299,2072,2073,2075,2078,2080],{"class":301,"line":336},[299,2074,1136],{"class":346},[299,2076,2077],{"class":316}," payload",[299,2079,1142],{"class":312},[299,2081,378],{"class":312},[299,2083,2084,2087,2089,2091,2094,2096,2098,2100,2102,2104,2107,2109,2111,2114,2116],{"class":301,"line":343},[299,2085,2086],{"class":391},"    ts",[299,2088,366],{"class":312},[299,2090,1220],{"class":312},[299,2092,2093],{"class":387}," Date",[299,2095,392],{"class":391},[299,2097,363],{"class":316},[299,2099,466],{"class":312},[299,2101,478],{"class":316},[299,2103,466],{"class":312},[299,2105,2106],{"class":316},"timestamp",[299,2108,372],{"class":391},[299,2110,466],{"class":312},[299,2112,2113],{"class":387},"getTime",[299,2115,1243],{"class":391},[299,2117,423],{"class":312},[299,2119,2120,2123,2125,2128,2130,2132,2134,2136,2138,2141,2143],{"class":301,"line":381},[299,2121,2122],{"class":391},"    severity",[299,2124,366],{"class":312},[299,2126,2127],{"class":316}," ctx",[299,2129,466],{"class":312},[299,2131,478],{"class":316},[299,2133,466],{"class":312},[299,2135,1937],{"class":316},[299,2137,466],{"class":312},[299,2139,2140],{"class":387},"toUpperCase",[299,2142,1243],{"class":391},[299,2144,423],{"class":312},[299,2146,2147,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168],{"class":301,"line":408},[299,2148,2149],{"class":391},"    message",[299,2151,366],{"class":312},[299,2153,463],{"class":316},[299,2155,466],{"class":312},[299,2157,469],{"class":387},[299,2159,392],{"class":391},[299,2161,363],{"class":316},[299,2163,466],{"class":312},[299,2165,478],{"class":316},[299,2167,372],{"class":391},[299,2169,423],{"class":312},[299,2171,2172,2175,2177],{"class":301,"line":426},[299,2173,2174],{"class":391},"    labels",[299,2176,366],{"class":312},[299,2178,378],{"class":312},[299,2180,2181,2184,2186,2188,2190,2192,2194,2197],{"class":301,"line":455},[299,2182,2183],{"class":391},"      service",[299,2185,366],{"class":312},[299,2187,2127],{"class":316},[299,2189,466],{"class":312},[299,2191,478],{"class":316},[299,2193,466],{"class":312},[299,2195,2196],{"class":316},"service",[299,2198,423],{"class":312},[299,2200,2201,2204,2206,2208,2210,2212,2214,2217],{"class":301,"line":485},[299,2202,2203],{"class":391},"      env",[299,2205,366],{"class":312},[299,2207,2127],{"class":316},[299,2209,466],{"class":312},[299,2211,478],{"class":316},[299,2213,466],{"class":312},[299,2215,2216],{"class":316},"environment",[299,2218,423],{"class":312},[299,2220,2221],{"class":301,"line":494},[299,2222,2223],{"class":312},"    },\n",[299,2225,2226,2229,2231],{"class":301,"line":819},[299,2227,2228],{"class":391},"    attributes",[299,2230,366],{"class":312},[299,2232,378],{"class":312},[299,2234,2235,2238,2240,2242,2244,2246,2248,2251],{"class":301,"line":825},[299,2236,2237],{"class":391},"      method",[299,2239,366],{"class":312},[299,2241,2127],{"class":316},[299,2243,466],{"class":312},[299,2245,478],{"class":316},[299,2247,466],{"class":312},[299,2249,2250],{"class":316},"method",[299,2252,423],{"class":312},[299,2254,2255,2258,2260,2262,2264,2266,2268,2270],{"class":301,"line":830},[299,2256,2257],{"class":391},"      path",[299,2259,366],{"class":312},[299,2261,2127],{"class":316},[299,2263,466],{"class":312},[299,2265,478],{"class":316},[299,2267,466],{"class":312},[299,2269,1969],{"class":316},[299,2271,423],{"class":312},[299,2273,2274,2277,2279,2281,2283,2285,2287,2289],{"class":301,"line":836},[299,2275,2276],{"class":391},"      status",[299,2278,366],{"class":312},[299,2280,2127],{"class":316},[299,2282,466],{"class":312},[299,2284,478],{"class":316},[299,2286,466],{"class":312},[299,2288,1467],{"class":316},[299,2290,423],{"class":312},[299,2292,2293,2296,2298,2300,2302,2304,2306,2309],{"class":301,"line":861},[299,2294,2295],{"class":391},"      duration",[299,2297,366],{"class":312},[299,2299,2127],{"class":316},[299,2301,466],{"class":312},[299,2303,478],{"class":316},[299,2305,466],{"class":312},[299,2307,2308],{"class":316},"duration",[299,2310,423],{"class":312},[299,2312,2313],{"class":301,"line":866},[299,2314,2223],{"class":312},[299,2316,2317],{"class":301,"line":871},[299,2318,822],{"class":312},[299,2320,2321],{"class":301,"line":881},[299,2322,340],{"emptyLinePlaceholder":339},[299,2324,2325,2327,2329,2331,2333,2336,2338,2340],{"class":301,"line":891},[299,2326,384],{"class":305},[299,2328,388],{"class":387},[299,2330,392],{"class":391},[299,2332,395],{"class":312},[299,2334,2335],{"class":329},"https:\u002F\u002Flogs.example.com\u002Fv1\u002Fpush",[299,2337,395],{"class":312},[299,2339,403],{"class":312},[299,2341,378],{"class":312},[299,2343,2344,2346,2348,2350,2352,2354],{"class":301,"line":934},[299,2345,411],{"class":391},[299,2347,366],{"class":312},[299,2349,326],{"class":312},[299,2351,418],{"class":329},[299,2353,395],{"class":312},[299,2355,423],{"class":312},[299,2357,2358,2360,2362,2364,2366,2368,2370,2373,2375],{"class":301,"line":944},[299,2359,458],{"class":391},[299,2361,366],{"class":312},[299,2363,463],{"class":316},[299,2365,466],{"class":312},[299,2367,469],{"class":387},[299,2369,392],{"class":391},[299,2371,2372],{"class":316},"payload",[299,2374,372],{"class":391},[299,2376,423],{"class":312},[299,2378,2379,2381],{"class":301,"line":954},[299,2380,488],{"class":312},[299,2382,491],{"class":391},[299,2384,2385],{"class":301,"line":964},[299,2386,497],{"class":312},[278,2388,2390],{"id":2389},"batching","Batching",[269,2392,2393,2394,2398],{},"For high-throughput scenarios, use the ",[2395,2396,2397],"a",{"href":185},"Drain Pipeline"," to batch events, retry on failure, and handle buffer overflow automatically:",[289,2400,2402],{"className":291,"code":2401,"filename":293,"language":294,"meta":295,"style":295},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 5000 },\n})\n\nconst drain = pipeline(async (batch) => {\n  await fetch('https:\u002F\u002Fapi.example.com\u002Flogs\u002Fbatch', {\n    method: 'POST',\n    body: JSON.stringify(batch.map(ctx => ctx.event)),\n  })\n})\n",[273,2403,2404,2424,2444,2448,2470,2499,2505,2509,2536,2555,2569,2607,2613],{"__ignoreMap":295},[299,2405,2406,2408,2410,2412,2414,2416,2418,2420,2422],{"class":301,"line":302},[299,2407,306],{"class":305},[299,2409,309],{"class":305},[299,2411,313],{"class":312},[299,2413,317],{"class":316},[299,2415,320],{"class":312},[299,2417,323],{"class":305},[299,2419,326],{"class":312},[299,2421,330],{"class":329},[299,2423,333],{"class":312},[299,2425,2426,2428,2430,2433,2435,2437,2439,2442],{"class":301,"line":336},[299,2427,306],{"class":305},[299,2429,313],{"class":312},[299,2431,2432],{"class":316}," createDrainPipeline",[299,2434,320],{"class":312},[299,2436,323],{"class":305},[299,2438,326],{"class":312},[299,2440,2441],{"class":329},"evlog\u002Fpipeline",[299,2443,333],{"class":312},[299,2445,2446],{"class":301,"line":343},[299,2447,340],{"emptyLinePlaceholder":339},[299,2449,2450,2452,2455,2457,2459,2461,2463,2466,2468],{"class":301,"line":381},[299,2451,347],{"class":346},[299,2453,2454],{"class":316}," pipeline ",[299,2456,353],{"class":312},[299,2458,2432],{"class":387},[299,2460,847],{"class":312},[299,2462,275],{"class":369},[299,2464,2465],{"class":312},">",[299,2467,392],{"class":316},[299,2469,1439],{"class":312},[299,2471,2472,2475,2477,2479,2482,2484,2487,2489,2492,2494,2497],{"class":301,"line":408},[299,2473,2474],{"class":391},"  batch",[299,2476,366],{"class":312},[299,2478,313],{"class":312},[299,2480,2481],{"class":391}," size",[299,2483,366],{"class":312},[299,2485,2486],{"class":1181}," 100",[299,2488,403],{"class":312},[299,2490,2491],{"class":391}," intervalMs",[299,2493,366],{"class":312},[299,2495,2496],{"class":1181}," 5000",[299,2498,452],{"class":312},[299,2500,2501,2503],{"class":301,"line":426},[299,2502,575],{"class":312},[299,2504,491],{"class":316},[299,2506,2507],{"class":301,"line":455},[299,2508,340],{"emptyLinePlaceholder":339},[299,2510,2511,2513,2515,2517,2520,2522,2525,2527,2530,2532,2534],{"class":301,"line":485},[299,2512,347],{"class":346},[299,2514,350],{"class":316},[299,2516,353],{"class":312},[299,2518,2519],{"class":387}," pipeline",[299,2521,392],{"class":316},[299,2523,2524],{"class":346},"async",[299,2526,359],{"class":312},[299,2528,2529],{"class":362},"batch",[299,2531,372],{"class":312},[299,2533,375],{"class":346},[299,2535,378],{"class":312},[299,2537,2538,2540,2542,2544,2546,2549,2551,2553],{"class":301,"line":494},[299,2539,384],{"class":305},[299,2541,388],{"class":387},[299,2543,392],{"class":391},[299,2545,395],{"class":312},[299,2547,2548],{"class":329},"https:\u002F\u002Fapi.example.com\u002Flogs\u002Fbatch",[299,2550,395],{"class":312},[299,2552,403],{"class":312},[299,2554,378],{"class":312},[299,2556,2557,2559,2561,2563,2565,2567],{"class":301,"line":819},[299,2558,411],{"class":391},[299,2560,366],{"class":312},[299,2562,326],{"class":312},[299,2564,418],{"class":329},[299,2566,395],{"class":312},[299,2568,423],{"class":312},[299,2570,2571,2573,2575,2577,2579,2581,2583,2585,2587,2590,2592,2594,2596,2598,2600,2602,2605],{"class":301,"line":825},[299,2572,458],{"class":391},[299,2574,366],{"class":312},[299,2576,463],{"class":316},[299,2578,466],{"class":312},[299,2580,469],{"class":387},[299,2582,392],{"class":391},[299,2584,2529],{"class":316},[299,2586,466],{"class":312},[299,2588,2589],{"class":387},"map",[299,2591,392],{"class":391},[299,2593,363],{"class":362},[299,2595,375],{"class":346},[299,2597,2127],{"class":316},[299,2599,466],{"class":312},[299,2601,478],{"class":316},[299,2603,2604],{"class":391},"))",[299,2606,423],{"class":312},[299,2608,2609,2611],{"class":301,"line":830},[299,2610,488],{"class":312},[299,2612,491],{"class":391},[299,2614,2615,2617],{"class":301,"line":836},[299,2616,575],{"class":312},[299,2618,491],{"class":316},[2620,2621,2623,2624,2627],"callout",{"color":911,"icon":2622},"i-lucide-arrow-right","See the ",[2395,2625,2626],{"href":185},"Pipeline documentation"," for the full options reference, retry strategies, and buffer overflow handling.",[278,2629,2631],{"id":2630},"error-handling-best-practices","Error Handling Best Practices",[2633,2634,2635,2643,2653,2659],"ol",{},[2636,2637,2638,2642],"li",{},[2639,2640,2641],"strong",{},"Never throw errors"," - The drain should not crash your app",[2636,2644,2645,2648,2649,2652],{},[2639,2646,2647],{},"Log failures silently"," - Use ",[273,2650,2651],{},"console.error"," for debugging",[2636,2654,2655,2658],{},[2639,2656,2657],{},"Use timeouts"," - Prevent hanging requests",[2636,2660,2661,2664],{},[2639,2662,2663],{},"Graceful degradation"," - Skip sending if config is missing",[289,2666,2669],{"className":291,"code":2667,"filename":2668,"language":294,"meta":295,"style":295},"export function createRobustAdapter(config: Config) {\n  return async (ctx: DrainContext) => {\n    \u002F\u002F Validate config\n    if (!config.apiKey) {\n      console.error('[adapter] Missing API key, skipping')\n      return\n    }\n\n    const controller = new AbortController()\n    const timeoutId = setTimeout(() => controller.abort(), 5000)\n\n    try {\n      await fetch(config.endpoint, {\n        method: 'POST',\n        body: JSON.stringify(ctx.event),\n        signal: controller.signal,\n      })\n    } catch (error) {\n      \u002F\u002F Log but don't throw\n      console.error('[adapter] Failed to send:', error)\n    } finally {\n      clearTimeout(timeoutId)\n    }\n  }\n}\n","lib\u002Frobust-adapter.ts",[273,2670,2671,2693,2713,2718,2736,2755,2759,2763,2767,2781,2811,2815,2821,2840,2854,2878,2892,2898,2912,2917,2940,2948,2958,2962,2966],{"__ignoreMap":295},[299,2672,2673,2675,2677,2680,2682,2684,2686,2689,2691],{"class":301,"line":302},[299,2674,520],{"class":305},[299,2676,1115],{"class":346},[299,2678,2679],{"class":387}," createRobustAdapter",[299,2681,392],{"class":312},[299,2683,1123],{"class":362},[299,2685,366],{"class":312},[299,2687,2688],{"class":369}," Config",[299,2690,372],{"class":312},[299,2692,378],{"class":312},[299,2694,2695,2697,2699,2701,2703,2705,2707,2709,2711],{"class":301,"line":336},[299,2696,1191],{"class":305},[299,2698,356],{"class":346},[299,2700,359],{"class":312},[299,2702,363],{"class":362},[299,2704,366],{"class":312},[299,2706,317],{"class":369},[299,2708,372],{"class":312},[299,2710,375],{"class":346},[299,2712,378],{"class":312},[299,2714,2715],{"class":301,"line":343},[299,2716,2717],{"class":514},"    \u002F\u002F Validate config\n",[299,2719,2720,2722,2724,2726,2728,2730,2732,2734],{"class":301,"line":381},[299,2721,1823],{"class":305},[299,2723,359],{"class":391},[299,2725,1425],{"class":312},[299,2727,1123],{"class":316},[299,2729,466],{"class":312},[299,2731,1355],{"class":316},[299,2733,1436],{"class":391},[299,2735,1439],{"class":312},[299,2737,2738,2740,2742,2744,2746,2748,2751,2753],{"class":301,"line":408},[299,2739,1842],{"class":316},[299,2741,466],{"class":312},[299,2743,929],{"class":387},[299,2745,392],{"class":391},[299,2747,395],{"class":312},[299,2749,2750],{"class":329},"[adapter] Missing API key, skipping",[299,2752,395],{"class":312},[299,2754,491],{"class":391},[299,2756,2757],{"class":301,"line":426},[299,2758,1862],{"class":305},[299,2760,2761],{"class":301,"line":455},[299,2762,1623],{"class":312},[299,2764,2765],{"class":301,"line":485},[299,2766,340],{"emptyLinePlaceholder":339},[299,2768,2769,2771,2773,2775,2777,2779],{"class":301,"line":494},[299,2770,1212],{"class":346},[299,2772,1215],{"class":316},[299,2774,1142],{"class":312},[299,2776,1220],{"class":312},[299,2778,1223],{"class":387},[299,2780,1226],{"class":391},[299,2782,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807,2809],{"class":301,"line":819},[299,2784,1212],{"class":346},[299,2786,1233],{"class":316},[299,2788,1142],{"class":312},[299,2790,1238],{"class":387},[299,2792,392],{"class":391},[299,2794,1243],{"class":312},[299,2796,375],{"class":346},[299,2798,1215],{"class":316},[299,2800,466],{"class":312},[299,2802,1252],{"class":387},[299,2804,1243],{"class":391},[299,2806,403],{"class":312},[299,2808,2496],{"class":1181},[299,2810,491],{"class":391},[299,2812,2813],{"class":301,"line":825},[299,2814,340],{"emptyLinePlaceholder":339},[299,2816,2817,2819],{"class":301,"line":830},[299,2818,1269],{"class":305},[299,2820,378],{"class":312},[299,2822,2823,2826,2828,2830,2832,2834,2836,2838],{"class":301,"line":836},[299,2824,2825],{"class":305},"      await",[299,2827,388],{"class":387},[299,2829,392],{"class":391},[299,2831,1123],{"class":316},[299,2833,466],{"class":312},[299,2835,1150],{"class":316},[299,2837,403],{"class":312},[299,2839,378],{"class":312},[299,2841,2842,2844,2846,2848,2850,2852],{"class":301,"line":861},[299,2843,1299],{"class":391},[299,2845,366],{"class":312},[299,2847,326],{"class":312},[299,2849,418],{"class":329},[299,2851,395],{"class":312},[299,2853,423],{"class":312},[299,2855,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876],{"class":301,"line":866},[299,2857,1367],{"class":391},[299,2859,366],{"class":312},[299,2861,463],{"class":316},[299,2863,466],{"class":312},[299,2865,469],{"class":387},[299,2867,392],{"class":391},[299,2869,363],{"class":316},[299,2871,466],{"class":312},[299,2873,478],{"class":316},[299,2875,372],{"class":391},[299,2877,423],{"class":312},[299,2879,2880,2882,2884,2886,2888,2890],{"class":301,"line":871},[299,2881,1392],{"class":391},[299,2883,366],{"class":312},[299,2885,1215],{"class":316},[299,2887,466],{"class":312},[299,2889,1401],{"class":316},[299,2891,423],{"class":312},[299,2893,2894,2896],{"class":301,"line":881},[299,2895,1408],{"class":312},[299,2897,491],{"class":391},[299,2899,2900,2902,2904,2906,2908,2910],{"class":301,"line":891},[299,2901,1484],{"class":312},[299,2903,1487],{"class":305},[299,2905,359],{"class":391},[299,2907,929],{"class":316},[299,2909,1436],{"class":391},[299,2911,1439],{"class":312},[299,2913,2914],{"class":301,"line":934},[299,2915,2916],{"class":514},"      \u002F\u002F Log but don't throw\n",[299,2918,2919,2921,2923,2925,2927,2929,2932,2934,2936,2938],{"class":301,"line":944},[299,2920,1842],{"class":316},[299,2922,466],{"class":312},[299,2924,929],{"class":387},[299,2926,392],{"class":391},[299,2928,395],{"class":312},[299,2930,2931],{"class":329},"[adapter] Failed to send:",[299,2933,395],{"class":312},[299,2935,403],{"class":312},[299,2937,1516],{"class":316},[299,2939,491],{"class":391},[299,2941,2942,2944,2946],{"class":301,"line":954},[299,2943,1484],{"class":312},[299,2945,1602],{"class":305},[299,2947,378],{"class":312},[299,2949,2950,2952,2954,2956],{"class":301,"line":964},[299,2951,1610],{"class":387},[299,2953,392],{"class":391},[299,2955,1615],{"class":316},[299,2957,491],{"class":391},[299,2959,2960],{"class":301,"line":974},[299,2961,1623],{"class":312},[299,2963,2964],{"class":301,"line":984},[299,2965,822],{"class":312},[299,2967,2968],{"class":301,"line":994},[299,2969,497],{"class":312},[278,2971,2973],{"id":2972},"next-steps","Next Steps",[2975,2976,2977,2983,2989,2995],"ul",{},[2636,2978,2979,2982],{},[2395,2980,2981],{"href":195},"Axiom Adapter"," - See a production-ready adapter implementation",[2636,2984,2985,2988],{},[2395,2986,2987],{"href":200},"OTLP Adapter"," - OpenTelemetry Protocol adapter",[2636,2990,2991,2994],{},[2395,2992,2993],{"href":205},"PostHog Adapter"," - PostHog product analytics adapter",[2636,2996,2997,2999],{},[2395,2998,146],{"href":147}," - Security and production tips",[3001,3002,3003],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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}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}",{"title":295,"searchDepth":336,"depth":336,"links":3005},[3006,3007,3008,3009,3010,3011,3012,3013,3014],{"id":280,"depth":336,"text":281},{"id":739,"depth":336,"text":740},{"id":1026,"depth":336,"text":1027},{"id":1686,"depth":336,"text":1687},{"id":1886,"depth":336,"text":1887},{"id":2037,"depth":336,"text":2038},{"id":2389,"depth":336,"text":2390},{"id":2630,"depth":336,"text":2631},{"id":2972,"depth":336,"text":2973},"Build your own adapter to send logs to any destination. Factory patterns, batching, filtering, and error handling best practices.","md",[3018,3021],{"label":2981,"icon":197,"to":195,"color":3019,"variant":3020},"neutral","subtle",{"label":146,"icon":149,"to":147,"color":3019,"variant":3020},{},{"icon":232},{"title":229,"description":3015},"O_0_Rjk_MGRGV27tMOJI3JupWvWrtCq9-SfaZOBOtXQ",[3027,3029],{"title":224,"path":225,"stem":226,"description":3028,"icon":227,"children":-1},"Send wide events to HyperDX via OTLP\u002FHTTP using HyperDX’s documented OpenTelemetry endpoint and authorization header. Zero-config setup with environment variables.",{"title":36,"path":239,"stem":240,"description":3030,"icon":28,"children":-1},"Enrich your wide events with derived context like user agent, geo data, request size, and trace context. Built-in enrichers and custom enricher support.",1775236131348]