NLog 目标中的 HttpClient
HttpClient in an NLog target
我需要创建一个使用 HttpClient 的 Target。 HttpClient 不包含任何同步方法,它们都是 Task 返回 Async 调用。在 NLog 目标中使用它的最佳方法是什么,因为 api 似乎没有 async/await 意识到?
如果你想让事情变得简单,那么你可以在异步任务上做一个 Wait() 。然后只需使用 AsyncTargetWrapper 包装您的自定义目标。那么你也不必担心有太多活跃的http请求。
但 NLog 对执行延迟日志写入操作的目标没有问题。唯一需要的合同是在延迟的日志写入操作最终完成后调用与 LogEventInfo 一起提供的异步继续(也许看看 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
我需要创建一个使用 HttpClient 的 Target。 HttpClient 不包含任何同步方法,它们都是 Task 返回 Async 调用。在 NLog 目标中使用它的最佳方法是什么,因为 api 似乎没有 async/await 意识到?
如果你想让事情变得简单,那么你可以在异步任务上做一个 Wait() 。然后只需使用 AsyncTargetWrapper 包装您的自定义目标。那么你也不必担心有太多活跃的http请求。
但 NLog 对执行延迟日志写入操作的目标没有问题。唯一需要的合同是在延迟的日志写入操作最终完成后调用与 LogEventInfo 一起提供的异步继续(也许看看 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