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