我为解决方案构建了一个中央日志系统,该解决方案涉及使用WCF在多个专用队列(MSMQ)上路由和处理消息。在WCF服务的合同方法中,我做了一些日志记录。这里有一些简短的代码来说明:
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ReceiveMessage(MsmqMessage<MyMessageContainer> msg)
{
try{
Logger.Log(LogLevel.DEBUG, "Message Processing...");
// process the message here
Logger.Log(LogLevel.DEBUG, "Message Processed.");
}
catch(Exception exp) {
Logger.LogError(exp);
throw exp;
}
}
这一切都不是惊天动地。 Logger本身写入事务队列,因此当抛出异常时,不仅将入站消息放回队列,记录器消息也不会被放入队列中。因此,无论外部事务中发生了什么,所有Logger消息都会被写入,我在Logger.Log方法中完成了以下操作(再次,简化):
public void Log(LogLevel level, string message)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
{
// write message to log queue
}
}
这一切似乎都有效。我知道有些人会遵循“如果它有效,那是对的”理念,但我想知道这个解决方案是否有任何重大缺陷,或者我能做些什么更好?注意:我正在将代码部署到MSMQ 3和4,并构建在Framework v4.x上。