1

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

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

我已经通过适当的 NuGet 包将 Application Insights 添加到项目中,这些包更新了web.config适合httpModules一般异常处理的。我什至可以添加自定义TelemetryInitializerApplication_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 中不是)。

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

  1. 我可以WcfServiceFactory使用现有的 App Insights 日志记录吗?也许建立一些东西Global.asx
  2. 如何在WcfServiceFactory包含自定义遥测时手动将 App Insights 注册为提供者?
4

1 回答 1

0

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

var telemetryClient = new TelemetryClient(TelemetryConfiguration.Active);
telemetryClient.TrackException(new Exception("Logged random exception message."));
于 2021-02-03T17:10:14.903 回答