0

客观的

用于System.Diagnostics执行跟踪。尽管我使用过log4net其他日志记录解决方案,但我只对使用System.Diagnostics.

问题

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

应用信息

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

状态机初始状态

LogMessage定义活动也非常简单。它接收四个基本参数:

日志消息参数

将 定义TraceSource为变量:

LogMessage TraceSource 变量

然后简单地调用TraceEvent

LogMessage TraceEvent 调用

配置

TraceSource其配置TraceListener如下:

  <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>
4

2 回答 2

10

仅供在此页面上绊倒的每个人..

如果文件夹丢失,FileLogTraceListener 将不会创建文件夹。

FileLogTraceListener 不会绕过安全性,您的进程身份将需要对目标文件夹具有创建+修改权限。

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

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

最后,如果您不需要 FileLogTraceListener 的形式和功能,请考虑跟踪到 EventLog(对此有一个侦听器),因为其他开发人员和非开发人员(例如运维工程师、第三方监控)可能更容易访问它工具等)

于 2013-01-24T22:46:12.503 回答
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方法。

或者

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

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

话虽如此,我不知道您是否了解工作流跟踪和跟踪功能。它看起来很适合您的需求。检查答案以获取更多链接和示例。

于 2013-01-24T22:34:06.513 回答