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