【问题标题】:C++ - Continously reading the newest lines of a live log fileC++ - 持续读取实时日志文件的最新行
【发布时间】:2013-01-24 23:38:19
【问题描述】:

我编写了以下方法,该方法基本上从另一个线程连续写入的日志文件中读取最新行。此代码在不同的线程上运行并由计时器驱动(每 5 秒触发一次)。这很简单。这是它的样子:

void FileManager::ReadFile()
{
    std::vector<std::string> vecLines;
    std::string line;

    m_InputStream.clear();

    while (std::getline(m_InputStream, line))
    {
        vecLines.push_back(line);
    }

    if (! vecLines.empty())
    {
        OnFileUpdate(vecLines);
    }
}

我的问题,这段代码安全吗?基本上,我执行的算法是提前打开输入流并查找文件末尾。然后当这个方法被调用时,如果有任何新的行要读取,那么它们将被读取到这里。如果有任何新行,则将通知该类的任何感兴趣的客户(通过 OnFileUpdate() 调用)。

【问题讨论】:

  • 听起来像tail -f。也许查看源代码进行比较。
  • 你不喜欢消息传递? (线程X:--嘿主线程,我写了一些东西,你打算怎么办?主线程:--好的,我会把它发送到一个函数,保持良好的工作,直到你死。)
  • 嗯,日志文件的写入部分超出了我的控制范围。我正在一个应用程序中创建一个新线程,它将监视日志文件是否满足某些条件(我查看更新的行以找出答案)。

标签: c++ file io


【解决方案1】:

这需要在后台挂起一个线程。

我要做的是创建一个类来处理您的所有错误/事件日志记录,如下所示。您可以将所有内容设为静态,然后您可以从多个位置访问它 优点: 没有额外的文件 I/O 没有辅助线程 缺点: 没有锁就不是多核安全

class EventLogger {
  public:
    EventLogger();
    ~EventLogger();
    void LogEvent(const std::string &event) {
      //Handle output to file here
      OnFileUpdate(event);
    }
  private: 
    void OnFileUpdate(const std::string &event) {
      //DoWorkHere
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多