[{"data":1,"prerenderedAt":2104},["ShallowReactive",2],{"navigation_docs":3,"-adapters-pipeline":122,"-adapters-pipeline-surround":2099},[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":124,"body":125,"description":2089,"extension":2090,"links":2091,"meta":2095,"navigation":2096,"path":97,"seo":2097,"stem":98,"__hash__":2098},"docs/3.adapters/8.pipeline.md","Drain Pipeline",{"type":126,"value":127,"toc":2076},"minimark",[128,132,136,398,408,412,454,458,876,881,1027,1031,1086,1090,1097,1157,1161,1164,1455,1459,1462,1792,1796,1807,2036,2049,2053,2072],[129,130,131],"p",{},"In production, sending one HTTP request per log event is wasteful. The drain pipeline buffers events and sends them in batches, retries on transient failures, and drops the oldest events when the buffer overflows.",[133,134,20],"h2",{"id":135},"quick-start",[137,138,144],"pre",{"className":139,"code":140,"filename":141,"language":142,"meta":143,"style":143},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog/pipeline'\nimport { createAxiomDrain } from 'evlog/axiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const pipeline = createDrainPipeline\u003CDrainContext>()\n  const drain = pipeline(createAxiomDrain())\n\n  nitroApp.hooks.hook('evlog:drain', drain)\n  nitroApp.hooks.hook('close', () => drain.flush())\n})\n","server/plugins/evlog-drain.ts","typescript","",[145,146,147,183,204,225,232,264,292,312,317,352,390],"code",{"__ignoreMap":143},[148,149,152,156,159,163,167,170,173,176,180],"span",{"class":150,"line":151},"line",1,[148,153,155],{"class":154},"s7zQu","import",[148,157,158],{"class":154}," type",[148,160,162],{"class":161},"sMK4o"," {",[148,164,166],{"class":165},"sTEyZ"," DrainContext",[148,168,169],{"class":161}," }",[148,171,172],{"class":154}," from",[148,174,175],{"class":161}," '",[148,177,179],{"class":178},"sfazB","evlog",[148,181,182],{"class":161},"'\n",[148,184,186,188,190,193,195,197,199,202],{"class":150,"line":185},2,[148,187,155],{"class":154},[148,189,162],{"class":161},[148,191,192],{"class":165}," createDrainPipeline",[148,194,169],{"class":161},[148,196,172],{"class":154},[148,198,175],{"class":161},[148,200,201],{"class":178},"evlog/pipeline",[148,203,182],{"class":161},[148,205,207,209,211,214,216,218,220,223],{"class":150,"line":206},3,[148,208,155],{"class":154},[148,210,162],{"class":161},[148,212,213],{"class":165}," createAxiomDrain",[148,215,169],{"class":161},[148,217,172],{"class":154},[148,219,175],{"class":161},[148,221,222],{"class":178},"evlog/axiom",[148,224,182],{"class":161},[148,226,228],{"class":150,"line":227},4,[148,229,231],{"emptyLinePlaceholder":230},true,"\n",[148,233,235,238,241,245,248,250,254,257,261],{"class":150,"line":234},5,[148,236,237],{"class":154},"export",[148,239,240],{"class":154}," default",[148,242,244],{"class":243},"s2Zo4"," defineNitroPlugin",[148,246,247],{"class":165},"(",[148,249,247],{"class":161},[148,251,253],{"class":252},"sHdIc","nitroApp",[148,255,256],{"class":161},")",[148,258,260],{"class":259},"spNyl"," =>",[148,262,263],{"class":161}," {\n",[148,265,267,270,273,276,278,281,285,288],{"class":150,"line":266},6,[148,268,269],{"class":259},"  const",[148,271,272],{"class":165}," pipeline",[148,274,275],{"class":161}," =",[148,277,192],{"class":243},[148,279,280],{"class":161},"\u003C",[148,282,284],{"class":283},"sBMFI","DrainContext",[148,286,287],{"class":161},">",[148,289,291],{"class":290},"swJcz","()\n",[148,293,295,297,300,302,304,306,309],{"class":150,"line":294},7,[148,296,269],{"class":259},[148,298,299],{"class":165}," drain",[148,301,275],{"class":161},[148,303,272],{"class":243},[148,305,247],{"class":290},[148,307,308],{"class":243},"createAxiomDrain",[148,310,311],{"class":290},"())\n",[148,313,315],{"class":150,"line":314},8,[148,316,231],{"emptyLinePlaceholder":230},[148,318,320,323,326,329,331,334,336,339,342,344,347,349],{"class":150,"line":319},9,[148,321,322],{"class":165},"  nitroApp",[148,324,325],{"class":161},".",[148,327,328],{"class":165},"hooks",[148,330,325],{"class":161},[148,332,333],{"class":243},"hook",[148,335,247],{"class":290},[148,337,338],{"class":161},"'",[148,340,341],{"class":178},"evlog:drain",[148,343,338],{"class":161},[148,345,346],{"class":161},",",[148,348,299],{"class":165},[148,350,351],{"class":290},")\n",[148,353,355,357,359,361,363,365,367,369,372,374,376,379,381,383,385,388],{"class":150,"line":354},10,[148,356,322],{"class":165},[148,358,325],{"class":161},[148,360,328],{"class":165},[148,362,325],{"class":161},[148,364,333],{"class":243},[148,366,247],{"class":290},[148,368,338],{"class":161},[148,370,371],{"class":178},"close",[148,373,338],{"class":161},[148,375,346],{"class":161},[148,377,378],{"class":161}," ()",[148,380,260],{"class":259},[148,382,299],{"class":165},[148,384,325],{"class":161},[148,386,387],{"class":243},"flush",[148,389,311],{"class":290},[148,391,393,396],{"class":150,"line":392},11,[148,394,395],{"class":161},"}",[148,397,351],{"class":165},[399,400,403,404,407],"callout",{"color":401,"icon":402},"warning","i-lucide-alert-triangle","Always call ",[145,405,406],{},"drain.flush()"," on server shutdown to ensure buffered events are sent before the process exits.",[133,409,411],{"id":410},"how-it-works","How It Works",[413,414,415,422,434,440,447],"ol",{},[416,417,418,419,421],"li",{},"Events are buffered in memory as they arrive via the ",[145,420,341],{}," hook",[416,423,424,425,429,430,433],{},"A batch is flushed when either the ",[426,427,428],"strong",{},"batch size"," is reached or the ",[426,431,432],{},"interval"," expires (whichever comes first)",[416,435,436,437],{},"If the drain function fails, the batch is retried with the configured ",[426,438,439],{},"backoff strategy",[416,441,442,443,446],{},"If all retries are exhausted, ",[145,444,445],{},"onDropped"," is called with the lost events",[416,448,449,450,453],{},"If the buffer exceeds ",[145,451,452],{},"maxBufferSize",", the oldest events are dropped to prevent memory leaks",[133,455,457],{"id":456},"configuration","Configuration",[137,459,461],{"className":139,"code":460,"filename":141,"language":142,"meta":143,"style":143},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog/pipeline'\nimport { createAxiomDrain } from 'evlog/axiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const pipeline = createDrainPipeline\u003CDrainContext>({\n    batch: {\n      size: 50,          // Flush every 50 events\n      intervalMs: 5000,  // Or every 5 seconds, whichever comes first\n    },\n    retry: {\n      maxAttempts: 3,\n      backoff: 'exponential',\n      initialDelayMs: 1000,\n      maxDelayMs: 30000,\n    },\n    maxBufferSize: 1000,\n    onDropped: (events, error) => {\n      console.error(`[evlog] Dropped ${events.length} events:`, error?.message)\n    },\n  })\n\n  const drain = pipeline(createAxiomDrain())\n\n  nitroApp.hooks.hook('evlog:drain', drain)\n  nitroApp.hooks.hook('close', () => drain.flush())\n})\n",[145,462,463,483,501,519,523,543,564,574,591,606,611,620,634,651,664,677,682,694,719,767,772,780,785,802,807,834,869],{"__ignoreMap":143},[148,464,465,467,469,471,473,475,477,479,481],{"class":150,"line":151},[148,466,155],{"class":154},[148,468,158],{"class":154},[148,470,162],{"class":161},[148,472,166],{"class":165},[148,474,169],{"class":161},[148,476,172],{"class":154},[148,478,175],{"class":161},[148,480,179],{"class":178},[148,482,182],{"class":161},[148,484,485,487,489,491,493,495,497,499],{"class":150,"line":185},[148,486,155],{"class":154},[148,488,162],{"class":161},[148,490,192],{"class":165},[148,492,169],{"class":161},[148,494,172],{"class":154},[148,496,175],{"class":161},[148,498,201],{"class":178},[148,500,182],{"class":161},[148,502,503,505,507,509,511,513,515,517],{"class":150,"line":206},[148,504,155],{"class":154},[148,506,162],{"class":161},[148,508,213],{"class":165},[148,510,169],{"class":161},[148,512,172],{"class":154},[148,514,175],{"class":161},[148,516,222],{"class":178},[148,518,182],{"class":161},[148,520,521],{"class":150,"line":227},[148,522,231],{"emptyLinePlaceholder":230},[148,524,525,527,529,531,533,535,537,539,541],{"class":150,"line":234},[148,526,237],{"class":154},[148,528,240],{"class":154},[148,530,244],{"class":243},[148,532,247],{"class":165},[148,534,247],{"class":161},[148,536,253],{"class":252},[148,538,256],{"class":161},[148,540,260],{"class":259},[148,542,263],{"class":161},[148,544,545,547,549,551,553,555,557,559,561],{"class":150,"line":266},[148,546,269],{"class":259},[148,548,272],{"class":165},[148,550,275],{"class":161},[148,552,192],{"class":243},[148,554,280],{"class":161},[148,556,284],{"class":283},[148,558,287],{"class":161},[148,560,247],{"class":290},[148,562,563],{"class":161},"{\n",[148,565,566,569,572],{"class":150,"line":294},[148,567,568],{"class":290},"    batch",[148,570,571],{"class":161},":",[148,573,263],{"class":161},[148,575,576,579,581,585,587],{"class":150,"line":314},[148,577,578],{"class":290},"      size",[148,580,571],{"class":161},[148,582,584],{"class":583},"sbssI"," 50",[148,586,346],{"class":161},[148,588,590],{"class":589},"sHwdD","          // Flush every 50 events\n",[148,592,593,596,598,601,603],{"class":150,"line":319},[148,594,595],{"class":290},"      intervalMs",[148,597,571],{"class":161},[148,599,600],{"class":583}," 5000",[148,602,346],{"class":161},[148,604,605],{"class":589},"  // Or every 5 seconds, whichever comes first\n",[148,607,608],{"class":150,"line":354},[148,609,610],{"class":161},"    },\n",[148,612,613,616,618],{"class":150,"line":392},[148,614,615],{"class":290},"    retry",[148,617,571],{"class":161},[148,619,263],{"class":161},[148,621,623,626,628,631],{"class":150,"line":622},12,[148,624,625],{"class":290},"      maxAttempts",[148,627,571],{"class":161},[148,629,630],{"class":583}," 3",[148,632,633],{"class":161},",\n",[148,635,637,640,642,644,647,649],{"class":150,"line":636},13,[148,638,639],{"class":290},"      backoff",[148,641,571],{"class":161},[148,643,175],{"class":161},[148,645,646],{"class":178},"exponential",[148,648,338],{"class":161},[148,650,633],{"class":161},[148,652,654,657,659,662],{"class":150,"line":653},14,[148,655,656],{"class":290},"      initialDelayMs",[148,658,571],{"class":161},[148,660,661],{"class":583}," 1000",[148,663,633],{"class":161},[148,665,667,670,672,675],{"class":150,"line":666},15,[148,668,669],{"class":290},"      maxDelayMs",[148,671,571],{"class":161},[148,673,674],{"class":583}," 30000",[148,676,633],{"class":161},[148,678,680],{"class":150,"line":679},16,[148,681,610],{"class":161},[148,683,685,688,690,692],{"class":150,"line":684},17,[148,686,687],{"class":290},"    maxBufferSize",[148,689,571],{"class":161},[148,691,661],{"class":583},[148,693,633],{"class":161},[148,695,697,700,702,705,708,710,713,715,717],{"class":150,"line":696},18,[148,698,699],{"class":243},"    onDropped",[148,701,571],{"class":161},[148,703,704],{"class":161}," (",[148,706,707],{"class":252},"events",[148,709,346],{"class":161},[148,711,712],{"class":252}," error",[148,714,256],{"class":161},[148,716,260],{"class":259},[148,718,263],{"class":161},[148,720,722,725,727,730,732,735,738,741,743,745,748,750,753,755,757,759,762,765],{"class":150,"line":721},19,[148,723,724],{"class":165},"      console",[148,726,325],{"class":161},[148,728,729],{"class":243},"error",[148,731,247],{"class":290},[148,733,734],{"class":161},"`",[148,736,737],{"class":178},"[evlog] Dropped ",[148,739,740],{"class":161},"${",[148,742,707],{"class":165},[148,744,325],{"class":161},[148,746,747],{"class":165},"length",[148,749,395],{"class":161},[148,751,752],{"class":178}," events:",[148,754,734],{"class":161},[148,756,346],{"class":161},[148,758,712],{"class":165},[148,760,761],{"class":161},"?.",[148,763,764],{"class":165},"message",[148,766,351],{"class":290},[148,768,770],{"class":150,"line":769},20,[148,771,610],{"class":161},[148,773,775,778],{"class":150,"line":774},21,[148,776,777],{"class":161},"  }",[148,779,351],{"class":290},[148,781,783],{"class":150,"line":782},22,[148,784,231],{"emptyLinePlaceholder":230},[148,786,788,790,792,794,796,798,800],{"class":150,"line":787},23,[148,789,269],{"class":259},[148,791,299],{"class":165},[148,793,275],{"class":161},[148,795,272],{"class":243},[148,797,247],{"class":290},[148,799,308],{"class":243},[148,801,311],{"class":290},[148,803,805],{"class":150,"line":804},24,[148,806,231],{"emptyLinePlaceholder":230},[148,808,810,812,814,816,818,820,822,824,826,828,830,832],{"class":150,"line":809},25,[148,811,322],{"class":165},[148,813,325],{"class":161},[148,815,328],{"class":165},[148,817,325],{"class":161},[148,819,333],{"class":243},[148,821,247],{"class":290},[148,823,338],{"class":161},[148,825,341],{"class":178},[148,827,338],{"class":161},[148,829,346],{"class":161},[148,831,299],{"class":165},[148,833,351],{"class":290},[148,835,837,839,841,843,845,847,849,851,853,855,857,859,861,863,865,867],{"class":150,"line":836},26,[148,838,322],{"class":165},[148,840,325],{"class":161},[148,842,328],{"class":165},[148,844,325],{"class":161},[148,846,333],{"class":243},[148,848,247],{"class":290},[148,850,338],{"class":161},[148,852,371],{"class":178},[148,854,338],{"class":161},[148,856,346],{"class":161},[148,858,378],{"class":161},[148,860,260],{"class":259},[148,862,299],{"class":165},[148,864,325],{"class":161},[148,866,387],{"class":243},[148,868,311],{"class":290},[148,870,872,874],{"class":150,"line":871},27,[148,873,395],{"class":161},[148,875,351],{"class":165},[877,878,880],"h3",{"id":879},"options-reference","Options Reference",[882,883,884,900],"table",{},[885,886,887],"thead",{},[888,889,890,894,897],"tr",{},[891,892,893],"th",{},"Option",[891,895,896],{},"Default",[891,898,899],{},"Description",[901,902,903,919,934,949,972,987,1002,1015],"tbody",{},[888,904,905,911,916],{},[906,907,908],"td",{},[145,909,910],{},"batch.size",[906,912,913],{},[145,914,915],{},"50",[906,917,918],{},"Maximum events per batch",[888,920,921,926,931],{},[906,922,923],{},[145,924,925],{},"batch.intervalMs",[906,927,928],{},[145,929,930],{},"5000",[906,932,933],{},"Max time (ms) before flushing a partial batch",[888,935,936,941,946],{},[906,937,938],{},[145,939,940],{},"retry.maxAttempts",[906,942,943],{},[145,944,945],{},"3",[906,947,948],{},"Total attempts including the initial one",[888,950,951,956,961],{},[906,952,953],{},[145,954,955],{},"retry.backoff",[906,957,958],{},[145,959,960],{},"'exponential'",[906,962,963,965,966,965,969],{},[145,964,960],{}," | ",[145,967,968],{},"'linear'",[145,970,971],{},"'fixed'",[888,973,974,979,984],{},[906,975,976],{},[145,977,978],{},"retry.initialDelayMs",[906,980,981],{},[145,982,983],{},"1000",[906,985,986],{},"Base delay for the first retry",[888,988,989,994,999],{},[906,990,991],{},[145,992,993],{},"retry.maxDelayMs",[906,995,996],{},[145,997,998],{},"30000",[906,1000,1001],{},"Upper bound for any retry delay",[888,1003,1004,1008,1012],{},[906,1005,1006],{},[145,1007,452],{},[906,1009,1010],{},[145,1011,983],{},[906,1013,1014],{},"Max buffered events before dropping oldest",[888,1016,1017,1021,1024],{},[906,1018,1019],{},[145,1020,445],{},[906,1022,1023],{},"—",[906,1025,1026],{},"Callback when events are dropped (overflow or retry exhaustion)",[133,1028,1030],{"id":1029},"backoff-strategies","Backoff Strategies",[882,1032,1033,1046],{},[885,1034,1035],{},[888,1036,1037,1040,1043],{},[891,1038,1039],{},"Strategy",[891,1041,1042],{},"Delay Pattern",[891,1044,1045],{},"Use Case",[901,1047,1048,1060,1073],{},[888,1049,1050,1054,1057],{},[906,1051,1052],{},[145,1053,646],{},[906,1055,1056],{},"1s, 2s, 4s, 8s...",[906,1058,1059],{},"Default. Best for transient failures that may need time to recover",[888,1061,1062,1067,1070],{},[906,1063,1064],{},[145,1065,1066],{},"linear",[906,1068,1069],{},"1s, 2s, 3s, 4s...",[906,1071,1072],{},"Predictable delay growth",[888,1074,1075,1080,1083],{},[906,1076,1077],{},[145,1078,1079],{},"fixed",[906,1081,1082],{},"1s, 1s, 1s, 1s...",[906,1084,1085],{},"Same delay every time. Useful for rate-limited APIs",[133,1087,1089],{"id":1088},"returned-drain-function","Returned Drain Function",[129,1091,1092,1093,1096],{},"The function returned by ",[145,1094,1095],{},"pipeline(drain)"," is hook-compatible and exposes:",[882,1098,1099,1111],{},[885,1100,1101],{},[888,1102,1103,1106,1109],{},[891,1104,1105],{},"Property",[891,1107,1108],{},"Type",[891,1110,899],{},[901,1112,1113,1128,1142],{},[888,1114,1115,1120,1125],{},[906,1116,1117],{},[145,1118,1119],{},"drain(ctx)",[906,1121,1122],{},[145,1123,1124],{},"(ctx: T) => void",[906,1126,1127],{},"Push a single event into the buffer",[888,1129,1130,1134,1139],{},[906,1131,1132],{},[145,1133,406],{},[906,1135,1136],{},[145,1137,1138],{},"() => Promise\u003Cvoid>",[906,1140,1141],{},"Force-flush all buffered events",[888,1143,1144,1149,1154],{},[906,1145,1146],{},[145,1147,1148],{},"drain.pending",[906,1150,1151],{},[145,1152,1153],{},"number",[906,1155,1156],{},"Number of events currently buffered",[133,1158,1160],{"id":1159},"multiple-destinations","Multiple Destinations",[129,1162,1163],{},"Wrap multiple adapters with a single pipeline:",[137,1165,1167],{"className":139,"code":1166,"filename":141,"language":142,"meta":143,"style":143},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog/pipeline'\nimport { createAxiomDrain } from 'evlog/axiom'\nimport { createOTLPDrain } from 'evlog/otlp'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const axiom = createAxiomDrain()\n  const otlp = createOTLPDrain()\n\n  const pipeline = createDrainPipeline\u003CDrainContext>()\n  const drain = pipeline(async (batch) => {\n    await Promise.allSettled([axiom(batch), otlp(batch)])\n  })\n\n  nitroApp.hooks.hook('evlog:drain', drain)\n  nitroApp.hooks.hook('close', () => drain.flush())\n})\n",[145,1168,1169,1189,1207,1225,1245,1249,1269,1282,1295,1299,1317,1343,1379,1385,1389,1415,1449],{"__ignoreMap":143},[148,1170,1171,1173,1175,1177,1179,1181,1183,1185,1187],{"class":150,"line":151},[148,1172,155],{"class":154},[148,1174,158],{"class":154},[148,1176,162],{"class":161},[148,1178,166],{"class":165},[148,1180,169],{"class":161},[148,1182,172],{"class":154},[148,1184,175],{"class":161},[148,1186,179],{"class":178},[148,1188,182],{"class":161},[148,1190,1191,1193,1195,1197,1199,1201,1203,1205],{"class":150,"line":185},[148,1192,155],{"class":154},[148,1194,162],{"class":161},[148,1196,192],{"class":165},[148,1198,169],{"class":161},[148,1200,172],{"class":154},[148,1202,175],{"class":161},[148,1204,201],{"class":178},[148,1206,182],{"class":161},[148,1208,1209,1211,1213,1215,1217,1219,1221,1223],{"class":150,"line":206},[148,1210,155],{"class":154},[148,1212,162],{"class":161},[148,1214,213],{"class":165},[148,1216,169],{"class":161},[148,1218,172],{"class":154},[148,1220,175],{"class":161},[148,1222,222],{"class":178},[148,1224,182],{"class":161},[148,1226,1227,1229,1231,1234,1236,1238,1240,1243],{"class":150,"line":227},[148,1228,155],{"class":154},[148,1230,162],{"class":161},[148,1232,1233],{"class":165}," createOTLPDrain",[148,1235,169],{"class":161},[148,1237,172],{"class":154},[148,1239,175],{"class":161},[148,1241,1242],{"class":178},"evlog/otlp",[148,1244,182],{"class":161},[148,1246,1247],{"class":150,"line":234},[148,1248,231],{"emptyLinePlaceholder":230},[148,1250,1251,1253,1255,1257,1259,1261,1263,1265,1267],{"class":150,"line":266},[148,1252,237],{"class":154},[148,1254,240],{"class":154},[148,1256,244],{"class":243},[148,1258,247],{"class":165},[148,1260,247],{"class":161},[148,1262,253],{"class":252},[148,1264,256],{"class":161},[148,1266,260],{"class":259},[148,1268,263],{"class":161},[148,1270,1271,1273,1276,1278,1280],{"class":150,"line":294},[148,1272,269],{"class":259},[148,1274,1275],{"class":165}," axiom",[148,1277,275],{"class":161},[148,1279,213],{"class":243},[148,1281,291],{"class":290},[148,1283,1284,1286,1289,1291,1293],{"class":150,"line":314},[148,1285,269],{"class":259},[148,1287,1288],{"class":165}," otlp",[148,1290,275],{"class":161},[148,1292,1233],{"class":243},[148,1294,291],{"class":290},[148,1296,1297],{"class":150,"line":319},[148,1298,231],{"emptyLinePlaceholder":230},[148,1300,1301,1303,1305,1307,1309,1311,1313,1315],{"class":150,"line":354},[148,1302,269],{"class":259},[148,1304,272],{"class":165},[148,1306,275],{"class":161},[148,1308,192],{"class":243},[148,1310,280],{"class":161},[148,1312,284],{"class":283},[148,1314,287],{"class":161},[148,1316,291],{"class":290},[148,1318,1319,1321,1323,1325,1327,1329,1332,1334,1337,1339,1341],{"class":150,"line":392},[148,1320,269],{"class":259},[148,1322,299],{"class":165},[148,1324,275],{"class":161},[148,1326,272],{"class":243},[148,1328,247],{"class":290},[148,1330,1331],{"class":259},"async",[148,1333,704],{"class":161},[148,1335,1336],{"class":252},"batch",[148,1338,256],{"class":161},[148,1340,260],{"class":259},[148,1342,263],{"class":161},[148,1344,1345,1348,1351,1353,1356,1359,1362,1364,1366,1368,1370,1372,1374,1376],{"class":150,"line":622},[148,1346,1347],{"class":154},"    await",[148,1349,1350],{"class":283}," Promise",[148,1352,325],{"class":161},[148,1354,1355],{"class":243},"allSettled",[148,1357,1358],{"class":290},"([",[148,1360,1361],{"class":243},"axiom",[148,1363,247],{"class":290},[148,1365,1336],{"class":165},[148,1367,256],{"class":290},[148,1369,346],{"class":161},[148,1371,1288],{"class":243},[148,1373,247],{"class":290},[148,1375,1336],{"class":165},[148,1377,1378],{"class":290},")])\n",[148,1380,1381,1383],{"class":150,"line":636},[148,1382,777],{"class":161},[148,1384,351],{"class":290},[148,1386,1387],{"class":150,"line":653},[148,1388,231],{"emptyLinePlaceholder":230},[148,1390,1391,1393,1395,1397,1399,1401,1403,1405,1407,1409,1411,1413],{"class":150,"line":666},[148,1392,322],{"class":165},[148,1394,325],{"class":161},[148,1396,328],{"class":165},[148,1398,325],{"class":161},[148,1400,333],{"class":243},[148,1402,247],{"class":290},[148,1404,338],{"class":161},[148,1406,341],{"class":178},[148,1408,338],{"class":161},[148,1410,346],{"class":161},[148,1412,299],{"class":165},[148,1414,351],{"class":290},[148,1416,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447],{"class":150,"line":679},[148,1418,322],{"class":165},[148,1420,325],{"class":161},[148,1422,328],{"class":165},[148,1424,325],{"class":161},[148,1426,333],{"class":243},[148,1428,247],{"class":290},[148,1430,338],{"class":161},[148,1432,371],{"class":178},[148,1434,338],{"class":161},[148,1436,346],{"class":161},[148,1438,378],{"class":161},[148,1440,260],{"class":259},[148,1442,299],{"class":165},[148,1444,325],{"class":161},[148,1446,387],{"class":243},[148,1448,311],{"class":290},[148,1450,1451,1453],{"class":150,"line":684},[148,1452,395],{"class":161},[148,1454,351],{"class":165},[133,1456,1458],{"id":1457},"custom-drain-function","Custom Drain Function",[129,1460,1461],{},"You don't need an adapter — pass any async function that accepts a batch:",[137,1463,1465],{"className":139,"code":1464,"filename":141,"language":142,"meta":143,"style":143},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog/pipeline'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const pipeline = createDrainPipeline\u003CDrainContext>({\n    batch: { size: 100 },\n  })\n\n  const drain = pipeline(async (batch) => {\n    await fetch('https://your-service.com/logs', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\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",[145,1466,1467,1487,1505,1509,1529,1549,1568,1574,1578,1602,1622,1638,1665,1709,1716,1722,1726,1752,1786],{"__ignoreMap":143},[148,1468,1469,1471,1473,1475,1477,1479,1481,1483,1485],{"class":150,"line":151},[148,1470,155],{"class":154},[148,1472,158],{"class":154},[148,1474,162],{"class":161},[148,1476,166],{"class":165},[148,1478,169],{"class":161},[148,1480,172],{"class":154},[148,1482,175],{"class":161},[148,1484,179],{"class":178},[148,1486,182],{"class":161},[148,1488,1489,1491,1493,1495,1497,1499,1501,1503],{"class":150,"line":185},[148,1490,155],{"class":154},[148,1492,162],{"class":161},[148,1494,192],{"class":165},[148,1496,169],{"class":161},[148,1498,172],{"class":154},[148,1500,175],{"class":161},[148,1502,201],{"class":178},[148,1504,182],{"class":161},[148,1506,1507],{"class":150,"line":206},[148,1508,231],{"emptyLinePlaceholder":230},[148,1510,1511,1513,1515,1517,1519,1521,1523,1525,1527],{"class":150,"line":227},[148,1512,237],{"class":154},[148,1514,240],{"class":154},[148,1516,244],{"class":243},[148,1518,247],{"class":165},[148,1520,247],{"class":161},[148,1522,253],{"class":252},[148,1524,256],{"class":161},[148,1526,260],{"class":259},[148,1528,263],{"class":161},[148,1530,1531,1533,1535,1537,1539,1541,1543,1545,1547],{"class":150,"line":234},[148,1532,269],{"class":259},[148,1534,272],{"class":165},[148,1536,275],{"class":161},[148,1538,192],{"class":243},[148,1540,280],{"class":161},[148,1542,284],{"class":283},[148,1544,287],{"class":161},[148,1546,247],{"class":290},[148,1548,563],{"class":161},[148,1550,1551,1553,1555,1557,1560,1562,1565],{"class":150,"line":266},[148,1552,568],{"class":290},[148,1554,571],{"class":161},[148,1556,162],{"class":161},[148,1558,1559],{"class":290}," size",[148,1561,571],{"class":161},[148,1563,1564],{"class":583}," 100",[148,1566,1567],{"class":161}," },\n",[148,1569,1570,1572],{"class":150,"line":294},[148,1571,777],{"class":161},[148,1573,351],{"class":290},[148,1575,1576],{"class":150,"line":314},[148,1577,231],{"emptyLinePlaceholder":230},[148,1579,1580,1582,1584,1586,1588,1590,1592,1594,1596,1598,1600],{"class":150,"line":319},[148,1581,269],{"class":259},[148,1583,299],{"class":165},[148,1585,275],{"class":161},[148,1587,272],{"class":243},[148,1589,247],{"class":290},[148,1591,1331],{"class":259},[148,1593,704],{"class":161},[148,1595,1336],{"class":252},[148,1597,256],{"class":161},[148,1599,260],{"class":259},[148,1601,263],{"class":161},[148,1603,1604,1606,1609,1611,1613,1616,1618,1620],{"class":150,"line":354},[148,1605,1347],{"class":154},[148,1607,1608],{"class":243}," fetch",[148,1610,247],{"class":290},[148,1612,338],{"class":161},[148,1614,1615],{"class":178},"https://your-service.com/logs",[148,1617,338],{"class":161},[148,1619,346],{"class":161},[148,1621,263],{"class":161},[148,1623,1624,1627,1629,1631,1634,1636],{"class":150,"line":392},[148,1625,1626],{"class":290},"      method",[148,1628,571],{"class":161},[148,1630,175],{"class":161},[148,1632,1633],{"class":178},"POST",[148,1635,338],{"class":161},[148,1637,633],{"class":161},[148,1639,1640,1643,1645,1647,1649,1652,1654,1656,1658,1661,1663],{"class":150,"line":622},[148,1641,1642],{"class":290},"      headers",[148,1644,571],{"class":161},[148,1646,162],{"class":161},[148,1648,175],{"class":161},[148,1650,1651],{"class":290},"Content-Type",[148,1653,338],{"class":161},[148,1655,571],{"class":161},[148,1657,175],{"class":161},[148,1659,1660],{"class":178},"application/json",[148,1662,338],{"class":161},[148,1664,1567],{"class":161},[148,1666,1667,1670,1672,1675,1677,1680,1682,1684,1686,1689,1691,1694,1696,1699,1701,1704,1707],{"class":150,"line":636},[148,1668,1669],{"class":290},"      body",[148,1671,571],{"class":161},[148,1673,1674],{"class":165}," JSON",[148,1676,325],{"class":161},[148,1678,1679],{"class":243},"stringify",[148,1681,247],{"class":290},[148,1683,1336],{"class":165},[148,1685,325],{"class":161},[148,1687,1688],{"class":243},"map",[148,1690,247],{"class":290},[148,1692,1693],{"class":252},"ctx",[148,1695,260],{"class":259},[148,1697,1698],{"class":165}," ctx",[148,1700,325],{"class":161},[148,1702,1703],{"class":165},"event",[148,1705,1706],{"class":290},"))",[148,1708,633],{"class":161},[148,1710,1711,1714],{"class":150,"line":653},[148,1712,1713],{"class":161},"    }",[148,1715,351],{"class":290},[148,1717,1718,1720],{"class":150,"line":666},[148,1719,777],{"class":161},[148,1721,351],{"class":290},[148,1723,1724],{"class":150,"line":679},[148,1725,231],{"emptyLinePlaceholder":230},[148,1727,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750],{"class":150,"line":684},[148,1729,322],{"class":165},[148,1731,325],{"class":161},[148,1733,328],{"class":165},[148,1735,325],{"class":161},[148,1737,333],{"class":243},[148,1739,247],{"class":290},[148,1741,338],{"class":161},[148,1743,341],{"class":178},[148,1745,338],{"class":161},[148,1747,346],{"class":161},[148,1749,299],{"class":165},[148,1751,351],{"class":290},[148,1753,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1782,1784],{"class":150,"line":696},[148,1755,322],{"class":165},[148,1757,325],{"class":161},[148,1759,328],{"class":165},[148,1761,325],{"class":161},[148,1763,333],{"class":243},[148,1765,247],{"class":290},[148,1767,338],{"class":161},[148,1769,371],{"class":178},[148,1771,338],{"class":161},[148,1773,346],{"class":161},[148,1775,378],{"class":161},[148,1777,260],{"class":259},[148,1779,299],{"class":165},[148,1781,325],{"class":161},[148,1783,387],{"class":243},[148,1785,311],{"class":290},[148,1787,1788,1790],{"class":150,"line":721},[148,1789,395],{"class":161},[148,1791,351],{"class":165},[133,1793,1795],{"id":1794},"standalone-usage-without-nitro","Standalone Usage (Without Nitro)",[129,1797,1798,1799,1802,1803,1806],{},"The pipeline works outside of Nitro. Use the ",[145,1800,1801],{},"drain"," option in ",[145,1804,1805],{},"initLogger"," to wire it up:",[137,1808,1811],{"className":139,"code":1809,"filename":1810,"language":142,"meta":143,"style":143},"import type { DrainContext } from 'evlog'\nimport { initLogger, log } from 'evlog'\nimport { createDrainPipeline } from 'evlog/pipeline'\nimport { createAxiomDrain } from 'evlog/axiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 25 } })\nconst drain = pipeline(createAxiomDrain())\n\ninitLogger({ drain })\n\nlog.info({ action: 'started' }) // batched and drained\n\n// Flush before exit\nawait drain.flush()\n","index.ts",[145,1812,1813,1833,1857,1875,1893,1897,1941,1958,1962,1976,1980,2014,2018,2023],{"__ignoreMap":143},[148,1814,1815,1817,1819,1821,1823,1825,1827,1829,1831],{"class":150,"line":151},[148,1816,155],{"class":154},[148,1818,158],{"class":154},[148,1820,162],{"class":161},[148,1822,166],{"class":165},[148,1824,169],{"class":161},[148,1826,172],{"class":154},[148,1828,175],{"class":161},[148,1830,179],{"class":178},[148,1832,182],{"class":161},[148,1834,1835,1837,1839,1842,1844,1847,1849,1851,1853,1855],{"class":150,"line":185},[148,1836,155],{"class":154},[148,1838,162],{"class":161},[148,1840,1841],{"class":165}," initLogger",[148,1843,346],{"class":161},[148,1845,1846],{"class":165}," log",[148,1848,169],{"class":161},[148,1850,172],{"class":154},[148,1852,175],{"class":161},[148,1854,179],{"class":178},[148,1856,182],{"class":161},[148,1858,1859,1861,1863,1865,1867,1869,1871,1873],{"class":150,"line":206},[148,1860,155],{"class":154},[148,1862,162],{"class":161},[148,1864,192],{"class":165},[148,1866,169],{"class":161},[148,1868,172],{"class":154},[148,1870,175],{"class":161},[148,1872,201],{"class":178},[148,1874,182],{"class":161},[148,1876,1877,1879,1881,1883,1885,1887,1889,1891],{"class":150,"line":227},[148,1878,155],{"class":154},[148,1880,162],{"class":161},[148,1882,213],{"class":165},[148,1884,169],{"class":161},[148,1886,172],{"class":154},[148,1888,175],{"class":161},[148,1890,222],{"class":178},[148,1892,182],{"class":161},[148,1894,1895],{"class":150,"line":234},[148,1896,231],{"emptyLinePlaceholder":230},[148,1898,1899,1902,1905,1908,1910,1912,1914,1916,1918,1921,1924,1926,1928,1930,1932,1935,1937,1939],{"class":150,"line":266},[148,1900,1901],{"class":259},"const",[148,1903,1904],{"class":165}," pipeline ",[148,1906,1907],{"class":161},"=",[148,1909,192],{"class":243},[148,1911,280],{"class":161},[148,1913,284],{"class":283},[148,1915,287],{"class":161},[148,1917,247],{"class":165},[148,1919,1920],{"class":161},"{",[148,1922,1923],{"class":290}," batch",[148,1925,571],{"class":161},[148,1927,162],{"class":161},[148,1929,1559],{"class":290},[148,1931,571],{"class":161},[148,1933,1934],{"class":583}," 25",[148,1936,169],{"class":161},[148,1938,169],{"class":161},[148,1940,351],{"class":165},[148,1942,1943,1945,1948,1950,1952,1954,1956],{"class":150,"line":294},[148,1944,1901],{"class":259},[148,1946,1947],{"class":165}," drain ",[148,1949,1907],{"class":161},[148,1951,272],{"class":243},[148,1953,247],{"class":165},[148,1955,308],{"class":243},[148,1957,311],{"class":165},[148,1959,1960],{"class":150,"line":314},[148,1961,231],{"emptyLinePlaceholder":230},[148,1963,1964,1966,1968,1970,1972,1974],{"class":150,"line":319},[148,1965,1805],{"class":243},[148,1967,247],{"class":165},[148,1969,1920],{"class":161},[148,1971,1947],{"class":165},[148,1973,395],{"class":161},[148,1975,351],{"class":165},[148,1977,1978],{"class":150,"line":354},[148,1979,231],{"emptyLinePlaceholder":230},[148,1981,1982,1985,1987,1990,1992,1994,1997,1999,2001,2004,2006,2008,2011],{"class":150,"line":392},[148,1983,1984],{"class":165},"log",[148,1986,325],{"class":161},[148,1988,1989],{"class":243},"info",[148,1991,247],{"class":165},[148,1993,1920],{"class":161},[148,1995,1996],{"class":290}," action",[148,1998,571],{"class":161},[148,2000,175],{"class":161},[148,2002,2003],{"class":178},"started",[148,2005,338],{"class":161},[148,2007,169],{"class":161},[148,2009,2010],{"class":165},") ",[148,2012,2013],{"class":589},"// batched and drained\n",[148,2015,2016],{"class":150,"line":622},[148,2017,231],{"emptyLinePlaceholder":230},[148,2019,2020],{"class":150,"line":636},[148,2021,2022],{"class":589},"// Flush before exit\n",[148,2024,2025,2028,2030,2032,2034],{"class":150,"line":653},[148,2026,2027],{"class":154},"await",[148,2029,299],{"class":165},[148,2031,325],{"class":161},[148,2033,387],{"class":243},[148,2035,291],{"class":165},[399,2037,2040,2041,2048],{"color":2038,"icon":2039},"neutral","i-lucide-arrow-right","See the full ",[2042,2043,2047],"a",{"href":2044,"rel":2045},"https://github.com/HugoRCD/evlog/tree/main/examples/bun-script",[2046],"nofollow","bun-script example"," for a complete working script.",[133,2050,2052],{"id":2051},"next-steps","Next Steps",[2054,2055,2056,2062,2067],"ul",{},[416,2057,2058,2061],{},[2042,2059,2060],{"href":62},"Adapters Overview"," - Available built-in adapters",[416,2063,2064,2066],{},[2042,2065,91],{"href":92}," - Build your own drain function",[416,2068,2069,2071],{},[2042,2070,46],{"href":47}," - Security and production tips",[2073,2074,2075],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":143,"searchDepth":185,"depth":185,"links":2077},[2078,2079,2080,2083,2084,2085,2086,2087,2088],{"id":135,"depth":185,"text":20},{"id":410,"depth":185,"text":411},{"id":456,"depth":185,"text":457,"children":2081},[2082],{"id":879,"depth":206,"text":880},{"id":1029,"depth":185,"text":1030},{"id":1088,"depth":185,"text":1089},{"id":1159,"depth":185,"text":1160},{"id":1457,"depth":185,"text":1458},{"id":1794,"depth":185,"text":1795},{"id":2051,"depth":185,"text":2052},"Batch events, retry on failure, and protect against buffer overflow with the shared drain pipeline.","md",[2092,2094],{"label":2060,"icon":64,"to":62,"color":2038,"variant":2093},"subtle",{"label":91,"icon":94,"to":92,"color":2038,"variant":2093},{},{"title":96,"icon":99},{"title":124,"description":2089},"aSgd0otu92tXT1s6JF67pnLXApl4s1a-a2zDt66hsWQ",[2100,2102],{"title":91,"path":92,"stem":93,"description":2101,"icon":94,"children":-1},"Build your own adapter to send logs to any destination. Factory patterns, batching, filtering, and error handling best practices.",{"title":101,"path":102,"stem":103,"description":2103,"icon":104,"children":-1},"Framework-agnostic browser log transport — send client-side logs to your server via fetch or sendBeacon.",1771100328462]