我有一个 linux 程序(语言无关紧要),它将它的日志打印到标准输出上。监控过程需要日志。
现在我将通过分叉或使用线程来并行化它。
问题:生成的标准输出将包含不相关行的不可读混合......
最后是问题:您将如何重新构建并行进程的输出逻辑?
我有一个 linux 程序(语言无关紧要),它将它的日志打印到标准输出上。监控过程需要日志。
现在我将通过分叉或使用线程来并行化它。
问题:生成的标准输出将包含不相关行的不可读混合......
最后是问题:您将如何重新构建并行进程的输出逻辑?
不好意思回答自己...
明确的解决方案是使用GNU 并行实用程序。
它取代了众所周知的xargs
实用程序,但并行运行命令,将输出分成组。
所以我只是保留了我简单的单进程单线程实用程序,并通过parallel
这样的管道调用它:
生成参数列表 | 并行<选项> my-utility
这取决于并行的选项可以为多次调用产生很好的分组输出my-utility
如果它是多线程的,那么您需要对标准输出日志的打印/写入进行互斥保护。在 Linux 和 c/c++ 中最常用的方法是使用 pthread_mutex。此外,如果它的 c++,boost 具有可以使用的同步。
要实现它,您可能应该将所有日志记录封装在一个函数或对象中,并在内部锁定和解锁互斥锁。
如果日志记录阻塞性能变得令人望而却步,您可以考虑缓冲日志消息(在上述对象或函数中),并且仅在缓冲区已满时才写入标准输出。您仍然需要互斥锁保护来缓冲,但缓冲将比写入标准输出更快。
如果每个线程都有自己的日志消息,那么它们仍然需要共享相同的互斥锁来写入标准输出。在这种情况下,最好每个线程缓冲其各自的日志消息,并且仅在缓冲区已满时才写入 stdout,从而仅获取用于写入 stdout 的互斥锁。
如果您使用 C++,我会考虑使用Pantheios或衍生版本 Boost::Log 或使用查看Logging In C++ : Part 2或
如果您使用另一种语言,那么围绕 IO 操作的文件锁定可能是查看File Locks的方式,您可以使用信号机或任何其他过程控制系统获得相同的结果,但对我而言,文件锁定是最简单的。
如果此监控被视为系统范围,您也可以考虑使用syslog 。
我们使用的另一种方法是委托一个线程,记录器线程,用于记录。希望记录的所有其他线程将其发送到记录器线程。此方法为您提供了灵活性,因为日志的格式可以在一个地方完成,也可以配置。如果您不想担心锁可以使用套接字进行消息传递。