C ++ for library / app组合中的错误处理/错误记录

时间:2008-09-02 13:36:27

标签: c++ api error-handling error-logging api-design

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

  • 我正在编写一个包含独立应用程序的软件包的复杂代码,以及人们可以在其他应用程序中使用的核心库版本。

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

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

  • 如果以交互方式运行,其中一些(可能只是非常严重的那些)可能需要一个对话框;但如果以批处理模式运行,它需要记录而不会停止用户输入;如果作为库运行,客户端程序显然希望在发生错误时拦截和/或检查错误。

  • 这一切都需要跨平台:Linux,Windows,OSX。我们希望解决方案在任何平台上都不奇怪。例如,输出到stderr适用于Linux,但在链接到GUI应用程序时无法在Windows上运行。

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

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

多年来我多次这样做,对解决方案从未完全满意。此外,这是一种对用户来说实际上并不重要的子问题(如果出现问题,他们希望看到错误日志,但他们并不真正关心我们实现它的技术),但该主题让程序员激起了他们总是在这个细节上浪费过多时间,而且从来都不开心。

任何人都知道如何将此功能集成到C ++ API中,或者是否存在可接受的范例或良好的开源解决方案(请不要使用GPL,我想要一个可以在商业封闭式应用中使用的解决方案以及OSS项目)?

2 个答案:

答案 0 :(得分:1)

我们使用Apache的Log4cxx进行日志记录,但这并不完美,但它提供了大量的基础架构和跨项目的一致方法。我相信它是跨平台的,尽管我们只在Windows上使用它。

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

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

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

答案 1 :(得分:1)

Log4Cxx应该适合你。您需要实现一个允许库用户捕获回调中的日志输出的提供程序。该库将导出一个函数来安装回调。该功能应该在幕后重新配置log4cxxx以摆脱所有appender并设置“自定义”appender。

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