【发布时间】:2020-03-04 18:17:04
【问题描述】:
编写一个在 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 脚本,像这样
./myProgram.out 2>> ${date}.err 1>> ${date}.log
但它似乎不起作用。与我在脚本上没有重定向的情况下执行它时的输出相同。
我可以在循环之前写那些日志吗?
总结: 一个程序正在运行几天。当日子改变时,我必须更改日志文件。因此,我将继续在循环中重定向 stdout 和 stderr。但是循环外有一些日志必须写在日志上。并且执行时重定向不会将它们写入日志。
【问题讨论】:
-
这可能对 Linux 有所帮助:1 是标准输出,255 也是标准输出。
-
如果你在调用你的程序的时候做了重定向,不需要在代码中做,也不应该有输出到控制台。
-
@Cyrus 是的,我使用的是 linux。你能说得更具体点吗?
-
@stephanmg 感谢您的帮助,但这不是我找到的答案。我添加了摘要以澄清问题
-
用于重复打开/关闭。由于您必须在循环之前打开日志文件(以捕获循环前输出),为什么不添加日期更改测试 - 然后重新打开文件。它会给你一些效率,并减少这项服务的“噪音”。
标签: c++ bash logging stdout stderr