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