Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有日志文件管理的.Net WCF服务跟踪日志(滚动)_.net_Wcf_Logging - Fatal编程技术网

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

带有日志文件管理的.Net WCF服务跟踪日志(滚动),.net,wcf,logging,.net,Wcf,Logging,我有一些.Net WCF服务,对于这些服务,我已将app.config文件配置为将发送和接收的消息记录在一个.svclog文件中,该文件可由“服务跟踪查看器工具”(SvcTraceViewer.exe)读取。此工具可以很好地呈现日志文件,清楚地显示正在处理的SOAP消息 我必须使用System.Diagnostics.XmlWriterTraceListener侦听器来正确格式化.svclog文件,使其可由服务跟踪查看器工具处理 我遇到的问题是.svclog文件变得太大&服务跟踪查看器工具由于响

我有一些.Net WCF服务,对于这些服务,我已将app.config文件配置为将发送和接收的消息记录在一个.svclog文件中,该文件可由“服务跟踪查看器工具”(SvcTraceViewer.exe)读取。此工具可以很好地呈现日志文件,清楚地显示正在处理的SOAP消息

我必须使用System.Diagnostics.XmlWriterTraceListener侦听器来正确格式化.svclog文件,使其可由服务跟踪查看器工具处理

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

Service Trace Viewer工具确实提供了一种工具,允许在文件大小>40MB时打开日志文件的一部分,但这仍然太慢。app.config文件中似乎没有配置.svclog的功能,无法在每天或文件达到一定大小时自动创建新文件

有一个名为Microsoft.VisualBasic.Logging.FileLogTraceListener的文本日志侦听器,它支持logfilecreationschedule=“Daily”属性,该属性每天滚动日志文件,但是,操作支持人员很难使用此侦听器生成的日志文件,因为日志条目没有很好地呈现,而且大型xml文档会造成混乱

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

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

谢谢,
Matt.

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

有一个专门的
XmlWriterTraceListener
实现,它对Codeproject执行滚动日志跟踪:

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


我拼凑了一个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>

虽然这是可行的,但您不应该一直启用WCF跟踪。它被设计为一种故障排除方法,并对性能产生影响。在生产环境中禁用它是一种最佳做法。谢谢Sergio,你们要么真的知道你们的WCF,要么你们的网络搜索能力远远超过我。任何一个都可以,非常感谢。这两种解决方案都是可行的。我还不确定我会和谁一起去。两种我都可以试试。
    <listeners>
      <add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\20180606T020646Z.svclog" />
    </listeners>