2010-04-18 132 views
3

我有一个应用程序,它有一个循环,是“调度程序”的一部分,它始终运行并且是应用程序的核心。非常像一个游戏循环,只是我的应用程序是一个WPF应用程序,它不是一个游戏。自然地,应用程序在许多方面都进行了日志记录,但是Scheduler会进行一些敏感的监视,有时从日志中不可能知道可能发生了什么错误(以及错误的我不是指例外)或当前状态。实时日志记录

由于调度程序的内部循环以很短的时间间隔运行,因此无法在其中执行基于I/O的日志记录(或使用事件查看器)。首先,您需要实时观看它,其次,日志文件的大小会非常快。所以我在想的方式来表达这个数据的实时用户,有些事情我认为:在实时

  • 显示的数据在UI
  • 使用AllocConsole/WriteConsole显示在控制台此信息
  • 使用这将显示此信息不同的控制台应用程序,调度和使用管道或其他的IPC技术
  • 使用Windows的性能监视器并以某种方式与该信息给它
  • ETW
  • 控制台应用程序之间的通信

在UI中显示会有问题。首先它不会与我为我的应用程序考虑的用户界面集成,并且我不想仅为此将界面复杂化。这种诊断只会发生很少。其次,会有一些不平凡的数据保护,因为调度程序有它自己的线程。

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

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

别人怎么想的,会有其他方法我错过了吗?

+0

您希望用户如何处理显示的信息?如果您希望收集离线数据以用于以后的分析而对性能影响最小,ETW似乎是一个不错的选择。 – jnoss 2010-04-19 00:23:17

+0

它不适用于以后使用,当有些事情不明显时,电力用户可以排除故障 – 2010-04-19 01:42:35

+0

-1很难理解你的问题究竟是什么,或者你实际上在做什么。 – 2010-04-24 21:42:24

回答

9

恭敬地 - Adrian K和Dima的答案都不正确。正确的答案是使用Event Tracing For Windows(ETW)。这是我们用于Windows中的所有日志记录。它非常强大,表现非常好。例如W7在很多操作系统事件上记录ETW事件 - 包括处理器上下文切换。在W7中使用过性能监视器吗?它正在消耗内核中的ETW事件。

我推荐你做全部你用ETW记录。为什么?有几个原因:

  1. 其无处不在
  2. 您可以启用禁止在运行过程中的日志记录。无需重新启动过程。 (是的,其他伐木工这样做,但有些不这样做)。
  3. 其设计用于包含运输代码。
  4. 记录一个事件保证是非阻塞的:它不会导致'等待'。
  5. 我们提供批次 ETW跟踪处理工具。最引人注目的是XPERF工具(linklinklink

与ETW事件插装你的表现路径的一个很大的好处是,你的事件,可以看到与使用XPERF工具内核事件组成。

它也很容易编写一个'watch'应用程序,用于监视组件中的ETW事件。对于我们的组件之一,我只有一个组件可以简单地将事件显示到控制台。

高度建议不要尝试编写自己的高性能日志记录系统。这样做很难做到,但在性能和可靠性方面。 Windows ETW系统超强健,性能良好。

0

回到基本 - 单独关注。

我通常的解决方案是使用Microsoft企业库来处理实际的日志记录;我会使用数据库作为存储库,然后可以从任何应用程序(您现有的应用程序或完全独立的应用程序)中随意查询。

我喜欢关于MS Ent Lib的东西,你可以配置他们登录到各种各样的存储库类型。如果需要的话,你可以扩展它们;我不确定你是否想异步工作以满足性能/执行的限制。

我更喜欢登录到数据库,因为它提供了一个很好的控制级别:它很容易查询和合理地轻松地对数据进行拼凑。拥有sia dthat的Ent Lib允许基于滚动文件的日志记录 - 这将帮助您管理文件大小 - 但使用Db会比读取文件更快。

我想这归结于你的意思是“实时”是否记录到数据库是否足够快。 - 实时到电脑与实时到人非常不同。

您可以登录到内存,然后异步遍历这些日志条目并将它们提交到日志存储(DB)。对于报告,您可以使用内存中的副本来显示“当前”状态,并在较远的过去将更长的时间/内容引用到数据库中。

+0

我不需要保存数据,因此我不想使用数据库,我只需要将这些信息实时显示给用户 – 2010-04-19 10:02:31

+0

然后我猜想内存中的内容会很好,但很难知道不知道应用程序的上下文。你想要保存多少数据(价值5秒,价值5分钟)?如果事情死亡等等会发生什么 - 你将失去所有的数据。 – 2010-04-19 20:49:10

+0

我根本不保存数据。如果有东西死了就死了。这就是为什么我有正常的日志记录。这更像是一种“显示数据”的方式/最佳方式,数据用于诊断,但如果您没有实时看到数据,则无用,这就是为什么我不保留它的原因。 – 2010-04-22 20:09:07