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

C++ 如何使日志记录更易于维护?,c++,logging,C++,Logging,假设我有一个主窗口。主窗口有一些子窗口,包括一个日志窗口来记录发生的事情,以及一些操作窗口来操作用户的数据。在操作窗口中的每个操作之后,我想在日志窗口中记录它。有几种方法可以实现它 在操作窗口中放置一个指向日志窗口的指针。为此,我认为操作窗口不可重用,因为它绑定到指针。如果有一天我不想登录,我需要删除它。而且,这种方式可能需要更多的内存。另外,如果操作窗口是主窗口的child的child的child…,我需要一个接一个地将指针转移到内部 将主窗口设为单例,并向其添加公共日志函数。当我需要日志记录

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

  • 在操作窗口中放置一个指向日志窗口的指针。为此,我认为操作窗口不可重用,因为它绑定到指针。如果有一天我不想登录,我需要删除它。而且,这种方式可能需要更多的内存。另外,如果操作窗口是主窗口的child的child的child…,我需要一个接一个地将指针转移到内部

  • 将主窗口设为单例,并向其添加公共日志函数。当我需要日志记录时,我只需要调用MainWindow::Inheritation()->Log(信息)。但是如果有一天我有两个主窗口会发生什么呢


  • 对这个问题有什么好的建议吗。非常感谢

    我认为日志函数应该作为一个独立的“单例”类来实现

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

    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 );
    

    是的,我喜欢有多种打印类型的日志记录函数,但是您可能更喜欢只使用一个字符串或使用C++流操作符。 如果我想拥有多个日志,我会将其作为一个可重用的类,并将这些日志的实例放入另一个单例中(例如“应用程序”类)。在这种情况下,我可能会:

    Log::EventsLog().Info("Something exciting happened" );
    Log::SystemLog().Info("Shutting down" );
    
    当可以(将)并发调用日志消息时,通常需要在日志消息上具有某种形式的互斥控制。如果通过单线程队列(如Windows消息传递)将消息传递到日志窗口,则可能不需要此功能