【问题标题】:Is there a way to monitor syslog in realtime from a C++ application under Linux?有没有办法从 Linux 下的 C++ 应用程序实时监控 syslog?
【发布时间】:2022-01-20 10:44:56
【问题描述】:

当 USB 1.1 设备连接或断开 USB 3.0 端口时,我在 ARM Linux 板上出现一些 USB 问题,在这种情况下会生成内核消息,例如:

[14720.301195@0] usb 1-1.4: urb 状态-32

这条消息确实淹没了系统日志,重复了数百次。我的应用程序需要尽快拦截此消息并执行一些操作,例如释放一些外围设备并重新实例化一些对象。由于仅在其他 USB 1.1 设备打开并正在使用时才会生成错误,因此一旦我释放它们,错误就会消失。这似乎是防止消息泛滥的唯一方法。

我尝试过对 bash 命令进行轮询:

tail -n 1 /var/log/syslog

但显然日志文件的更新速度不够快,即使我将 /var/log/ 挂载在 ram 磁盘 (ramfs) 中也是如此。

我不知道还有什么方法可以“连接”到系统日志并在消息生成后实时读取它们。

【问题讨论】:

  • 如果您的内核是 3.5.0 或更高版本,则 kernel.org/doc/Documentation/ABI/testing/dev-kmsgdmesg -w 使用...假设这是内核消息。它确实看起来像一个。
  • 内核版本为 4.9.277-76。谢谢你的链接,我去看看。

标签: c++ linux linux-kernel syslog


【解决方案1】:

尝试使用-f(关注)标志。

tail -f /var/log/syslog

那么你不需要每次都轮询它。以下似乎适用于我的 Linux:

#include <iostream>
#include <memory>

using namespace std;

int main()
{
    unique_ptr<FILE, decltype(&pclose)> pipe(popen("tail -f /var/log/syslog", "r"), pclose);
    if (!pipe)
        throw runtime_error("popen failed");

    array<char, 4096> buffer;
    while (fgets(buffer.data(), buffer.size(), pipe.get()))
        cout << "SYSLOG: " << buffer.data() << endl;
}

并且可以通过以下方式进行调试:

python -c 'import syslog; syslog.syslog("Hello syslog")'

【讨论】:

  • 不幸的是,这个解决方案对我不起作用,因为正如我在帖子中所说,文件 /var/log/syslog 更新速度不够快,无法及时发现错误并采取行动。我只有在错误洪水终止后才能获得更新,但我可以在串行控制台上看到它。
  • 保存日志通常不是时间紧迫的,因此rsyslog 和其他通常在保存之前汇总日志。 dmesg -w(如@dratenik 所述)应该提供更多“实时”结果,但需要 sudo AFAIK。也许您可以直接与 USB 驱动程序通信以获得更合适的解决方案。
猜你喜欢
  • 2013-05-16
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
相关资源
最近更新 更多