Windows应用程序中的日志记录(跟踪)指南

Windows应用程序中的日志记录(跟踪)指南,windows,logging,trace,Windows,Logging,Trace,在我看来,有两种不同类型的日志记录: 以用户为中心的日志,如我的防病毒软件生成的日志(“已启动扫描”、“未发现威胁”等) 以开发人员为中心的跟踪,可以像异常日志一样简单,也可以像每个方法调用的日志一样详细 我目前正在计划如何将第二种类型的日志记录合并到我们的应用程序中,以便我们能够在用户报告问题时获得一些错误记录。我已经看到了一些关于这些跟踪应该有多详细以及可用框架的讨论,但这里我要寻找一些更一般的指导原则 我提出的具体问题包括: 我们应该记录到文件、Windows事件日志还是其他地方?对

在我看来,有两种不同类型的日志记录:

  • 以用户为中心的日志,如我的防病毒软件生成的日志(“已启动扫描”、“未发现威胁”等)
  • 以开发人员为中心的跟踪,可以像异常日志一样简单,也可以像每个方法调用的日志一样详细
我目前正在计划如何将第二种类型的日志记录合并到我们的应用程序中,以便我们能够在用户报告问题时获得一些错误记录。我已经看到了一些关于这些跟踪应该有多详细以及可用框架的讨论,但这里我要寻找一些更一般的指导原则

我提出的具体问题包括:

  • 我们应该记录到文件、Windows事件日志还是其他地方?对于这些用户可能不感兴趣的以开发人员为中心的日志,我觉得文件是最合适的。但在这种情况下:

    • 文件应该放在哪里
    • 我们是否应该实施某种形式的日志循环以防止文件增长过大
    • 如何处理同时访问日志的应用程序的多个实例?

  • 默认情况下是否应打开此跟踪?如果是,我有点担心表现;但如果不是,我们是否会以“打开跟踪并尝试重现问题”来回应许多用户的问题?这听起来没什么帮助
我希望你能帮我解决这些问题。我也非常感谢您在这个话题上提出的任何其他建议。

提供了一些有用的指导

对于日志记录,我使用它作为实际日志记录框架的抽象

更多信息:


如果平台可用,则应使用已建立的日志框架。对于log4j(java)、log4net(.net)等,大多数已建立的框架都会以非常精确的方式增加和减少日志记录(从而影响性能)。你必须复制所有这些

如果不是的话,它是一个高性能的日志系统,直接内置在windows中。我建议在日志框架不可用的情况下使用它


哦,在出现问题之前不要担心性能(这并不意味着不要考虑它,只是在需要之前不要进行微优化)。

我发现log4net非常有效。我通常使用log4jxml格式的滚动文件appender和另一个直接登录到调试控制台的appender,前者可以被链锯读取并整齐显示

可以在XML文件中轻松设置日志记录级别。对于分发,我将日志记录级别设置为Info或完全关闭。在出现问题的情况下,可以将其转换回调试


我发现它很强大,因为它记录了线程和调用日志项的函数。

我同意Windows事件日志不适合用于开发人员日志。虽然它们是一个方便的日志位置,但导出日志信息有点问题,最终我觉得事件日志应该只用于记录系统管理员关心的信息

至于此文件应存储在何处,请注意Windows 7和Vista正在进一步隔离用户,这意味着写入程序文件文件夹将需要管理权限。使用此功能,不需要以管理员身份运行应用程序。除此之外,我没有任何建议

我不确定您使用的是哪种应用程序,但我发现过多的随机跟踪信息是无用的。我将花费大部分精力来识别只使用非常有限的信息集的大部分代码。如果操作正确,这将允许您只需一条跟踪语句就可以重现大多数运行时错误。这也将有效地使日志大小变得无关紧要

除非应用程序的多个实例彼此接口,否则它们应该保留单独的日志文件。没有理由合并两个完全独立的进程的日志信息


默认情况下,完全跟踪应处于关闭状态。如果客户报告了您无法再现的错误,则应建议他们打开跟踪信息,以便您可以进一步确定问题所在。

您可能希望使用。这是一个简单的可配置记录器,具有许多易于使用的功能。遵循上面的两个链接将使您很快就能正常工作。

我建议使用现有的库,如log4net或entlib日志记录应用程序块

就我个人而言,日志应用程序块太过复杂了

默认情况下,应记录任何异常,并且对于无法使用标准异常记录收集足够信息的奇怪问题,您应该可以选择启用详细跟踪/记录模式


你永远不知道当用户使用你的代码时会发生什么。找到和解决问题的信息越多越好。

我一直在调查ETW;请参见“是”处的后续问题,您应该使用已建立的日志框架;幸运的是,如果您在Windows应用程序中使用Microsoft.NET Framework,那么它已经有一个内置的(System.Diagnostics),因此您不需要转到类似log4net的东西。