2015-09-26 97 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 –