【问题标题】:Save log before I redirect stdout and stderr在重定向 stdout 和 stderr 之前保存日志
【发布时间】: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


【解决方案1】:

我认为当我在程序中 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 相比,它有一些优势,因为它不会在需要它们之前生成空文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多