我们有一个应用程序,我们设置了几个Azure WebJobs,我们设置了NLog来报告这些webjobs的进入和退出。我们将NLog连接到Stackify,以便我们可以使用Stackify记录器观察从WebJob到WebJob的事物。记录工作(所以我们知道配置没问题)。我们遇到的问题是日志记录是间歇性的 - 我们对沿着几个WebJobs传输的消息进行了独立确认,但我们只会获得部分日志记录。例如,第一个日志将记录从中读取消息,但不会显示退出消息。下一个日志将显示进入和退出。问题是它们都使用完全相同的代码,因此每次都应出现相同的日志消息。有没有其他人遇到过这个问题?在您回答之前,我们采取了以下诊断步骤:
(1)我们已在所有webjob配置文件中验证了正确的配置设置。
(2)我们已经验证所有webjob配置文件都在Azure中正确发布。
(3)我们已经独立验证(通过Azure中的webjob控制台)消息进入不同的webjobs,处理,然后转到下一个webjob,这意味着他们将调用日志代码。
(4)我们已经验证我们的Stackify日志数据没有被限制(如果日志已经停止,这可能是有意义的 - 但事实上我们只是在某些情况下获得部分日志记录并在单个消息传输期间完全记录其他日志这不太可能。)
(5)我们仔细研究了Stackify文档,这似乎可以确保正确设置配置,以便您可以进行日志记录。它涵盖了全有或全无的情况,但不包括某些情景。
我很乐意根据需要提供更多说明。
答案 0 :(得分: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,并再次遇到同样的问题。 Matt - 关于Shutdown的观点 - 我们将把它添加到我们的webjobs中,然后我将监视我们是否看到完整的日志。谢谢大家的建议!
答案 1 :(得分:1)
您应该能够通过在应用程序末尾添加一行代码来解决此问题,以便StackifyLib进行刷新。
StackifyLib.Logger.Shutdown();
https://github.com/stackify/stackify-api-dotnet/blob/master/README.md
我希望这可以为您解决,如果没有,请联系Stackify支持。
答案 2 :(得分:0)
对NLog-config的例子可能会很好。如果使用async-wrapper,则默认情况下溢出操作是丢弃“随机”消息。