无法注册ETW提供商

时间:2015-09-26 23:16:52

标签: c# etw c#-6.0 windows-10-iot-core

我正在开发基于UWP的Windows 10 IoT应用程序,我想配置ETW跟踪,以便我可以使用集成的Web界面远程查看日志记录:

ETW List

我相信我创建了必要的类型,但是在IoT ETW部分中显示的任何列表中都看不到我的提供者:

ETW Options

我的 EventListener 实现是:

try {
    //....
    int money = Integer.parseInt(args[0]);
    //....
}
catch(ArrayIndexOutOfBoundsException e) {
    //Error handling code here.
    System.err.println(e.getMessage());
}

我的 EventSource 实施是:

sealed class StorageFileEventListener : EventListener
{
    /// <summary> 
    /// Storage file to be used to write logs 
    /// </summary> 
    private StorageFile _mStorageFile = null;

    /// <summary> 
    /// Name of the current event listener 
    /// </summary> 
    private readonly string _mName;

    public StorageFileEventListener(string name)
    {
        _mName = name;

        Debug.WriteLine("StorageFileEventListener for {0} has name {1}", GetHashCode(), name);

        AssignLocalFile();
    }

    private async void AssignLocalFile()
    {
        _mStorageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(_mName.Replace(" ", "_") + ".log",
                                                                                  CreationCollisionOption.OpenIfExists);
    }

    private async void WriteToFile(IEnumerable<string> lines)
    {
        // TODO: 
    }

    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
        // TODO: 
    }

    protected override void OnEventSourceCreated(EventSource eventSource)
    {
        // TODO: 
    }
}

最后,我初始化并配置我的EventSource / EventListener类型,如下所示:

internal sealed class Logger : EventSource
{
    public static Logger Log = new Logger();

    [Event(1, Level = EventLevel.Verbose)]
    public void Debug(string message, Exception exception)
    {
        var exceptionMessage = GenerateExceptionMessage(exception);
        WriteEvent(1, message + exceptionMessage);
    }

    [Event(2, Level = EventLevel.Informational)]
    public void Info(string message, Exception exception)
    {
        var exceptionMessage = GenerateExceptionMessage(exception);
        WriteEvent(2, message + exceptionMessage);
    }

    [Event(3, Level = EventLevel.Warning)]
    public void Warn(string message, Exception exception)
    {
        var exceptionMessage = GenerateExceptionMessage(exception);
        WriteEvent(3, message + exceptionMessage);
    }

    [Event(4, Level = EventLevel.Error)]
    public void Error(string message, Exception exception)
    {
        var exceptionMessage = GenerateExceptionMessage(exception);
        WriteEvent(4, message + exceptionMessage);
    }

    [Event(5, Level = EventLevel.Critical)]
    public void Critical(string message, Exception exception)
    {
        var exceptionMessage = GenerateExceptionMessage(exception);
        WriteEvent(5, message + exceptionMessage);
    }

    private static string GenerateExceptionMessage(Exception exception)
    {
        return exception != null ? $" Exception message - {exception.Message} :: InnerException - {exception.InnerException} :: StackTrace - {exception.StackTrace}" 
                                    : "";
    }
}

我错过了一个基本步骤吗?

1 个答案:

答案 0 :(得分:1)

这不是使源显示在自定义提供程序列表上的解决方案,而是提供对Web界面中事件的访问。只需在自定义提供程序文本框中键入EventSource的GUID即可。

在手机上,我有一个带有以下事件源的C#UWP应用程序,(从here复制)

    [EventSource(Guid = "{GUID of EventSource}", Name = "SourceName")] 
    class MyEventSource : EventSource
    {
        public void MyEvent(string msg, int id) { WriteEvent(1, msg, id); }

        public static MyEventSource Log = new MyEventSource();
    }

我正在使用Windows设备门户API(described here),并在我的桌面应用中使用以下过程来阅读事件:

  1. 将网络套接字连接至 ws://127.0.0.1:10080 / api / etw / session / realtime
  2. 发送“提供商{GUID of EventSource}启用5”
  3. ...阅读活动,
  4. 发送“提供商{GUID of EventSource}禁用”
  5. 这一切都运作良好,但是,当我查询 http://127.0.0.1:10080/api/etw/customproviders 时,列表仍为空。

    在桌面平台上,我了解一个人使用wevtutil.exe

    wevtutil.exe im {App-Manifest}.man
    

    出于类似目的,但不知道它是否适用于Windows mobile。