NLog Raygun - 如何在调用 SendInBackground 时捕获异常
NLog Raygun - How to catch exception when calling SendInBackground
我从 Mindscape 中分叉了 NLog Raygun,以在 NLog 中提供更多 Raygun 设置。
创建了一个 RaygunTarget,需要重写 Write
方法,如下 NLog 文档 (https://github.com/NLog/NLog/wiki/How-to-write-a-custom-target)。
要向 Raygun 发送异常,请遵循以下代码
protected override void Write(LogEventInfo logEvent)
{
_raygunClient ??= (_raygunClient = CreateRaygunClient());
...
_raygunClient.SendInBackground(exception, tags, userCustomData);
}
SendInBackground
returns 我们不能将 Write
方法标记为 async void
的任务,因为它不是使用 async void
的情况。
一切正常。我们大摇大摆地拥有 Healthcheck。我想检查 NLog Raygun 是否发送成功,但我不知道如何在 SendInBackground
中捕获异常以防 API 密钥无效。我的意思是有没有更好的方法来测试这个RaygunTarget是否可以成功发送消息到Raygun?
如果我提供一个名为 ThrowOnError 的设置并在 Write
方法中更新为这样
protected override void Write(LogEventInfo logEvent)
{
_raygunClient ??= (_raygunClient = CreateRaygunClient());
...
var task = _raygunClient.SendInBackground(exception, tags, userCustomData);
if (_setting.ThrowOnError) task.Wait();
}
它有效,但问题是:这是实现此目的的好方法吗?就个人而言,我认为这不是因为它根据设置引入了不同的行为或副作用。
而不是从 TargetWithLayout
继承,那么您可以从 AsyncTaskTarget
继承:
protected override Task WriteAsyncTask(LogEventInfo logEvent, CancellationToken token)
{
_raygunClient ??= (_raygunClient = CreateRaygunClient());
...
var userCustomData = base.GetAllProperties(logEvent);
return _raygunClient.SendInBackground(exception, tags, userCustomData);
}
另请参阅:https://github.com/NLog/NLog/wiki/How-to-write-a-custom-async-target
然后您可以使用 InternalLogger.LogWriter
连接到 NLog InternalLogger,并转发到 healthcheck-api。
我们计划改进 NLog 5.0 的 API,这样人们就可以订阅一个 InternalLogger-Event 并且还可以获得更多上下文详细信息。如目标名称、目标类型等。另请参阅:https://github.com/NLog/NLog/issues/3350
我从 Mindscape 中分叉了 NLog Raygun,以在 NLog 中提供更多 Raygun 设置。
创建了一个 RaygunTarget,需要重写 Write
方法,如下 NLog 文档 (https://github.com/NLog/NLog/wiki/How-to-write-a-custom-target)。
要向 Raygun 发送异常,请遵循以下代码
protected override void Write(LogEventInfo logEvent)
{
_raygunClient ??= (_raygunClient = CreateRaygunClient());
...
_raygunClient.SendInBackground(exception, tags, userCustomData);
}
SendInBackground
returns 我们不能将 Write
方法标记为 async void
的任务,因为它不是使用 async void
的情况。
一切正常。我们大摇大摆地拥有 Healthcheck。我想检查 NLog Raygun 是否发送成功,但我不知道如何在 SendInBackground
中捕获异常以防 API 密钥无效。我的意思是有没有更好的方法来测试这个RaygunTarget是否可以成功发送消息到Raygun?
如果我提供一个名为 ThrowOnError 的设置并在 Write
方法中更新为这样
protected override void Write(LogEventInfo logEvent)
{
_raygunClient ??= (_raygunClient = CreateRaygunClient());
...
var task = _raygunClient.SendInBackground(exception, tags, userCustomData);
if (_setting.ThrowOnError) task.Wait();
}
它有效,但问题是:这是实现此目的的好方法吗?就个人而言,我认为这不是因为它根据设置引入了不同的行为或副作用。
而不是从 TargetWithLayout
继承,那么您可以从 AsyncTaskTarget
继承:
protected override Task WriteAsyncTask(LogEventInfo logEvent, CancellationToken token)
{
_raygunClient ??= (_raygunClient = CreateRaygunClient());
...
var userCustomData = base.GetAllProperties(logEvent);
return _raygunClient.SendInBackground(exception, tags, userCustomData);
}
另请参阅:https://github.com/NLog/NLog/wiki/How-to-write-a-custom-async-target
然后您可以使用 InternalLogger.LogWriter
连接到 NLog InternalLogger,并转发到 healthcheck-api。
我们计划改进 NLog 5.0 的 API,这样人们就可以订阅一个 InternalLogger-Event 并且还可以获得更多上下文详细信息。如目标名称、目标类型等。另请参阅:https://github.com/NLog/NLog/issues/3350