作者:无情的有情人家_834 | 来源:互联网 | 2023-09-24 19:00
编写一个可能在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();
}
我想到了这样的shell脚本,将stdout和stderr重定向到文件
./myProgram.out 2>> ${date}.err 1>> ${date}.log
但是它似乎不起作用。与在脚本上没有重定向的情况下执行时的输出相同。
我可以在循环前写那些日志吗?
摘要:
一个程序运行了几天。一天更改后,我必须更改日志文件。因此,我将继续循环重定向stdout和stderr。但是循环之外有一些日志必须写在日志上。而且执行时重定向不会将它们写入日志。
我认为当我在程序中两次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 <}
与重定向stdout和stderr相比,它具有一些优势,因为它不会在需要空文件之前生成空文件。