【发布时间】:2013-09-11 23:37:29
【问题描述】:
作为一种存储多个状态日志等的简单方法。我选择了std::stringstream。如果出现错误,我可以简单地将.rdbuf() 转储到一个文件中,以便能够重现我的程序在崩溃之前所做的事情。
我现在的问题是,这个字符串流的大小会无限增长。我已经尝试了几件事来确保我只保留流的最后 1MiB 左右,但没有成功。
.rdbuf()->pubseekoff(...).ignore(...)getline(...)ss.str() = ss.str().substr(...)
显然,底层缓冲区对象总是只会增加大小 - 无论是否已读取某些数据。
有什么方法可以减小大小/将其保持在某个常数(最好没有常规的深拷贝)? 作为底层缓冲区对象的循环缓冲区将是完美的 - 这可能吗?特别是。已经存在了吗?
编辑: 解决方案基本上必须表现得像一个流。它由 procompiler 放置,而不是 std::err 或直接文件流(类似于 boost::log)。因此,使用字符串流不是绝对必要的,但非常有用。 (否则我必须实现所有 ostream 的东西才能流式传输 std::endl...)
【问题讨论】:
-
您是否考虑过只使用
std::ofstream并直接刷新到日志文件? -
@AJG85 它变得太大了。该程序必须 24/7 全天候运行,并且每天会创建数 GiB 的数据。无论如何,我真的不需要所有这些日志 - 我只对崩溃前的最后几分钟(或几秒钟)感兴趣。
-
有一个叫做“日志轮换”的原则听起来很适用。您保留一两个“旧”和一个“当前”日志文件。每 X 个单位时间,您将“当前”更改为较旧的一个,并删除最旧的。在 linux 中,甚至有工具可以为您执行此操作,只要日志打印足够频繁地打开和关闭文件(如果文件一直保持打开状态,您只需继续写入已删除的旧文件,因为 Unix 风格的文件系统就是这样工作的)。
-
磁盘便宜,内存不便宜。记录器的常见设计是使用滚动文件。当您超过某个大小时,您关闭并重命名文件索引,删除或归档最旧的文件,然后打开一个新文件。理想情况下,这将是可配置的。对于我实现的电信服务器,它也运行 24/7,我几乎打印了每个线程的每个方法的每个入口和出口,并发现 20 个文件,每个 25MB 足以跟踪大多数站点的任何问题。
-
@MatsPetersson 我看你打字速度更快 ;-)
标签: c++ c++11 std stringstream