记录器何时应刷新

When should a Logger flush?

本文关键字:刷新 何时应 记录器      更新时间:2023-10-16

我想知道日志记录类应该何时或多久刷新一次其流 - 为什么?它应该在每个日志后刷新,还是等待流缓冲区填满然后刷新,还是介于两者之间?

为了进一步说明我的问题:

我的日志记录类包含对某些std::ostream stream的引用,并使用operator<<进行输入。我可以在每行输入后刷新,比如说使用 std::endl; - 但我没有,相反,我use stream << "n"只是强制换行符。当流缓冲区已满或流/记录器销毁时,我让刷新发生。

尽可能多地,以便在崩溃时不会丢失任何条目,并且在程序运行时获得更好的实时信息。

尽可能少地避免写入文件的开销。

这些要求相互冲突,因此您需要找到适合您需求的平衡点。

您可能需要考虑某些日志消息可能不如其他日志消息重要,您可以使用它来影响刷新策略。

可以使用信号处理程序(或类似的操作系统特定技术(在崩溃之前刷新缓冲区。请注意,从技术上讲,刷新std::stream是不允许在信号处理程序中执行的操作(尽管这可能取决于其实现(,但它可能会起作用,这通常比崩溃要好。

在C++中,iostreams库有2个用于日志记录的类。两者都注定要stderr.

cerr - 在格式化每个输入后刷新,这意味着在每次调用后刷新。

clog - 填充或手动调用缓冲区时刷新(例如:endlflush() (。

想法是,您希望尽快输出错误。但日志记录可以批量输出。

这取决于。尽管日志记录通常缩小以表示某些与错误相关的消息传递机制,但它并不总是与错误相关联。相反,有时它甚至被错误明确分离(例如 clog vs. cerr(。另一个例子是一般的跟踪。因此,由您(日志记录系统的设计者(决定要使用特定日志记录实现的完整性级别。

基于流的日志记录是报告错误的简单方法。它不是最后排序的功能,但将其作为记录致命错误的唯一方法是不明智的。总比没有好(特别是在强调便携性的情况下(......当您必须依赖这种方式时,请尽快刷新它。