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