实时记录

Ion*_*rel 3 architecture windows user-interface logging diagnostics

我有一个应用程序,它有一个循环,一个"调度程序"的一部分,它一直运行,是应用程序的核心.非常像游戏循环,只是我的应用程序是WPF应用程序而且它不是游戏.当然,应用程序会在许多点上进行日志记录,但是调度程序会进行一些敏感的监视,有时候只能从日志中分辨出可能出错的地方(并且错误地我并不意味着例外)或当前状态.

由于Scheduler的内部循环以较短的间隔运行,因此您无法在其中执行基于I/O的文件记录(或使用事件查看器).首先,您需要实时观看,其次日志文件的大小会非常快.所以我在考虑如何实时向用户显示这些数据,我考虑过一些事情:

  • 在UI中实时显示数据
  • 使用AllocConsole/WriteConsole在控制台中显示此信息
  • 使用可显示此信息的其他控制台应用程序,使用管道或其他IPC技术在Scheduler和控制台应用程序之间进行通信
  • 使用Windows的性能监视器,并以某种方式提供此信息
  • ETW

在UI中显示会产生问题.首先,它没有与我为我的应用程序考虑的UI集成,我不想为此复杂化UI.这种诊断很少发生.其次,会有一些非平凡的数据保护,因为Scheduler有它自己的线程.

一个单独的控制台窗口可能会工作,但我仍然担心,如果它没有太多的门槛.分配我自己的控制台,因为这是一个Windows应用程序,可能会比不同的控制台应用程序(3)更好,因为我不需要担心IPC通信和非阻塞通信.但是,用户可以关闭我分配的控制台,在这种情况下会出现问题.通过单独的流程,您不必担心它.

假设有一个用于性能监视器的API,它不会与我的应用程序集成得太好或对用户显而易见.使用ETW也没有解决任何问题,只是一个随意的想法,我仍然需要以某种方式显示这些信息.

别人怎么想,我会错过其他方式吗?

For*_*ker 9

恭敬地 - Adrian K和Dima的答案都不正确.正确的答案是使用Windows事件跟踪(ETW).这是我们用于Windows中所有日志记录的内容.它非常强大,性能非常好.例如,W7在许多OS事件上记录ETW事件 - 始终 - 包括处理器上下文切换.曾经在W7中使用性能监视器吗?它正在消耗内核中的ETW事件.

我建议您使用ETW 进行所有日志记录.为什么?几个原因:

  1. 它无处不在
  2. 您可以在正在运行的进程中启用禁用日志记录 无需重新启动进程.(是的,其他伐木工这样做,但有些不这样做).
  3. 它的设计包括在运输代码中.
  4. 记录事件保证是非阻塞的:它不会导致"等待".
  5. 我们为ETW跟踪处理提供了许多工具.最值得注意的是XPERF工具(链接,链接,链接)

使用ETW事件检测性能路径的一大好处是,您可以使用XPERF工具将事件与内核事件集成在一起.

编写一个"监视"应用程序,从组件中观察ETW事件也很容易.我有一个用于我们的组件之一,只是将事件显示到控制台.

强烈建议您不要尝试编写自己的高性能日志记录系统.这样做很有挑战性,但在性能和可靠性方面.Windows ETW系统非常强大,性能非常好.