NLog Raygun - Как перехватить исключение при вызове SendInBackground - PullRequest
0 голосов
/ 13 февраля 2020

Я разбудил NLog Raygun из Mindscape, чтобы предоставить больше настроек Raygun в NLog.

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.

Все отлично работает. У нас есть чванство для проверки здоровья. Я хочу проверить, успешно ли отправлено приложение 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();
}

Это работает, но вопрос: это хороший способ сделать это? Лично я думаю, что это не потому, что он вводит другое поведение или побочный эффект в зависимости от настроек.

1 Ответ

2 голосов
/ 13 февраля 2020

Вместо наследования от 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.

Существуют планы по улучшению API для NLog 5.0, чтобы можно было подписаться на InternalLogger-Event, а также получить больше деталей контекста. Как Target-Name, Target-Type et c. Смотрите также: https://github.com/NLog/NLog/issues/3350

...