用于库/应用程序组合的C ++中的错误处理/错误记录
时间:2020-03-05 18:46:26 来源:igfitidea点击:
这些年来,我经常遇到以下问题模式:
- 我正在为一个程序包编写复杂的代码,该程序包包含一个独立的应用程序以及人们可以从其他应用程序内部使用的核心库的版本。
- 我们自己的应用程序以及可能是用户使用核心库创建的应用程序都可能以批处理模式(脱机,脚本,远程和/或者从命令行)运行,也可以交互运行。
- 该库/应用程序需要复杂且庞大的运行时输入,并且可能有各种类似错误的输出,包括严重错误消息,输入语法警告,状态消息和运行统计信息。请注意,这些都是偶然的输出,而不是应用程序的主要目的,该目的将在其他位置使用不同的方法显示或者保存。
- 其中一些(可能只有非常严重的问题)如果以交互方式运行,可能需要一个对话框。但是,如果以批处理模式运行,则需要在不停止用户输入的情况下进行日志记录;如果作为库运行,则客户端程序显然希望在发生错误时进行拦截和/或者检查。
- 所有这些都需要跨平台:Linux,Windows,OSX。我们希望该解决方案在任何平台上都不会出现问题。例如,输出到stderr在Linux上很好,但是在链接到GUI应用程序时在Windows上不起作用。
- 库的客户端程序可以创建主类的多个实例,并且如果客户端应用程序可以区分每个实例一个单独的错误流,那将是一个很好的选择。
- 假设每个人都同意,对于库方法来说,通过一个简单的调用记录错误就足够了(错误代码和/或者严重性,然后是类似printf的参数给出错误消息)。有争议的部分是客户端应用程序如何记录或者检索此内容。
多年来,我已经做过很多次了,但从未对解决方案完全满意。此外,这种子问题对用户实际上并不十分重要(如果有问题,他们想查看错误日志,但他们并不真正在乎我们的实现方法),但是这个话题引起了程序员的注意而且他们总是在这个细节上浪费时间,从不感到很高兴。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
任何人都有关于如何将此功能集成到C ++ API中的任何智慧,或者是否存在公认的范例或者良好的开源解决方案(不是GPL,请,我希望可以在商业封闭应用程序和OSS中使用的解决方案)项目)?
解决方案
回答
我们使用Apache的Log4cxx进行日志记录虽然不是很完美,但是它提供了许多基础结构和跨项目的一致方法。我相信它是跨平台的,尽管我们仅在Windows上使用它。
它通过ini文件提供运行时配置,该文件允许我们控制日志文件的输出方式,并且如果需要特定的行为(例如,UI下的错误对话框),则可以编写自己的添加程序。
如果库的客户也采用它,那么它将把他们的日志输出集成到相同的日志文件中。
可以使用嵌套诊断上下文(NDC)功能支持主类实例之间的区分。
回答
Log4Cxx应该为我们工作。我们需要实现一个提供程序,该提供程序允许库用户捕获回调中的日志输出。该库将导出一个函数来安装回调。该功能应该在后台重新配置log4cxxx以摆脱所有添加程序,并设置"自定义"添加程序。
当然,库用户可以选择不安装回调并按原样使用log4cxx。