微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将行从多个分布式进程中并行写入日志文件

如何解决如何将行从多个分布式进程中并行写入日志文件

我试过 boost::log 但我根本没有在文件中得到任何东西。事实上,该文件甚至没有被创建。

再说一遍:重点是让许多客户端进程分布在网络上,将消息写入同一个文件中。

而且我没有使用所有这些属性、接收器、源和过滤器——我什至不知道它们的用途。事实上,我更喜欢一个简单的构造函数一个流操作符。

以下是完全不产生任何输出的当前代码

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/record_ostream.hpp>


static int initFileLogging(void)
{       namespace logging = boost::log;
        namespace src = boost::log::sources;
        namespace sinks = boost::log::sinks;
        namespace keywords = boost::log::keywords;
        logging::add_file_log("~/smc.log");
        logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::info);
        logging::add_common_attributes();
        return 0;
}
int main(int,char**)
{
        initFileLogging();

        namespace logging = boost::log;
        namespace src = boost::log::sources;
        using namespace logging::trivial;
        src::severity_logger< severity_level > lg;
        BOOST_LOG_SEV(lg,debug) << "test" << std::endl;
}

解决方法

我试过 boost::log 但我根本没有在文件中得到任何东西。事实上,该文件甚至没有被创建。

在示例代码片段中,您设置了一个全局过滤器,仅通过严重级别为 trivial::info 或更高级别的日志记录,但您发出的日志记录级别为 trivial::debug,该级别较低。日志记录被丢弃,并且由于没有日志记录到达文件接收器后端,因此不会创建文件。

而且我没有使用所有这些属性、接收器、源和过滤器

显然,您这样做了,因为您使用的是严重性级别,它是一个属性、一个过滤器和一个文件接收器。您可能还会在最终解决方案中使用不同的接收器类型。

您应该真正阅读库文档中的 Design section 以更好地了解库的工作原理,以便有效地使用它。

如何从多个并行的分布式进程中将行写入日志文件

关键是让许多客户端进程分布在网络上,将消息写入同一个文件。

如果您确实在网络中的不同机器上有多个进程,那么Boost.Log 中没有内置解决方案。如果您在类 UNIX 系统上工作,您很可能有权访问 syslog 服务,并且 Boost.Log 可以生成带有 syslog sink backend 的 syslog 消息。您可以在所有机器上配置 syslog 服务以将消息传输到公共服务器,该服务器会将它们写入公共日志文件中。在这里,syslog 服务实现了网络通信和文件写入部分。

或者,您可以使用 Boost.ASIO 创建一个 TCP iostream,并将其与 Boost.Log 中的 ostream sink backend 一起使用。 TCP iostream 必须连接到公共服务器,该服务器将接收格式化的日志记录并将它们写入文件。不过,您必须自己编写服务器。

如果您的多个进程将在同一台机器上运行(即不分布在网络上),那么您可以使用 IPC message queue backend 将日志记录传递给将写入日志文件的公共进程。此后端使用使用共享内存实现的 IPC message queue,可能比套接字更高效。在这种情况下,您也必须自己实现服务器进程,有一个 example in the docs

如果这些都不起作用,您可以随时实施 your own sink backend

无论如何,您可以在所有建议中看到一个共同的主题。您需要有一个将写入日志文件的公共进程,以及将其日志记录传递到该公共服务器的客户端进程。问题只是使用哪种传输方式以及如何实现它。

您可能想避免使用消息传递设计,而是使用文件锁定来同步多个进程对一个公共文件的并发访问(该文件可能会安装在每台客户端计算机的共享文件夹中)。首先,我应该注意到 Boost.Log 没有实现文件锁定,因此在像这样的公共文件上使用开箱即用的文件接收器将无法正常工作。接下来,无论如何我都建议不要使用这种方法,因为 (a) 文件锁定可能无法通过网络共享可靠地工作,并且 (b) 文件锁定会在您的所有客户端进程中创建一个争用点,这会影响可扩展性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?