如何实现应用程序事件记录器

How to implement application events logger

本文关键字:应用程序 事件 记录器 实现 何实现      更新时间:2023-10-16

在我的应用程序中,需要记录应用程序中发生的各种事件。例如,我需要记录从服务器下载文件的事件,并指定下载时间,服务器ip地址等。从结构上讲,所有这些数据分布在应用程序中的各个类中。

我的解决方案是创建一个单例类,例如命名为'ApplicationEvents',并在其中处理应用程序事件。为例子:
void OnFileDownloaded() {
    ...
    ApplicationEvents::Instance()->FileDownloaded(fileId_);
}

但是这看起来像一个混乱的代码,几乎不可能测试。

另一个解决方案是在main函数中创建ApplicationEvent,并将其作为参数传递给类的构造函数。为了避免代码混乱,可以使用装饰器或代理模式。

例如:'FileDownloader'和装饰类'LoggingFileDownloader'。但是应用程序的结构将更加复杂,许多类只是将指向ApplicationEvents的指针传递给其他类,在我的情况下可能是多余的。

哪个解决方案是最好的?

我不明白为什么不可能进行测试。您应该在应用程序之外测试日志模块,一旦它被验证,就直接使用它。您不必将它与应用程序一起测试。此外,它看起来像普通的代码,使用Singleton只是对代码的一次调用。另一种选择是使用发布/订阅(或观察者)来发布消费事件,但它将更加抽象并且难以跟踪。在调试过程中,我认为它只适用于其他类型的场景,例如,许多订阅者对某些事件感兴趣。另一种更激进的方法是使用AOP,因为日志记录是交叉关注的更常见的例子,但是对于c++来说,AOP只有几个实验性的库。

对于这个问题,我已经创建了一个日志类,我在主程序中分配它,然后我在我的类中使用它。因为我不想减慢我的应用程序与日志记录器运行在Cpp11下的另一个线程。
但我必须改进它以捕获标准输出。

如果你想看一下:https://github.com/Waxo/lightweight_logger