#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).
Итак, я предполагаю, что моя проблема сводится к следующим вопросам
- Могу ли я получить
WcfServiceFactory
доступ к использованию существующего ведения журнала App Insights? Может быть, установить что-нибудь внутриGlobal.asx
? - Как я могу вручную зарегистрировать 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
будет отсутствовать ведение журнала файлов.