2015-09-26 93 views
5

我工作的一个UWP基于应用程序的Windows 10物联网,我想配置ETW跟踪,所以我可以远程使用集成的Web界面查看日志:无法注册的ETW提供商

ETW List

我相信我已经创造了必要的类型,但我看不到我的供应商以任何物联网ETW部分中所示的列表:

ETW Options

事件监听实现:

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实现:

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}" 
            : ""; 
    } 
} 

最后,我初始化和配置我的EventSource/EventListener的类型,像这样:

 EventListener genericListener = new StorageFileEventListener("MyIoTListener"); 
     genericListener.EnableEvents(Logger.Log, EventLevel.Critical); 

上午我缺少一个基本步骤?

回答

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 /会话/实时
  2. 发送“提供商{的EventSource的GUID}使5”
  3. ...阅读活动,
  4. 发送“提供商{的EventSource的GUID}停用”

这一切工作很好,但是,当我查询http://127.0.0.1:10080/api/etw/customproviders时,该列表仍为空。

在桌面平台我明白一个使用wevtutil.exe

wevtutil.exe im {App-Manifest}.man 

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

+0

由于EventSource从名称生成GUID,因此您必须使用https://github.com/jonwagner/EventSourceProxy/wiki/Getting-the-EventSource-Manifest-or-GUID来获取GUID –