如何使日志记录更易于维护

How to make logging easier to maintain?

本文关键字:易于 维护 记录 何使 日志      更新时间:2023-10-16

假设我有一个主窗口。主窗口有一些子窗口,包括一个记录所发生情况的日志窗口和许多操作用户数据的操作窗口。在操作窗口中的每个操作之后,我想将其记录在日志窗口中。有几种方法可以实现它。

  1. 在操作窗口中放置一个指向日志窗口的指针。为此,我认为操作窗口不是那么可重用,因为它绑定到指针。有一天,如果我不想记录,我需要删除它。此外,这种方式可能会占用更多内存。另外,如果操作窗口是主窗口的孩子的孩子...,我需要逐个转移里面的指针。

  2. 使主窗口成为单例,并向其添加公共日志函数。当我需要日志记录时,我只需调用 MainWindow::Inheritance()->Log(theInformation)。但是如果有一天我有 2 个主窗口会发生什么。

对问题的任何好建议。多谢!

我认为

正确的解决方案是将日志记录数据放入一个完全独立的类中,其目的只是存储和检索(以及截断,保存和...)日志信息。 然后,需要记录数据的所有其他窗口、类等都需要访问单个日志类指针。

logSystem->log("my friend is blue");

现在,logSystem 是全局还是在初始化期间传递给每个类的对象取决于您。 任何"全局是邪恶的"和"全局是有帮助的"的人的阵营都可以帮助您解决这个单独的问题。

然后,在日志记录窗口中,您只需检索记录的数据并显示它。

 // Qt, C++-11 pseudo-api
foreach(String log, logMessages) {
    myListBox->append(log);
}

此方法的另一个优点是,您可以打开和关闭(创建和销毁)日志窗口,并且仍然不会丢失数据本身。 是的,您也可以隐藏日志窗口或其他技巧,但是能够完全销毁并重新创建它似乎要干净得多。 更不用说,通过将日志数据与日志窗口分离出来,您以后可以创建两个窗口,显示两组不同的日志记录数据。 [假设您没有将该全局用于上述日志记录数据。

我通常会将记录器编写为单例。

如果要删除日志记录功能,可以轻松设置标志(用于运行时日志记录控制),或将其替换为虚拟类(用于编译时日志记录控制)。

因此,在最基本的情况下,您可能有:

Log::Get().Error("Name truncated by %u bytes", nBytes );

是的,我喜欢使用可变参数 printf 样式的日志记录函数,但您可能更喜欢只有一个字符串或使用C++流运算符。

如果我想拥有多个日志,我会使其成为可重用的类,并将这些日志的实例放入另一个单例(例如"应用程序"类)中。 在这种情况下,我可能会:

Log::EventsLog().Info("Something exciting happened" );
Log::SystemLog().Info("Shutting down" );
当日志消息

可以(将)同时调用时,通常需要对日志消息进行某种形式的互斥控制。 如果通过单线程队列将消息传递到日志窗口(如在 Windows 消息传递中),则可能不需要此操作。

我本以为日志记录函数应该作为独立的"单例"类实现......