代码之家  ›  专栏  ›  技术社区  ›  Larry Gritz

库/应用程序组合的C++错误处理/错误日志记录

  •  2
  • Larry Gritz  · 技术社区  · 16 年前

    多年来,我经常遇到以下问题模式:

    • 我正在为一个包编写复杂的代码,这个包由一个独立的应用程序和一个核心库版本组成,人们可以从其他应用程序内部使用。

    • 我们自己的应用程序和用户使用核心库创建的应用程序都可能以批处理模式(离线、脚本化、远程和/或从命令行)运行,也可能以交互方式运行。

    • 库/应用程序需要复杂而庞大的运行时输入,可能有各种类似错误的输出,包括严重错误消息、输入语法警告、状态消息和运行统计信息。注意这些都是 附带的 输出,而不是应用程序的主要用途,应用程序将在其他地方显示或保存,并使用不同的方法。

    • 如果以交互方式运行,其中一些(可能只有非常严重的错误)可能需要一个对话框;但如果以批处理模式运行,则需要在不暂停用户输入的情况下进行日志记录;如果以库的形式运行,则客户端程序显然希望在错误发生时拦截和/或检查错误。

    • 所有这些都需要跨平台:linux、windows、osx。我们希望解决方案在任何平台上都不奇怪。例如,对于linux,输出到stderr是可以的,但是当链接到gui应用程序时,在windows上就不起作用。

    • 库的客户端程序可以创建主类的多个实例,如果客户端应用程序能够区分每个实例的单独错误流,那就更好了。

    • 假设每个人都同意,库方法通过一个简单的调用(错误代码和/或严重性,然后像printf一样的参数给出错误消息)来记录错误就足够了。有争议的部分是客户端应用程序如何记录或检索。

    这些年来,我已经做过很多次了,从来没有对解决方案完全满意过。此外,这类子问题实际上对用户并不重要(如果出了问题,他们希望看到错误日志,但他们并不真正关心我们实现它的技术),但是这个主题让程序员们兴奋不已,他们总是在这个细节,从来都不是很开心。

    对于如何将这个功能集成到一个C++ API中,或者有一个公认的范例或一个好的开源解决方案(不是GPL,请允许我在商业封闭的应用程序以及OSS项目中使用一个解决方案),谁都有智慧。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Rob Walker    16 年前

    我们用阿帕奇的 Log4cxx 对于不是完美的日志记录,但是它提供了很多基础设施和跨项目的一致方法。我相信它是跨平台的,尽管我们只在windows上使用它。

    它通过一个ini文件提供运行时配置,该文件允许您控制日志文件的输出方式,如果需要特定的行为(例如ui下的错误对话框),您可以编写自己的附加程序。

    如果库的客户端也采用它,那么它将把它们的日志输出集成到同一个日志文件中。

    可以使用嵌套诊断上下文(ndc)功能支持主类实例之间的差异。

        2
  •  1
  •   Arkadiy    16 年前

    log4cxx应该为你工作。您需要实现一个允许库用户在回调中捕获日志输出的提供程序。库将导出一个函数来安装回调。该函数应该在后台重新配置log4cxxx以除去所有的appender并设置“自定义”appender。

    当然,库用户可以选择不安装回调并按原样使用log4cxx。