NLog目标中的HttpClient
本文关键字:HttpClient 目标 NLog | 更新日期: 2023-09-27 18:18:33
我需要创建一个使用HttpClient的目标。HttpClient不包含任何同步方法,它们都是返回异步调用的任务。在NLog目标中使用它的最佳方法是什么,因为api似乎不支持async/await ?
更新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