Jam*_*ing 5 c# etw c#-6.0 windows-10-iot-core
我正在开发基于UWP的Windows 10 IoT应用程序,我想配置ETW跟踪,以便我可以使用集成的Web界面远程查看日志记录:
我相信我创建了必要的类型,但是在IoT ETW部分中显示的任何列表中都看不到我的提供者:
我的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:
}
}
Run Code Online (Sandbox Code Playgroud)
我的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}"
: "";
}
}
Run Code Online (Sandbox Code Playgroud)
最后,我初始化并配置我的EventSource/EventListener类型,如下所示:
EventListener genericListener = new StorageFileEventListener("MyIoTListener");
genericListener.EnableEvents(Logger.Log, EventLevel.Critical);
Run Code Online (Sandbox Code Playgroud)
我错过了一个基本步骤吗?
小智 1
这不是使源出现在自定义提供程序列表中的解决方案,但确实提供了从 Web 界面对事件的访问。只需在自定义提供程序文本框中输入 EventSource 的 GUID 即可。
在手机上,我有一个带有以下事件源的 C# UWP 应用程序(从此处复制)
[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();
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 Windows Device Portal API(此处描述),并在我的桌面应用程序中使用以下过程来读取事件:
这一切都运行良好,但是,当我查询http://127.0.0.1:10080/api/etw/customproviders时,列表仍然为空。
在桌面平台上,我知道有人使用wevtutil.exe:
wevtutil.exe im {App-Manifest}.man
Run Code Online (Sandbox Code Playgroud)
出于类似的目的,但不知道它是否适用于 windows mobile。