即使调用了TraceEvent,也没有创建跟踪文件?

时间:2013-01-24 13:51:54

标签: c# .net logging workflow-foundation-4 system.diagnostics

目的

使用System.Diagnostics执行跟踪。虽然我使用了log4net和其他日志记录解决方案,但我只对跟踪使用System.Diagnostics感兴趣。

问题

即使我发出TraceEvent文件也没有在任何地方创建。

申请信息

我有一个托管一些WF服务的应用程序。其中一个服务是状态机,其初始状态如下所示:

State Machine Initial State

LogMessage自定义活动也很直接。它收到四个基本参数:

LogMessage Parameters

TraceSource定义为变量:

LogMessage TraceSource Variable

然后只需拨打TraceEvent

LogMessage TraceEvent Invocation

配置

TraceSourceTraceListener的配置如下:

  <system.diagnostics>
    <trace autoflush="true"/>
    <sources>
      <source name="log" switchValue="All">
        <listeners>
          <add name="file" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
               BaseFileName="gsf_workflows.txt"
               DiskSpaceExhaustedBehavior="ThrowException"
               Location="Custom"
               CustomLocation="D:\Log"
               MaxFileSize="81920000"
               LogFileCreationSchedule="LogFileCreationScheduleOption.Daily"/>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

2 个答案:

答案 0 :(得分:10)

每个人都在这个页面上磕磕绊绊......

如果缺少文件夹,FileLogTraceListener将不会创建文件夹。

FileLogTraceListener不会绕过安全性,您的进程标识将需要在目标文件夹上创建+修改权限。

定位可执行文件夹是“糟糕的形式”,这往往会根据主机而改变(例如,在IIS Express下编写时,您不会写入与DevEnv相同的位置,也不会写入托管的Web应用程序。)一个建议是,您可能希望选择“自定义”并指定特定路径(例如X:\ logfiles)而不是“ExecutableLocation”

当内部缓冲区填满时,写入器刷新到磁盘,如果内存为我提供,则默认缓冲区大小为8KB。这不是跟踪侦听器的一个方面,而是它写入的基础文件流。

最后,如果你不需要FileLogTraceListener的形式和功能,而是考虑跟踪到EventLog(有一个监听器),因为这可能更容易被其他开发者和非开发者(例如ops工程师,第三方监控工具等。)

答案 1 :(得分:3)

两件事:

1)您的工作流很可能因异常而停止,因为您的 .config 文件不正确。请注意更改:

<system.diagnostics>
  <sources>
    <source name="log" switchValue="All">
      <listeners>
        <add name="file" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, 
                         Microsoft.VisualBasic, Version=10.0.0.0, 
                         Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             BaseFileName="gsf_workflows.txt"
             DiskSpaceExhaustedBehavior="ThrowException"
             Location="ExecutableDirectory"
             MaxFileSize="81920000"
             LogFileCreationSchedule="Daily"/>
      </listeners>
    </source>
  </sources>
</system.diagnostics>

2)你要冲洗听众,否则不会写。你可以用两种方式做到这一点。

再次使用 InvokeMethod 活动在 logger 变量上明确调用Flush方法。

OR

打开配置文件上的自动刷新功能:

<system.diagnostics>
    <trace autoflush="true"/>
    ....
</system.diagnostics>

话虽如此,我不知道您是否了解Workflow Tracking and Tracing能力。它看起来非常适合您的需求。查看this答案以获取更多链接和示例。