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