您可以使用LoggingChannel类来创建ETW跟踪事件。
LoggingChannel的好处是您可以进行复杂的跟踪(并使用高级工具,如PerfView等),但也可以通过LoggingChannel.LogMessage方法的简单等效性来实现Debug.WriteLine
的简单性。
public void LogMessage(String eventString)
或者
public void LogMessage(String eventString, LoggingLevel level)
这比Debug.WriteLine
有许多优点:
- 速度更快,您可以轻松记录数百万条消息,而
Debug.WriteLine
则非常缓慢(基于古老的Windows OutputDebugString
函数)。
- 它不会阻塞发送者或接收者。
- 每个通道都由其自己的GUID标识,而使用
Debug.WriteLine
时,您会从任何地方和任何人那里获得所有跟踪信息,有点混乱,难以找到自己的跟踪信息。
- 您可以使用跟踪级别(Critical、Error、Information、Verbose、Warning)
- 您可以使用PerfView(如果您真的想要)或Device Portal或任何其他ETW工具。
因此,要发送一些跟踪信息,只需添加以下内容:
// somewhere in your initialization code, like in `App` constructor
private readonly static LoggingChannel _channel = new LoggingChannel("MyApp",
new LoggingChannelOptions(),
new Guid("01234567-01234-01234-01234-012345678901")); // change this guid, it's yours!
....
// everywhere in your code. add simple string traces like this
_channel.LogMessage("hello from UWP!");
....
现在,如果你想要一种简单的方法在本地机器上显示这些跟踪信息,除了使用PerfView或其他ETW工具之外,你可以使用我编写的一个名为WpfTraceSpy的免费开源GUI工具,可以在这里找到:https://github.com/smourier/TraceSpy#wpftracespy 或者这里有一个示例.NET Framework控制台应用程序,它将输出所有跟踪信息及其级别到控制台:
using System;
using System.Runtime.InteropServices;
using Microsoft.Diagnostics.Tracing;
using Microsoft.Diagnostics.Tracing.Session;
namespace TraceTest
{
class Program
{
static void Main()
{
using (var session = new TraceEventSession("MySession"))
{
session.EnableProvider(new Guid("01234567-01234-01234-01234-012345678901"));
session.Source.AllEvents += Source_AllEvents;
Console.CancelKeyPress += (object s, ConsoleCancelEventArgs a) => session.Stop();
session.Source.Process();
}
}
private static void Source_AllEvents(TraceEvent obj)
{
var len = (int)(ushort)Marshal.ReadInt16(obj.DataStart);
var stringMessage = Marshal.PtrToStringUni(obj.DataStart + 2, len / 2);
Console.WriteLine(obj.Level + ":" + stringMessage);
}
}
}