2015-09-26 4 views
5

Я работаю над приложением на основе UWP для Windows 10 IoT и я хотел настроить ETW Трассировка таким образом я могу просмотреть регистрации удаленно с помощью встроенного веб-интерфейса:Trouble регистрируя поставщика ETW

ETW List

I полагаю, что я создал необходимые типы, однако я не могу видеть мой провайдер в любом из списков, представленных в разделе IoT ETW:

ETW Options

Мои EventListener реализация:

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); 

Am I отсутствует фундаментальный шаг?

ответ

1

Это не решение для внесения источника в список пользовательских поставщиков, но обеспечивает доступ к событиям из веб-интерфейса. Просто введите GUID EventSource в текстовое поле пользовательских поставщиков.

По телефону, у меня есть 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(); 
    } 

Я использую Portal Device API Windows (described here) и используйте следующий процесс в моем рабочем столе приложении для чтения события:

  1. Подключите веб-сокет WS: //127.0.0.1: 10080/API/ETW/сессии/реальное время
  2. Отправить "поставщик {GUID} из источников событий позволяют 5"
  3. ... Читать события,
  4. Отправить "поставщика {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 –

Смежные вопросы