Сохраните журнал, прежде чем я перенаправлю stdout и stderr - PullRequest
2 голосов
/ 08 ноября 2019

Запись программы, запускаемой в цикле while, может быть, в течение нескольких часов, поэтому я пытаюсь перенаправить cout и cerr для сохранения файлов журнала в каталоге, названном датой начала цикла.

Проблема в том, что яУ меня есть некоторый журнал, который должен быть сохранен перед циклом while, поэтому он записывает перед тем, как я перенаправлю stdout и stderr.

prepareLoop();
std::cout("Some log"); // Log before redirection
while (true)
{
   std::string date = getTodaysDate();

   // redirect stdout and stderr to log file with date on filename.
   std::ofstream logByDate { date + ".log", std::ios::app };
   std::ofstream ErrByDate { date + ".err", std::ios::app };
   std::cout.rdbuf(logByDate.rdbuf());
   std::cerr.rdbuf(ErrByDate.rdbuf());

   otherJobsToDo();
}

Я думал о сценарии оболочки, перенаправляющем stdout и stderr в файл, например,

./myProgram.out 2>> ${date}.err 1>> ${date}.log

но, похоже, не работает. Тот же вывод, что и при выполнении без перенаправления в сценарии.

Можно ли записать эти журналы перед циклом?

Сводка: Программа работает в течение нескольких дней. Я должен изменить файл журнала, когда день изменился. Итак, я буду продолжать перенаправлять stdout и stderr в цикле. Но есть некоторые журналы вне цикла, которые должны быть записаны в журнал. И перенаправление при выполнении не записывает их в журнал.

1 Ответ

0 голосов
/ 13 ноября 2019

Я думаю, что это будет работать, когда я дважды запускаю rdbuf () в программе, но по какой-то причине это не сработало, поэтому я просто создал класс и функцию, которая записывает журнал, основываясь на дате его выполнения.

void LogWriter::writeLog(const std::string& logContent)
{
    std::string date{ getDateString() };
    std::string logDir{ logRoot + date };

    makeDirectories(logDir);  

    std::string logPath{ logDir + '/' + logName + ".log" };

    std::ofstream out{ logPath, std::ios::app };
    out << logContent;
}

Он имеет некоторые преимущества по сравнению с перенаправлением stdout и stderr, поскольку он не создает пустые файлы до того, как они им понадобятся.

...