【问题标题】:.Net WCF Service Trace Log with log file management (Rolling).Net WCF 服务跟踪日志与日志文件管理(滚动)
【发布时间】:2012-06-02 12:50:49
【问题描述】:

我有一些 .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 上,handle.exe 和 openfile 实用程序无法关闭通过网络共享打开的文件,所以我可以如果有人通过网络共享浏览旧日志文件,则不要重命名/移动它。稍后将发布一个单独的问题。

谢谢, 马特。

【问题讨论】:

  • 虽然可行,但您不应该一直启用 WCF 跟踪。它被设计为一种故障排除方法,并且对性能有影响。在生产环境中禁用它是一种最佳做法。

标签: .net wcf logging


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢 Sergio,您要么真正了解您的 WCF,要么您的网络搜索能力远远超过我。两者都可以,非常感谢。两种解决方案都是可行的。不确定我会选择哪个。我可以两个都试试。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 2012-04-27
    • 2012-04-30
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多