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