用于库/应用程序组合的 C++ 中的错误处理/错误日志记录
Posted
技术标签:
【中文标题】用于库/应用程序组合的 C++ 中的错误处理/错误日志记录【英文标题】:Error handling / error logging in C++ for library/app combo 【发布时间】:2010-09-07 13:26:25 【问题描述】:这些年来我经常遇到以下问题模式:
我正在为一个包编写复杂的代码,该包由一个独立的应用程序和一个人们可以在其他应用程序内部使用的核心库版本组成。
我们自己的应用程序和用户使用核心库创建的应用程序都可能以批处理模式(离线、脚本化、远程和/或从命令行)以及交互方式运行.
库/应用程序需要复杂且大量的运行时输入,并且可能会出现各种类似错误的输出,包括严重错误消息、输入语法警告、状态消息和运行统计信息。请注意,这些都是附带的输出,而不是应用程序的主要目的,它们将在其他地方显示或保存并使用不同的方法。
如果以交互方式运行,其中一些(可能只有非常严重的)可能需要一个对话框;但如果在批处理模式下运行,它需要登录而不停止用户输入;如果作为库运行,客户端程序显然希望在错误发生时拦截和/或检查错误。
这一切都需要跨平台:Linux、Windows、OSX。我们希望解决方案在任何平台上都不奇怪。例如,输出到 stderr 对 Linux 来说很好,但在链接到 GUI 应用程序时无法在 Windows 上工作。
库的客户端程序可以创建主类的多个实例,如果客户端应用程序能够区分每个实例的单独错误流,那就太好了。
假设每个人都同意库方法通过简单的调用(错误代码和/或严重性,然后类似 printf 的参数给出错误消息)记录错误就足够了。有争议的部分是客户端应用程序如何记录或检索它。
多年来,我已经多次这样做了,但从未对解决方案完全满意。此外,这种子问题实际上对用户来说并不是很重要(如果出现问题,他们希望查看错误日志,但他们并不真正关心我们实现它的技术),但这个话题让程序员们兴奋不已他们总是在这个细节上浪费过多的时间,而且永远不会很开心。
任何人都知道如何将此功能集成到 C++ API 中,或者是否有公认的范例或良好的开源解决方案(请不要使用 GPL,我想要一个可以在商业封闭应用程序中使用的解决方案以及 OSS 项目)?
【问题讨论】:
【参考方案1】:我们使用 Apache 的 Log4cxx 进行日志记录,这并不完美,但提供了许多基础架构和跨项目的一致方法。我相信它是跨平台的,尽管我们只在 Windows 上使用它。
它通过一个 ini 文件提供运行时配置,允许您控制日志文件的输出方式,如果您想要特定的行为(例如 UI 下的错误对话框),您可以编写自己的附加程序。
如果您的库的客户也采用它,那么它会将他们的日志输出集成到相同的日志文件中。
使用嵌套诊断上下文 (NDC) 功能可以支持主类实例之间的区分。
【讨论】:
【参考方案2】:Log4Cxx 应该适合你。您需要实现一个提供程序,允许库用户在回调中捕获日志输出。该库将导出一个函数来安装回调。该函数应该在幕后重新配置 log4cxxx 以摆脱所有附加程序并设置“自定义”附加程序。
当然,库用户可以选择不安装回调并按原样使用 log4cxx。
【讨论】:
以上是关于用于库/应用程序组合的 C++ 中的错误处理/错误日志记录的主要内容,如果未能解决你的问题,请参考以下文章