NLog目标中的HttpClient

本文关键字:HttpClient 目标 NLog | 更新日期: 2023-09-27 18:18:33

我需要创建一个使用HttpClient的目标。HttpClient不包含任何同步方法,它们都是返回异步调用的任务。在NLog目标中使用它的最佳方法是什么,因为api似乎不支持async/await ?

NLog目标中的HttpClient

更新NLog 4.6

NLog 4.6引入AsyncTaskTarget,确保正确的排序,也使批处理变得容易。

老答:

也许像这样的东西应该工作:

public class CustomTarget : Target
{
protected override async void Write(NLog.Common.AsyncLogEventInfo logEvent)
{
    try
    {
           await WriteAsync(logEvent.LogEvent).ConfigureAwait(false);
           logEvent.Continuation(null);
    }
    catch (Exception ex)
    {
          InternalLogger.Error(ex, "Failed to sent message");
          logEvent.Continuation(ex);
    }
}
}

或者从这个PR窃取代码:https://github.com/NLog/NLog/pull/2006

如果你想让事情变得简单,那么你可以在异步任务上执行Wait()。然后使用AsyncTargetWrapper包装您的自定义目标。然后,您也不必担心有太多的活动http请求。

但是NLog对于执行延迟日志写操作的目标没有问题。唯一需要的契约是,在延迟的日志写入操作最终完成后,与LogEventInfo一起提供的异步延续被调用(可能查看NetworkTarget以获得一些灵感)

我已经用aysnc-wrapper目标实现了httpclient。您可以从nuget包中安装和使用它https://www.nuget.org/packages/NLog.HttpClient