问题描述
我有一个不幸的任务是将 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 中不是)。
所以我想我的问题归结为以下问题
- 我能否获得
WcfServiceFactory
以使用现有的 App Insights 日志记录?也许在Global.asx
建立一些东西? - 如何在包括自定义遥测在内的
WcfServiceFactory
中手动将 App Insights 注册为提供程序?
解决方法
如果只是为了记录自定义错误,则无需使用 ILogger。您可以使用遥测客户端直接在 AppInsights 上记录异常,如下所示:
var telemetryClient = new TelemetryClient(TelemetryConfiguration.Active);
telemetryClient.TrackException(new Exception("Logged random exception message."));