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