Как добавить аналитику приложений в ILogger для Unity DI в службу WCF

#wcf #unity-container #azure-application-insights #ilogger

#wcf #unity-контейнер #azure-application-insights #ilogger

Вопрос:

У меня есть неудачная задача обновления проекта WCF до .NET Framework 4.8 и замены существующей обработки исключений log4net на Microsoft Logging и Application Insights.

Мой подход заключался в реализации внедрения зависимостей, чтобы упростить создание экземпляра, и потому, что я уже привык к такому подходу к проектированию с .NET Core. Как вы, возможно, знаете, службы WCF добавляют свои сложности, поскольку WCF отвечает за создание экземпляров служб и объектов более низкого уровня (например, пользовательских customUserNamePasswordValidatorType ). Я смог справиться с большей частью этого, внедрив фабрику служб WCF и обновив с ее помощью разметку svc.

Я добавил аналитику приложений в проект с помощью соответствующих пакетов NuGet, которые обновляют web.config с помощью, подходящей httpModules для общей обработки исключений. Я даже смог добавить пользовательский TelemetryInitializer Application_Start элемент, чтобы включить в сообщение несколько пользовательских свойств.

Моя проблема заключается в получении экземпляра ILogger<T> с подключенным поставщиком Application Insights в созданный экземпляр службы.

Сначала я получал исключение из-за конструктора Logger<T> без параметров . Это было исправлено путем обновления моего WcfServiceFactory до следующего

 container
    ...
    .RegisterType<ILoggerFactory, LoggerFactory>(TypeLifetime.Singleton)
    .RegisterType(typeof(ILogger<>), typeof(Logger<>), TypeLifetime.Singleton);
 

Это позволило передать экземпляр регистратора в конструктор каждой службы. Однако вызовы сообщений журнала никогда не записываются в App Insights, а проверка регистратора показывает нулевых поставщиков.

Я предполагаю, что, поскольку создается новый экземпляр LoggerFactory , уже существующий экземпляр, используемый в httpModules , игнорируется.

Согласно https://github.com/unitycontainer/microsoft-logging , мне нужно реорганизовать то, что я делаю, и фактически создать экземпляр a LoggerFactory и вручную добавить нужных поставщиков. Моя проблема в том, что я не могу понять, как это сделать с помощью Application Insights. Везде, где я его использовал, я бы просто вызывал метод AddApplicationInsights() расширения, но здесь это, похоже, не вариант (по крайней мере, не с Unity).

Итак, я предполагаю, что моя проблема сводится к следующим вопросам

  1. Могу ли я получить WcfServiceFactory доступ к использованию существующего ведения журнала App Insights? Может быть, установить что-нибудь внутри Global.asx ?
  2. Как я могу вручную зарегистрировать App Insights в качестве поставщика, WcfServiceFactory включая пользовательскую телеметрию?

Ответ №1:

Нет необходимости использовать ILogger, если целью является просто регистрация пользовательской ошибки. Вы можете регистрировать исключения в AppInsights напрямую, используя клиент телеметрии, например:

 var telemetryClient = new TelemetryClient(TelemetryConfiguration.Active);
telemetryClient.TrackException(new Exception("Logged random exception message."));
 

Комментарии:

1. Это решение потенциально вызывает две проблемы: (1) Оно не использует внедрение зависимостей, как остальная часть моего сайта. Нужно было бы посмотреть, можно ли ввести TelemetryClient или у меня все еще такая же проблема, и (2) обычно при использовании ILogger<T> вы подключаете несколько провайдеров … скажем, AppInsights и Serilog (для ведения журнала файлов). При непосредственном создании экземпляра TelemetryClient будет отсутствовать ведение журнала файлов.