我想知道Logging类何时或多久应该刷新一次流 - 为什么?它应该在每个日志之后刷新,还是等待流缓冲区填充然后刷新,或者介于两者之间?
进一步说明我的问题:
我的日志记录类包含对某些std::ostream stream
的引用,并使用operator<<
进行输入。我可以在每一行输入后刷新,让我们说使用std::endl;
- 但我没有,而是我use stream << "\n"
来强制换行。当流缓冲区已满或正在进行流/记录器破坏时,我会发生刷新。
答案 0 :(得分:6)
尽可能经常,以免在崩溃时丢失任何条目,并在程序运行时获得更好的实时信息。
尽可能避免写入文件的开销。
这些要求存在冲突,因此您需要找到符合您需求的余额。
您可能需要考虑某些日志消息可能不如其他消息重要,您可以使用它来影响您的刷新策略。
您可以使用信号处理程序(或类似的操作系统特定技术)在崩溃前立即刷新缓冲区。请注意,刷新std::stream
在技术上是您不允许在信号处理程序中执行的操作(尽管这可能取决于其实现),但可能可以工作,而且#39} ; s通常比崩溃更好。
答案 1 :(得分:3)
在C ++中,iostreams库有2个用于记录的类。
两者都绑定到stderr
。
cerr
- 格式化每个输入后刷新,这意味着每次调用后都会刷新。
clog
- 在手动填充或调用缓冲区时刷新(例如:endl
或flush()
)。
我们的想法是,您希望尽快输出错误。 但是日志记录可以分批输出。
答案 2 :(得分:0)
取决于。虽然日志记录通常会缩小以表示某些与错误相关的消息传递机制,但它并不总是与错误相关联。相比之下,有时它甚至会明确地与错误分开(例如clog
与cerr
)。另一个例子是tracing。因此,日志记录系统的设计者需要决定使用特定日志记录实现哪种完整性级别。
基于流的日志记录可以是报告错误的简单方法。它不是最后排序的特征,但依赖于唯一方式来记录致命错误是不明智的。总比没有好(特别是在强调可移植性的情况下)......当你必须依赖这种方式时,尽快冲洗它。