使用日志文件管理(滚动)的.NET WCF服务跟踪日志

10

我有一些 .Net WCF 服务,对于这些服务,我已经配置了 app.config 文件来记录发送和接收的消息到一个 .svclog 文件中,该文件可以使用 "Service Trace Viewer Tool"(SvcTraceViewer.exe) 进行阅读。该工具可以清晰地显示正在处理的 SOAP 消息,需要使用 System.Diagnostics.XmlWriterTraceListener 监听器才能正确格式化 .svclog 文件以使其可被 Service Trace Viewer Tool 处理。

我的问题是 .svclog 文件变得太大,导致 Service Trace Viewer Tool 反应缓慢而无法使用。虽然 Service Trace Viewer Tool 提供了一个功能可以打开日志文件中的一部分(若文件大小 > 40MB),但这仍然太慢了。似乎在 app.config 文件中没有配置 .svclog 自动创建新文件的功能,无论是每天还是达到一定大小时。

Microsoft.VisualBasic.Logging.FileLogTraceListener 是一个文本日志侦听程序,它支持 logfilecreationschedule="Daily" 属性,可每天滚动日志文件,但此侦听程序生成的日志文件不易于操作支持人员使用,因为日志条目未呈现良好,大型 XML 文档增加了混乱。

在这方面,最佳实践是什么?看起来我可能需要编写自定义 WCF 日志扩展程序来处理内置的 System.Diagnostics.XmlWriterTraceListener 日志侦听程序/附加程序中缺乏日志文件滚动功能的问题,但这似乎有点过度解决。

我还尝试了一个脚本来停止我的应用程序并重命名日志文件,但这似乎不可能,因为在 Windows 上,handle.exe 和 openfile 实用程序无法关闭通过网络共享打开的文件,因此如果有人正在浏览它,则无法重命名/移动旧日志文件。不久将会发布有关此问题的单独问题。

谢谢, Matt。


尽管可以做到,但并不应始终启用WCF跟踪。它被设计为故障排除方法,并对性能产生影响。在生产环境中禁用它是最佳实践。 - Lex Li
2个回答

9
你可以自己开发,也可以使用已经存在的专门的XmlWriterTraceListener或者使用循环追踪日志机制。
在Codeproject上有一个专门实现了滚动日志追踪的XmlWriterTraceListener

http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListener

使用循环跟踪,您有两个文件,每个文件最多可以存储所需跟踪日志数据的一半。监听器创建一个文件并写入该文件,直到达到半数据大小的限制,此时它切换到第二个文件。当监听器达到第二个文件的限制时,它将使用新的跟踪覆盖第一个文件。

http://msdn.microsoft.com/en-us/library/aa395205.aspx


谢谢Sergio,你要么真的很懂WCF,要么你的网络搜索能力远远超过了我。无论哪种情况,都非常感谢。两种解决方案都可行。还不确定我会选择哪一个。我可能会尝试两种方案。 - MattG

0
我拼凑了一个PowerShell脚本,用于修改SVC的web.config中日志文件的名称,然后创建了一个TaskScheduler作业以每小时运行该脚本。
$a = (((get-date).ToUniversalTime()).ToString("yyyyMMddThhmmssZ"))
$myLogFile = "c:\temp\$a.svclog";
$webConfig = 'C:\inetpub\wwwroot\mySVCapi\Web.config'
Function updateConfig($config) 
{ 
$doc = (Get-Content $config) -as [Xml]
$activeConnection =$doc.configuration.'system.diagnostics'.sources.source.listeners.add#.initializeData
$activeConnection.SetAttribute("initializeData", $myLogFile);
$doc.Save($config)
} 
updateConfig($webConfig)

脚本假定您的web.config文件中有类似以下内容的设置:

  <system.diagnostics>
<sources>
  <source name="System.ServiceModel.MessageLogging">
    <listeners>
      <add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\myDefaultLogFile.svclog" />
    </listeners>
  </source>
</sources>

在任务计划中,选择“启动程序”操作,在“程序/脚本”框中输入“Powershell.exe”,然后在“添加参数”框中添加“-ExecutionPolicy ByPass c:\yourfolder\amendWebConfig.ps1”。任务运行后,将更新web.config的initializeData文件,例如:
    <listeners>
      <add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\20180606T020646Z.svclog" />
    </listeners>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接