Как простой способ сохранить несколько журналов состояния и т. Д. Я выбрал std::stringstream
. В случае ошибки я могу просто сбросить .rdbuf()
в файл, чтобы иметь возможность воспроизводить то, что моя программа делала до того, как он разбился.Уменьшение размера строки stream
Моя проблема теперь в том, что этот поток строк растет бесконечно. Я попробовал несколько вещей, чтобы убедиться, что я сохраняю только 1MiB или около того потока, но не был успешным.
.rdbuf()->pubseekoff(...)
.ignore(...)
getline(...)
ss.str() = ss.str().substr(...)
Видимо основной объект буфера всегда только увеличивается в размерах - независимо от того, некоторые данные уже читать или нет.
Есть ли способ уменьшить размер/удержать его при некоторой постоянной (желательно без регулярных глубоких копий)? Круговой буфер как базовый буферный объект был бы идеальным - это возможно? Особенно это уже существует?
EDIT: Решение в основном должен вести себя подобно потоку. Он помещается procompiler вместо std :: err или прямого filestream (аналогично boost :: log). Поэтому это не является строго необходимым, но очень полезно использовать строковый поток. (В противном случае я бы реализовать все ostream вещи, чтобы быть в состоянии потока зЬй :: епсИ ...)
Считаете ли вы, что вы просто используете 'std :: ofstream' и сбрасываете непосредственно в файл журнала? – AJG85
@ AJG85 Он становится слишком большим. Программа должна работать 24/7 и создавать несколько GiB данных в день. В любом случае мне не нужен весь этот журнал - меня интересуют только последние несколько минут (или секунд) перед сбоем. – example
Существует принцип, называемый «поворот журнала», который звучит применимо. Вы сохраняете один или два «старых» и один «текущий» лог-файлы. Каждые X единиц времени вы меняете «текущий» на один из старших и удаляете самый старый. В linux есть даже инструменты для этого, поскольку печать журнала открывается и закрывает файл достаточно часто (если файл остается открытым ВСЕ ВРЕМЯ, вы просто продолжаете писать старый файл, который был удален, потому что это работает с файловыми системами стиля Unix). –