如何将记录器(例如 NLog、log4net 等)与 Dynamics CRM 2011 ITracingService 集成?

问题描述 投票:0回答:1

背景

我花费了大量时间编写自定义操作(代码活动类),偶尔还为 Dynamics CRM 2011 本地应用程序编写插件。 Dynamics 中的所有日志记录都是通过 ITracingService 接口完成的,该接口只有一个名为 Trace 的方法。 Trace 将所有消息输出到某个东西(缓冲区、字符串生成器等)中,一旦操作或插件执行完毕,该东西就会将内容转储到 PluginTraceLog 记录中。

我不知道是否可以通过调用控制台和跟踪/调试来完成任何事情,但足以说明这些不是可行的日志记录选项。

最近,我发现自己在一些类中记录了太多信息,以至于我开始编写特殊的“打印”函数,这些函数仅在布尔值设置为 true 时才记录消息。不用说,这是一个糟糕的设计,乏味,并且是一个好兆头,表明我应该集成一个记录器以具有不同级别的日志记录。

问题

其中一个问题是我不知道 ITracingService 是如何实现的,所以我不知道是否有办法将记录器(现在让我们继续使用 NLog)挂接到 TracingService 中。

我知道 NLog 提供了创建自定义目标的方法,但是在阅读了大量其文档后,我没有找到将 TracingService 注入记录器以便将其用作 Write() 函数的基础的方法。该文档似乎假设您想要传递的唯一参数是简单的原语(例如您想要定位的 Web 服务的 URL)。

  1. 有谁知道我如何构建一个自定义目标,其 Write 函数围绕 ITracingService.Trace 函数?

  2. 顺便说一句,假设这样的实现是可能的,有人知道如何以线程安全的方式实例化记录器吗?我读过的大多数帖子强烈建议将记录器声明为静态变量。问题是我不能 100% 确定这是否会在 IPlugin 或 CodeActivity 的生命周期中发挥良好作用,因为 Microsoft 强烈建议将插件和操作设为无状态。

c# dynamics-crm-2011 microsoft-dynamics nlog
1个回答
0
投票

经过大量研究后,我最终在此页面上遇到了这行代码:

NLog.LogManager.Setup().SetupExtensions(ext => RegisterTarget<MyTarget>(() => new MyTarget(wantedDependency))

所以本质上,实际上有一种方法(从 NLog 5.2 开始)可以传入自定义工厂函数来用对象初始化 Target。

另外,它还提出了一种在 5.2 中已弃用的使用 CreateInstance 函数的方法:

using NLog.Config;

var defaultConstructor = ConfigurationItemFactory.Default.CreateInstance;

ConfigurationItemFactory.Default.CreateInstance.CreateInstance = type =>
{
   if (type == typeof(MyCustomTarget))
       return new MyCustomTarget(myCustomParameter);
   
   return defaultConstructor(type);
};

最终,这并不重要,因为我无法成功地将 NLog 程序集与我自己的程序集合并。大约有一半的时间我的包会变得混乱,因此 MSBuild.ILMerge.Task 不会向 in\Debug 文件夹输出任何内容。

恢复所有 NuGet 包后,它会再次工作,但仍然无法对合并的程序集进行签名。我怀疑这是因为我们的项目使用 .pfx 文件而不是 .snk 进行签名,但我不知道为什么会这样。我们的另一个项目使用 .snk 并且能够很好地使用 ILMerge。

无论如何,插件注册工具都不会接受合并的程序集,因为它没有强命名,所以我最终放弃了。

© www.soinside.com 2019 - 2024. All rights reserved.