如何将 Application Insights 添加到 ILogger<T> for Unity DI 到 WCF 服务

问题描述

我有一个不幸的任务是将 WCF 项目更新到 .NET Framework 4.8,并用 Microsoft Logging 和 Application Insights 替换现有的 log4net 异常处理。

我的方法是实现依赖注入以简化实例化,因为我已经习惯了 .NET Core 的这种设计方法。您可能知道,WCF 服务增加了其自身的复杂性,因为 WCF 负责实例化服务和较低级别的对象(如自定义 customUserNamePasswordValidatorType)。通过实现 WCF 服务工厂并使用它更新 svc 标记,我能够处理大部分问题。

我已通过适当的 NuGet 程序包将 Application Insights 添加到项目中,该程序包使用适当的 web.config 更新 httpModules 以进行一般异常处理。我什至能够在 TelemetryInitializer添加自定义 Application_Start 以在消息中包含一些自定义属性

我的问题是将带有附加 Application Insights 提供程序的 ILogger<T> 实例获取到实例化服务中。

起初,由于 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,我需要重构我正在做的事情并实际创建一个LoggerFactory 的实例并手动添加所需的提供程序。我的问题是我无法弄清楚如何使用 Application Insights 做到这一点。在我使用它的其他任何地方,我只会调用 AddApplicationInsights() 扩展方法,但这似乎不是一个选项(至少在 Unity 中不是)。

所以我想我的问题归结为以下问题

  1. 我能否获得 WcfServiceFactory 以使用现有的 App Insights 日志记录?也许在Global.asx建立一些东西?
  2. 如何在包括自定义遥测在内的 WcfServiceFactory 中手动将 App Insights 注册为提供程序?

解决方法

如果只是为了记录自定义错误,则无需使用 ILogger。您可以使用遥测客户端直接在 AppInsights 上记录异常,如下所示:

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