我的不幸任务是将 WCF 项目更新到 .NET Framework 4.8 并用 Microsoft Logging 和 Application Insights 替换现有的 log4net 异常处理。
我的方法是实现依赖注入以使实例化更容易,因为我已经习惯了 .NET Core 的这种设计方法。您可能知道,WCF 服务增加了其自身的复杂性,因为 WCF 负责实例化服务和较低级别的对象(如 custom customUserNamePasswordValidatorType
)。我能够通过实现 WCF 服务工厂并使用它更新 svc 标记来处理大部分问题。
我已经通过适当的 NuGet 包将 Application Insights 添加到项目中,这些包更新了web.config
适合httpModules
一般异常处理的。我什至可以添加自定义TelemetryInitializer
以Application_Start
在消息中包含一些自定义属性。
我的问题是ILogger<T>
将附加的 Application Insights 提供程序的实例添加到实例化服务中。
起初,由于Logger<T>
. 通过将 my 更新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
? - 如何在
WcfServiceFactory
包含自定义遥测时手动将 App Insights 注册为提供者?