在工作中,我负责维护在多个服务器上运行的许多Windows服务。在部署之后,当服务开始加载时,某些东西变得混乱并且某些dll或其他不存在,导致它立即终止。现在,我意识到这应该通过适当的构建和部署过程来修复,而不是我们当前的贫民窟方法。我们正在研究这个角度,但它仍然突出了我的知识差距,这就是我在这里问的原因。本质上,当此服务无法加载时,它没有给出任何错误的指示,包括在应用程序日志文件(nlog)中。有没有办法在应用程序生命周期中尽早挂钩到Windows服务应用程序以捕获此类事物并将其记录到某处(或者,已经记录此内容的其他一些机制)以进行故障排除?
我问的原因是,由于业务限制,我经常在晚上进行部署。我喜欢有一些能快速告诉我如何搞砸的东西,而不是坐在那里试图找出哪个dll丢失,或者哪个绑定重定向被抬起。我想回家喝啤酒而不是打湿护士去服务失败。任何人都有关于我可以在哪里烘烤这种东西的想法,以便我可以将上述啤酒送到它的制造商那里?
答案 0 :(得分:3)
您应该使用Fuslogvw.exe(也就是装配绑定日志查看器)。
来自MSDN:
装配绑定日志查看器显示装配绑定的详细信息。 此信息可帮助您诊断.NET Framework无法解决的原因 在运行时找到一个程序集。
答案 1 :(得分:2)
下载.NET开发人员SDK。在其中你会找到fuslogvw.exe。这是Fusion输出的查看器,Fusion是负责解析类型的组件。它将告诉您正在查找的程序集,扫描特定程序集的序列文件夹,尝试加载的文件夹以及拒绝特定dll的原因。
答案 2 :(得分:1)
虽然在部署之前显然没有替换正确的测试(即在虚拟机上使用干净的OS映像会显示很多问题)......
要检测并解决“程序集丢失”故障,请启用融合日志并使用它,查看博客文章 Fuslogvw.exe and diagnosing .NET assembly binding issues 。作为权宜之计,您可以在所有服务器上启用它(我也建议不要这样做)。
答案 3 :(得分:0)
我相信Windows事件日志,特别是应用程序日志,会告诉您缺少的内容。
答案 4 :(得分:0)
当Windows服务崩溃时,它通常会在Windows EventLog中写入有关错误的一些信息。你可以在那里查看。
否则,您应该将记录器连接到AppDomain.UnhandledException
事件以捕获任何未公开的异常。尽早做到这一点,你可以记录你的错误。
如果您知道错误是由于dll丢失或错误造成的,您还可以在AppDomain.AssemblyResolve
事件中捕获这些错误。