记录器何时应刷新
When should a Logger flush?
我想知道日志记录类应该何时或多久刷新一次其流 - 为什么?它应该在每个日志后刷新,还是等待流缓冲区填满然后刷新,还是介于两者之间?
为了进一步说明我的问题:
我的日志记录类包含对某些std::ostream stream
的引用,并使用operator<<
进行输入。我可以在每行输入后刷新,比如说使用 std::endl;
- 但我没有,相反,我use stream << "n"
只是强制换行符。当流缓冲区已满或流/记录器销毁时,我让刷新发生。
尽可能多地,以便在崩溃时不会丢失任何条目,并且在程序运行时获得更好的实时信息。
尽可能少地避免写入文件的开销。
这些要求相互冲突,因此您需要找到适合您需求的平衡点。
您可能需要考虑某些日志消息可能不如其他日志消息重要,您可以使用它来影响刷新策略。
可以使用信号处理程序(或类似的操作系统特定技术(在崩溃之前刷新缓冲区。请注意,从技术上讲,刷新std::stream
是不允许在信号处理程序中执行的操作(尽管这可能取决于其实现(,但它可能会起作用,这通常比崩溃要好。
在C++中,iostreams库有2个用于日志记录的类。两者都注定要stderr
.
cerr
- 在格式化每个输入后刷新,这意味着在每次调用后刷新。
clog
- 填充或手动调用缓冲区时刷新(例如:endl
或 flush()
(。
想法是,您希望尽快输出错误。但日志记录可以批量输出。
这取决于。尽管日志记录通常缩小以表示某些与错误相关的消息传递机制,但它并不总是与错误相关联。相反,有时它甚至被错误明确分离(例如 clog
vs. cerr
(。另一个例子是一般的跟踪。因此,由您(日志记录系统的设计者(决定要使用特定日志记录实现的完整性级别。
基于流的日志记录是报告错误的简单方法。它不是最后排序的功能,但将其作为记录致命错误的唯一方法是不明智的。总比没有好(特别是在强调便携性的情况下(......当您必须依赖这种方式时,请尽快刷新它。
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 何时应在构造函数参数中使用 const C++?
- 为什么或何时应在调用之前将可调用函数参数强制转换为右值?
- 点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 记录器何时应刷新
- 何时应使用 [[maybe_unused]]
- 何时应在现代C++中使用(非标头)源文件
- 何时应使用模板化参数与构造参数
- 关键部分或静音是否真的是成员变量,或者何时应成为成员变量
- 何时应存储指向函数的引用或指针?
- 何时应在Qt中将子对象声明为其父类的成员变量
- 何时应找到附加到模型的边界框的最小值和最大值
- 何时应删除默认的移动构造函数时令人困惑的事情
- 何时应使用make_heap与优先级队列
- 何时应通过常量引用传递运算符重载函数的参数
- 何时应防止隐式销毁?它是如何工作的
- 何时应使用std::atomic_compare_exchange_strong
- 何时应在非成员函数之前编写关键字 'static'?
- 什么是"is-implemented-in-terms-of"关系,何时应使用它?