记录整个SOAP请求或仅记录参数?

时间:2013-05-08 06:33:17

标签: c# .net wcf sqlite logging

我有同步应用程序,它每10秒向Web服务发送一次请求,并在本地数据库中生成一些数据,反之亦然。为了方便和解决一些争议,我想记录任何一对请求和响应SOAP消息。

但是正如我的经验告诉我的那样,它会占用大量空间,填充SQLite数据库并提供相同的请求和响应。

如何以更少的磁盘空间实现相同级别的日志分离? 事实上,记录整个消息是否有好处?也许我们可以只删除参数值并记录它而不是完整的消息?

也许有另一种机制可以压缩消息(或扩展/获取带有部分数据的完整消息?)并存储更少的数据,但是能够在需要的地方获取源消息吗?

样品: 请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetModifiedItems>
         <tem:Key>abcdef</tem:Key>
      </tem:GetModifiedItems>
   </soapenv:Body>
</soapenv:Envelope>

响应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <GetModifiedItemsResponse xmlns="http://tempuri.org/">
         <GetModifiedItemsResult xmlns:a="http://schemas.datacontract.org/2004/07/Exchange" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:Body i:type="a:lst">
               <a:List>
                  <a:BaseItem i:type="a:asd">
                     <a:ISDELETED i:nil="true"/>
                     <a:ID>1</a:ID>                     
                     <a:SYSUSER>b2</a:SYSUSER>
                  </a:BaseItem>
                  <a:BaseItem i:type="a:asd">
                     <a:ISDELETED i:nil="true"/>
                     <a:ID>2</a:ID>
                     <a:SYSUSER>b3</a:SYSUSER>
                  </a:BaseItem>
               </a:List>
            </a:Body>
            <a:Msg>SUCCESS</a:Msg>
         </GetModifiedItemsResult>
      </GetModifiedItemsResponse>
   </s:Body>
</s:Envelope>

4 个答案:

答案 0 :(得分:2)

从我的角度来看,解决方案取决于您是要存储整个邮件还是仅跟踪调用和其他一些数据。

如果您不必存储整条信息,我建议您安装Microsoft AppFabric。 AppFabric是一组集成技术,可以更轻松地执行很多操作,包括监视IIS上托管的WCF服务,而且它是免费的! AppFabric设置非常简单,并将为您的IIS添加新的功能/图标。

我们在生产环境中使用AppFabric + SQL Server Express来跟踪一些WCF调用。开启跟踪非常简单;你可以设置跟踪级别,目标数据库,你想要保留多少历史记录,大小限制等等...此外,还有一个非常酷的用户界面,可以让你查询存储的所有跟踪(它显示已跟踪了多少调用,多少失败,...)。好的一点是,如果出现故障,您可能会收到错误说明。也可以在AppFabric跟踪中添加UserDefined数据。更多信息here

现在,如果您需要存储整个消息,正如@Aron所说,我会选择使用NoSQL,特别是使用logstash。 如他们网站上所写:

  

logstash是用于管理事件和日志的工具。你可以用它来   收集日志,解析它们并存储它们供以后使用(比如,for   搜索)。说到搜索,logstash附带一个Web界面   用于搜索和钻取所有日志。

logstash基于elasticsearch。

您必须找到的最后一件事是定义存储消息的正确时间/地点,可能是使用自定义WCF行为。

希望有所帮助!

答案 1 :(得分:2)

压缩XML的最简单方法是一次存储多个文档,并将您选择的任何通用压缩算法应用于它。关键是一次压缩多个消息,以便压缩器可以利用重复XML结构中存在的极端冗余。

这非常有效,通常不需要专门的XML压缩。常见的算法,如“gzip / deflate”或更强大的算法,如LZMA(7zip),非常非常善于利用它。他们所做的就是组合重复的子串(就像它们存在于XML中一样)。

因此,您可以缓冲所有XML消息10秒钟,并将它们保存在某个二进制blob中。

答案 2 :(得分:1)

好。设置WCF来记录所有内容非常简单。显示了一个示例here。您想使用IMessageInspector接口。

至于问题的第二部分。使用大量数据存储。我有两个答案给你。您将耗尽大量数据存储,因为

  1. 每条消息都很大(XML不知道数据存储的效率)。
  2. 您正在存储大量消息。
  3. 因此,您希望减少每个部分的贡献。

    第一个是你正确推测的。您可以通过压缩数据来减少有效负载大小。从简单的信息理论我们知道数据的可压缩性取决于数据的性质。在这种情况下,XML可以很容易地进行压缩。 Depending on how much of the schema is known before hand you can compress it more or less

    其次,您可以减少有效负载的数量。通过简单地截断存储的请求数量,您可以限制存储。

    但是我最后要指出的是,我绝对不会使用SQLite作为存储机制。根据我的经验,P / Invoke开销将严重限制服务器的性能。此外,SQLite的并发模型非常差,也限制了服务器上的并发请求数。

    坦率地说,我不得不问你是否需要使用平面文件进行存储,或者如果你需要查询,我可能会建议切换到XML NoSQL解决方案。

    使用XML NoSQL数据库的另一个好处是,即使应用程序服务器出现故障,您也可以将其关闭并查询它。

    现在,至于您是应该从XML中提取数据还是以不兼容的格式存储它......我认为它会适得其反。通过存储实际请求,您可以编写一个小应用程序来重新发送回归测试请求。

答案 3 :(得分:1)

日志执行两个主要目的:

  1. 调试/跟踪应用程序出现问题时
  2. 审计跟踪
  3. 要实现这些目标,您需要尽可能多地记录。因此,记录整个SOAP消息。 为了节省磁盘空间,您可以存储充分命名的(包括日期和时间)平面文件,这些文件会间歇性地压缩并定期存档。

    祝你好运。希望这有帮助