0

我从 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返回一个我们不能将Write方法标记为的任务,async void因为它不是使用的情况async void

一切正常。我们大摇大摆地拥有 Healthcheck。我想检查 NLog Raygun 是否发送成功,但我不知道如何SendInBackground在 API Key 无效的情况下捕获异常。我的意思是有没有更好的方法来测试这个 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();
}

它有效,但一个问题是:这是一个好方法吗?就个人而言,我认为这不是因为它引入了基于设置的不同行为或副作用。

4

1 回答 1

2

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

然后您可以使用 连接到 NLog InternalLogger InternalLogger.LogWriter,并转发到 healthcheck-api。

有计划改进 NLog 5.0 的 API,以便可以订阅 InternalLogger-Event 并且还可以获得更多上下文详细信息。像 Target-Name、Target-Type 等。另见:https ://github.com/NLog/NLog/issues/3350

于 2020-02-13T20:49:27.707 回答