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