如何注册一个事件源etw提供程序c#和捕获输出到日志文件
本文关键字:程序 输出 日志 文件 etw 注册 何注册 事件源 一个 | 更新日期: 2023-09-27 18:03:42
我创建了一个"Logger"类,它派生自基类EventSource (事件提供程序)。我用它来测试我的应用程序。现在,为了查看我的应用程序记录的跟踪消息,我使用perfview GUI工具—我首先注册我的事件提供程序"*Logger",然后通过该工具启动收集过程。收集完成后,我可以查看记录的事件。这工作得很好,但我需要自动化这个过程。
当我尝试自动化这个过程时,我面临两个问题:
- 我如何注册我的事件提供程序(最好只使用c#库或微软提供的CLI工具[不想使用任何第三方工具或库来做这件事])
- 如何使用Logman(或任何其他命令行工具)等工具将记录的事件收集到etl文件中。
我在下面提供了我的应用程序源代码(代码非常基本和直接):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics.Tracing;
using System.Threading;
namespace EventLogging
{
class Program
{
static void Main(string[] args)
{
Logger log = Logger.GetLogger();
for (int i = 0; i < 100000; i++)
{
log.WriteError("Logging some serious error",i);
log.WriteWarning("Logging warning",i);
}
}
}
/// <summary>
/// Logger writes to instance.
///
/// </summary>
class Logger : EventSource
{
/// <summary>
///
/// </summary>
static private Logger _log;
/// <summary>
/// only one instance of Logger can be created.
/// </summary>
public static Logger GetLogger(){
if (_log == null)
return (_log = new Logger());
else
return _log;
}
private Logger()
: base()
{
}
[Event(101,Message="Application Failure Message: {0}",Level=EventLevel.Error)]
public void WriteError(String message1,int value){
WriteEvent(101, message1,value);
}
[Event(102,Message="Application Warning Message: {0}",Level=EventLevel.Warning)]
public void WriteWarning(String message,int value)
{
WriteEvent(102, message,value);
}
}
}
Microsoft TraceEvent Library使您能够捕获和处理ETW跟踪。它理解EventSource,所以没有理由去注册任何东西。