0

我们有一个应用程序,其中设置了多个 Azure WebJobs,并设置了 NLog 以报告这些 Webjobs 的进入和退出。我们将 NLog 连接到 Stackify,以便我们可以使用 Stackify 记录器来观察事情从 WebJob 转移到 WebJob。日志记录有效(所以我们知道配置没问题)。我们遇到的问题是日志记录是间歇性的——我们可以独立确认沿多个 WebJobs 传输的消息,但我们只会获得部分日志记录。例如,第一个日志将记录一条消息已从中读取,但不会显示退出消息。下一个日志将显示进入和退出。问题是它们都利用完全相同的代码,所以相同日志消息应该每次出现。以前有没有其他人遇到过这个问题?在您回答之前,我们已采取以下诊断步骤:

(1) 我们已经验证了所有 webjob 配置文件中的正确配置设置。

(2) 我们已验证所有 webjob 配置文件都已正确发布在 Azure 中。

(3) 我们已独立验证(通过 Azure 中的 Web 作业控制台)消息正在到达不同的 Web 作业、处理,然后转到下一个 Web 作业,这意味着它们将调用日志记录代码。

(4) 我们已经验证了我们的 Stackify 日志数据没有受到限制(如果日志只是停止,这可能是有道理的 - 但事实上我们在某些情况下只是获得部分日志记录,而在单个消息传输期间完全记录其他情况使这不太可能)。

(5) 我们仔细研究了 Stackify 文档,该文档似乎可以确保正确设置配置,以便您完全获得日志记录。它涵盖了全有或全无的情况,但不包括某些情况。

我很乐意根据需要提供更多说明。

4

3 回答 3

2

我们发现了正在发生的事情,这很奇怪。问题最终出在我们对 NLog.Targets.Stackify 的使用上。我们使用的是 1.25.4 版本。当我使用 Julian 建议的 NLog 调试器运行测试时,结果如下:

2017-01-09 10:14:43.5079 Info Loading assembly name: NLog.Targets.Stackify
2017-01-09 10:14:43.5449 Debug ScanAssembly('NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c')
2017-01-09 10:14:43.5929 Debug Start auto loading, location: C:\Dev\AffinityMain\platform\Integrity.WebJob.Rating\bin\Debug
2017-01-09 10:14:43.5929 Info Auto loading assembly file: C:\Dev\AffinityMain\platform\Integrity.WebJob.Rating\bin\Debug\NLog.Targets.Stackify.dll
2017-01-09 10:14:43.6039 Info NLog.Targets.Stackify, Version=1.18.6200.39247, Culture=neutral, PublicKeyToken=null. File version: 1.18.*. Product version: 1.25.4.
2017-01-09 10:14:43.6039 Debug ScanAssembly('NLog.Targets.Stackify, Version=1.18.6200.39247, Culture=neutral, PublicKeyToken=null')
2017-01-09 10:14:43.6249 Warn Type load exception. Exception: System.IO.FileLoadException: Could not load file or assembly 'NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c' 

在解析配置时,紧随其后的是此错误:

System.ArgumentException: Target cannot be found: 'StackifyTarget'

文档表明 NLog 4.4 版足以运行这个库。但是,NLog 调试器表明它正在寻找版本 5.0,但没有找到它(它不会因为我们没有使用它)。现在,奇怪的是,它确实在这个版本中一次工作过,所以不知何故,对 NLog 5.0 的引用被卡在系统的某个地方,但我们找不到它,因为我们解决方案中的所有东西都在运行 NLog 4.4。我们检查了 csproj、包配置、应用程序配置、实际安装的 nuget 包——没有参考 5.0 版。

问题的答案是降级到 1.25.3。一旦我这样做,它就起作用了。然后我试图将它撞回 1.25.4,并再次遇到同样的问题。马特 - 关于关机 - 我们将把它添加到我们的网络作业中,然后我将监控我们是否看到完整的日志。谢谢大家的建议!

于 2017-01-09T16:43:05.537 回答
1

您应该能够通过在应用程序末尾添加一行代码到 StackifyLib 来刷新来解决此问题。

StackifyLib.Logger.Shutdown();

https://github.com/stackify/stackify-api-dotnet/blob/master/README.md

我希望这可以为您解决问题,如果没有,请联系 Stackify 支持。

于 2017-01-08T14:10:09.243 回答
0

使用 NLog-config 的示例可能会很好。如果使用异步包装器,则默认溢出操作是丢弃“随机”消息。

于 2017-01-08T20:15:32.817 回答