我有一些.Net WCF服务,对于这些服务,我已经配置了app.config文件,以记录在.svclog文件中发送和接收的消息,该文件可由"服务跟踪查看器工具"(SvcTraceViewer.exe)读取。此工具可以很好地呈现日志文件,清楚地显示正在处理的 SOAP 消息。
我必须使用 System.Diagnostics.XmlWriterTraceListener 侦听器来正确格式化 .svclog 文件,以便由服务跟踪查看器工具处理。
我遇到的问题是.svclog文件变得太大,并且由于响应时间慢,服务跟踪查看器工具变得不可用。
服务跟踪查看器工具确实提供了一种工具,允许在日志文件大小> 40MB 时打开日志文件的一部分,但这仍然太慢。app.config 文件中似乎没有将 .svclog 配置为每天或在文件达到一定大小时自动创建新文件的功能。
有一个名为 Microsoft.VisualBasic.Logging.FileLogTraceListener 的文本日志侦听器,它确实支持每天滚动日志文件的 logfilecreationschedule="Daily" 属性,但是来自此侦听器生成的日志文件对于操作支持人员来说很难使用,因为日志条目没有很好地呈现并且大型 xml 文档会导致混乱。
这方面的最佳实践是什么,看起来我可能不得不编写一个自定义的 WCF 日志扩展,这似乎有点矫枉过正,只是为了处理内置 System.Diagnostics.XmlWriterTraceListener 日志侦听器/追加器中缺少日志文件滚动功能的问题。
我还尝试了一个脚本来停止我的应用程序并重命名日志文件,但这似乎是不可能的,因为在 Windows 上句柄.exe和 openfile 实用程序无法关闭通过网络共享打开的文件,因此如果有人通过网络共享浏览旧日志文件,我无法重命名/移动旧日志文件。将很快发布一个单独的问题。
谢谢马 特。
您可以自行开发,也可以使用现有的专用XmlWriterTraceListener
或使用循环跟踪日志机制。
XmlWriterTraceListener
有一个专门的实现,用于在 Codeproject 上执行滚动日志跟踪:
http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListener
使用循环跟踪,您有两个文件,每个文件最多可以存储所需跟踪日志数据总数的一半。侦听器创建一个文件并写入该文件,直到达到数据大小的一半限制,此时它将切换到第二个文件。当侦听器达到第二个文件的限制时,它会用新的跟踪覆盖第一个文件。
http://msdn.microsoft.com/en-us/library/aa395205.aspx
我拼凑了一个Powershell脚本,该脚本修改了SVC的web.config中日志文件的名称,然后创建了一个TaskScheduler作业来每小时运行一次脚本。
$a = (((get-date).ToUniversalTime()).ToString("yyyyMMddThhmmssZ"))
$myLogFile = "c:temp$a.svclog";
$webConfig = 'C:inetpubwwwrootmySVCapiWeb.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:tempmyDefaultLogFile.svclog" />
</listeners>
</source>
</sources>
在"任务计划"的操作-启动程序"中,将Powershell.exe
放入"程序/脚本"框中,然后在"添加参数"框中添加-ExecutionPolicy ByPass c:yourfolderamendWebConfig.ps1
。
任务运行,然后将 web.config 的初始化数据文件更新为 例如
<listeners>
<add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:temp20180606T020646Z.svclog" />
</listeners>