.Net WCF服务跟踪日志与日志文件管理(滚动)

时间:2012-05-28 05:39:46

标签: .net wcf logging

我有一些.Net WCF服务,对于这些服务,我已经配置了app.config文件,以便在.svclog文件中记录发送和接收的消息,该文件可由“Service Trace Viewer Tool”(SvcTraceViewer.exe)读取。此工具使日志文件清晰地显示正在处理的SOAP消息。

我必须使用System.Diagnostics.XmlWriterTraceListener侦听器来正确格式化.svclog文件,以便可以通过服务跟踪查看器工具进行处理。

我遇到的问题是.svclog文件变得太大&由于响应时间较慢,服务跟踪查看器工具变得无法使用。

如果文件是>,则服务跟踪查看器工具确实提供了允许打开日志文件的一部分的工具。 40MB大小,但这仍然太慢。 app.config文件中似乎没有任何工具可以将.svclog配置为每天或当文件达到一定大小时自动创建新文件。

有一个名为Microsoft.VisualBasic.Logging.FileLogTraceListener的文本日志监听器,它支持logfilecreationschedule =“Daily”属性,该属性每天滚动日志文件,但是从该监听器生成的日志文件对于操作支持人员来说很难用作日志条目不能很好地呈现,大型xml文档会导致混淆。

这个领域的最佳实践是什么,看起来我可能不得不编写一个自定义的WCF日志扩展,这似乎只是为了解决内置System.Diagnostics.XmlWriterTraceListener中缺少日志文件滚动功能的问题。 log listener / appender。

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

谢谢, 太

2 个答案:

答案 0 :(得分:9)

您可以自己开发或使用现有的专用XmlWriterTraceListener或使用循环跟踪日志机制。

XmlWriterTraceListener的专门实现,它在Codeproject上执行滚动日志跟踪:

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

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

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

答案 1 :(得分: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>

在Task sched,Action-Start A Program中,将Powershell.exe放入Program / script框中,然后在Add arguments框中添加-ExecutionPolicy ByPass c:\yourfolder\amendWebConfig.ps1

该任务运行然后将web.config的initializeData文件更新为,例如

    <listeners>
      <add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\20180606T020646Z.svclog" />
    </listeners>