繁体   English   中英

NLog 目标中的 HttpClient

[英]HttpClient in an NLog target

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

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

但是 NLog 对于执行延迟日志写入操作的目标没有问题。 唯一需要的合同是在延迟的日志写入操作最终完成后调用与 LogEventInfo 一起提供的 async-continuation(也许查看 NetworkTarget 以获得一些灵感)

更新 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM