gpt4 book ai didi

c++ - 在重定向stdout和stderr之前保存日志

转载 作者:行者123 更新时间:2023-12-01 14:58:32 26 4
gpt4 key购买 nike

编写一个可能在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 << logContent;
}

与重定向stdout和stderr相比,它具有一些优势,因为它不会在需要空文件之前先生成空文件。

关于c++ - 在重定向stdout和stderr之前保存日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58761062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com