将MSMQ端到端跟踪与WCF跟踪和应用程序级日志logging相关联
背景:
我正在解决WCF通过事务性MSMQ(使用netMsmqBinding)发送的消息似乎消失的问题。 使用WCF的代码是在我无法更改的第三方程序集中。 我对这个问题有什么线索,但是计划启用各种跟踪function,以便找出问题所在。
语境:
-
我已启用MSMQ 端到端跟踪 。 它为发送的每个消息logging两个事件。
- 将消息写入传出队列时的一个事件。 该消息包含MSMQ消息ID(由guid和整数组成,即7B476ADF-DEFD-49F2-AF5A-0CF27C5152C0 \ 6481271)。
- 当该消息通过networking发送的另一个事件。
-
我已经启用了详细的WCF跟踪 。
-
我也有应用程序级日志logging,logging应用程序代码定义的消息ID(我们称之为“应用程序消息ID”)。
-
我已经对发送的MSMQ消息启用了正面和负面的源日志logging。
-
我已在接收队列上启用日记function。
问题:
当消息丢失时,我知道丢失消息的应用程序ID(它由发送端logging)。 现在我想查看一下End-to-End跟踪来查看消息是否写入了发送队列。
如何将端到端跟踪中的事件与应用程序级日志和WCF跟踪相关联?
思路:
-
在System.Messaging中使用受pipe理的MSMQ API发送MSMQ消息时,消息的MSMQ标识在消息发送后可用。 但是,当WCF执行发送操作时,我还没有findlogging此方法的方法。 WCF跟踪logging了一个MSMQMessageId guid,但是这个值令人惊讶的不像我猜测的那样是实际的MSMQ id。 是否有可能访问实际的MSMQ消息ID并logging它?
-
将本机线程ID与应用程序级别ID和时间戳一起logging在应用程序日志中。 本机线程ID由MSMQlogging到端到端跟踪,因此这可能实际上足以关联。 如果我没有find一个更优雅的解决scheme,这是我的计划B.
你听起来像是在正确的轨道上。 但是,你可能会碰到这个:
使用SvcConfigEditor.exe
- configurationWCF详细跟踪传播活动和活动跟踪
- 为WCF MessageLoggingconfiguration“格式错误的消息,服务消息,传输消息”
使用LogEntireMessage
在最后,跟踪所有
确保你启用这些*。configuration两边,你和第三方的可执行文件。
收集您的日志文件,并将它们全部添加到SvcTraceViewer.exe
您可以configurationWindows MSMQ来感知消息的主题,以及主题是否包含关键字来激发应用程序。 此应用程序可以logging传入消息。 在发件人一方,你可以写实际的消息ID到消息的主题,并添加到主题的关键词。 在接收端应用程序可以访问实际的消息ID附近添加关键词在主题。
它看起来像你的消息被WCF丢弃,因为它是以某种方式格式不正确(即合同不匹配,超过了WCF消息大小限制之一)。
为了捕获这个错误,你可以编写一个ErrorHanlder来检查这些错误。 这里有一个链接到这样做的样本。
另外一个select,如果你使用的是Win 2008 R2或更高版本,则使用内置的毒害消息处理。 这里是一个链接到文档。
对于这个问题 ,要跟踪一个应用程序跟踪标识符的端到端:我会在消息头中传递应用程序跟踪标识( 请看这里的例子 )。
为了审计服务端的消息头,我将使用WCF的IOperationInvoker
来拦截每个调用,并审计消息头中的id。
这可以在configuration文件中进行configuration,而无需更改第三方代码。 这里是一个如何实现一个调用者以及如何在config中设置它的例子。