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