如何使日志记录更易于维护
How to make logging easier to maintain?
假设我有一个主窗口。主窗口有一些子窗口,包括一个记录所发生情况的日志窗口和许多操作用户数据的操作窗口。在操作窗口中的每个操作之后,我想将其记录在日志窗口中。有几种方法可以实现它。
-
在操作窗口中放置一个指向日志窗口的指针。为此,我认为操作窗口不是那么可重用,因为它绑定到指针。有一天,如果我不想记录,我需要删除它。此外,这种方式可能会占用更多内存。另外,如果操作窗口是主窗口的孩子的孩子...,我需要逐个转移里面的指针。
-
使主窗口成为单例,并向其添加公共日志函数。当我需要日志记录时,我只需调用 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 消息传递中),则可能不需要此操作。
我本以为日志记录函数应该作为独立的"单例"类实现......
- 如何维护资源管理器项目视图中当前可见的项目列表
- 维护unordered_map但同时每一步都需要最低的映射值
- 函数之前的预期初始值设定项(易于修复?
- GCC,CMake,预编译标头和维护依赖项
- Q没有管理权限的 exe 无法启动维护工具
- 易于访问带有偏移索引的C++矢量
- 是否很好地使用状态模式来维护当前选定的对象?
- 组织项目的多平台和易于使用的文件
- 保存形式(易于阅读和修改)在C++
- 为可变结构赋值,该值必须易于复制
- 如何维护对 std::p riority_queue 容器的引用?
- 为什么<<低;和 cout<<v.begin;单独给出错误,但 cout <<(lower.begin());没有给出任何错误,并使代码易于编译
- 将 libusb 设备存储在易于访问的容器中,无需所有权
- 维护/维持两个代码集的风险,一个用于 CPU,一个用于 GPU,需要执行非常相似的功能
- 将Qt应用程序维护为模块和库
- 树不维护递归迭代器成员
- 为多个类实例维护共享_ptr的静态列表
- 以易于维护的方式实现许多类似的(子)类
- 集成一个易于手动维护的数据库
- 如何使日志记录更易于维护