使用System.Diagnostics
执行跟踪。虽然我使用了log4net
和其他日志记录解决方案,但我只对跟踪使用System.Diagnostics
感兴趣。
即使我发出TraceEvent
文件也没有在任何地方创建。
我有一个托管一些WF服务的应用程序。其中一个服务是状态机,其初始状态如下所示:
LogMessage
自定义活动也很直接。它收到四个基本参数:
将TraceSource
定义为变量:
然后只需拨打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>
答案 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答案以获取更多链接和示例。