如何注册一个事件源etw提供程序c#和捕获输出到日志文件

本文关键字:程序 输出 日志 文件 etw 注册 何注册 事件源 一个 | 更新日期: 2023-09-27 18:03:42

我创建了一个"Logger"类,它派生自基类EventSource (事件提供程序)。我用它来测试我的应用程序。现在,为了查看我的应用程序记录的跟踪消息,我使用perfview GUI工具—我首先注册我的事件提供程序"*Logger",然后通过该工具启动收集过程。收集完成后,我可以查看记录的事件。这工作得很好,但我需要自动化这个过程。

当我尝试自动化这个过程时,我面临两个问题:

  1. 我如何注册我的事件提供程序(最好只使用c#库或微软提供的CLI工具[不想使用任何第三方工具或库来做这件事])
  2. 如何使用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);
    }


    }

    }

如何注册一个事件源etw提供程序c#和捕获输出到日志文件

Microsoft TraceEvent Library使您能够捕获和处理ETW跟踪。它理解EventSource,所以没有理由去注册任何东西。