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