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