4

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

  • 我正在为一个包编写复杂的代码,该包由一个独立的应用程序和一个人们可以在其他应用程序内部使用的核心库版本组成。

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

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

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

  • 这一切都需要跨平台:Linux、Windows、OSX。我们希望解决方案在任何平台上都不奇怪。例如,输出到 stderr 对 Linux 来说很好,但在链接到 GUI 应用程序时不能在 Windows 上工作。

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

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

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

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

4

2 回答 2

1

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

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

于 2008-09-04T18:55:32.623 回答
1

We use Apache's Log4cxx for logging which isn't perfect, but provides a lot of infrastructure and a consistent approach across projects. I believe it is cross-platform, though we only use it on Windows.

It provides for run time configuration via an ini file which allows you to control how the log file is output, and you could write your own appenders if you want specific behaviour (e.g. an error dialog under the UI).

If clients of your library also adopt it then it would integrate their logging output into the same log file(s).

Differentiation between instances of the main class could be supported using the nested diagnostic context (NDC) feature.

于 2008-09-02T14:56:47.753 回答