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