C++中的错误处理/错误日志对于库/应用程序组合

4
多年来,我经常遇到以下问题模式:
我正在为一个包含独立应用程序和核心库版本的软件包编写复杂的代码,人们可以从其他应用程序中使用该核心库。
我们自己的应用程序以及用户使用核心库创建的应用程序很可能会在批处理模式(离线、脚本、远程和/或命令行)和交互模式下运行。
该库/应用程序接受复杂且大量的运行时输入,并且可能会产生各种错误类似的输出,包括严重错误消息、输入语法警告、状态消息和运行统计信息。请注意,这些都是“附带”的输出,不是应用程序的主要目的,主要目的将在其他地方显示或保存,并使用不同的方法。
其中一些(可能只有非常严重的错误)在交互模式下可能需要对话框;但如果在批处理模式下运行,则需要在不等待用户输入的情况下记录日志;如果作为库运行,客户端程序显然希望在错误发生时拦截和/或检查错误。
所有这些都需要跨平台支持:Linux、Windows、OSX。我们希望解决方案在任何平台上都不会出现奇怪的问题。例如,在Linux上将输出发送到stderr是可以的,但在链接到GUI应用程序时,在Windows上无法工作。
库的客户端程序可能会创建主类的多个实例,如果客户端应用程序能够区分每个实例的单独错误流,那将是很好的。
让我们假设大家都同意库方法通过简单的调用(错误代码和/或严重程度,然后是类似printf的参数给出错误消息)来记录错误。争议的部分是客户端应用程序如何记录或检索这些错误。
我多年来已经做过很多次这样的事情,但对解决方案从未完全满意。此外,这是一种对用户来说并不重要的子问题(如果出现问题,他们只想看到错误日志,而不关心我们实现它的技术),但这个话题会激发程序员的热情,他们总是在这个细节上浪费太多时间,却始终无法满足。
有没有人对如何将这个功能集成到C++ API中有什么智慧,或者是否有一个被接受的范例或一个好的开源解决方案(请不要使用GPL,我希望能在商业闭源应用程序和开源项目中使用)?
2个回答

1
我们使用Apache的Log4cxx进行日志记录,这不完美,但提供了很多基础设施和一致的方法。我相信它是跨平台的,尽管我们只在Windows上使用它。
它通过ini文件提供运行时配置,允许您控制如何输出日志文件,并且如果您想要特定行为(例如UI下的错误对话框),则可以编写自己的附加器。
如果您的库的客户端也采用它,则会将他们的日志输出集成到相同的日志文件中。
使用嵌套诊断上下文(NDC)功能可以支持主类实例之间的区分。

1
Log4Cxx应该对你有用。你需要实现一个提供者,允许库用户在回调函数中捕获日志输出。该库将导出一个函数以安装回调函数。这个函数应该在幕后重新配置log4cxxx,摆脱所有的appender,并设置"custom" appender。
当然,库用户也可以选择不安装回调函数,直接使用log4cxx。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接