fork()之后log4cplus会发生什么?

问题描述 投票:1回答:1

我正在使用服务器,我希望能够使用log4cplus记录消息。到这里没什么太复杂的。

但是,每次收到连接请求时,我都会使用fork()创建子进程。 fork()用于确保子进程具有自己的数据库连接实例。

现在我也想在孩子身上使用Logger。它在服务器上工作得很好(也就是说,我可以在控制台和文件中看到日志输出。)但是在fork()之后它看起来好像丢了。

现在使用的是简化的概要:

log4cplus::PropertyConfigurator::doConfigure(filename);
log4cplus::Logger l(log4cplus::Logger::getInstance("snap"));
l.log(ll, "Server Started", f_file, f_line); // <<-- works great!
...
listen();
accept();
...
fork();
// if child:
log4cplus::Logger l(log4cplus::Logger::getInstance("snap"));
l.log(ll, msg, f_file, f_line); // <<-- does not work?!

我认为记录器可能正在将文件锁定在服务器中,因此孩子们不能自己打开同一个文件。是这样的吗?如果是这样,那么log4cplus不能在我的环境中使用...

c++ fork log4cplus
1个回答
2
投票

正如评论中所提到的,为了使它全部重新运行,您需要关闭所有内容并重新配置。

但是,如果您使用的是较新版本的日志服务器,则最终会使用至少一个线程。在那种情况下,fork()不会复制线程,因此如果只是在子进程中调用,则调用log4cplus::Logger::shutdown会锁定(它会在子进程中永远等待该线程。)

因此,正确的方法是关闭父级,分叉,然后在父级和子级中重新配置。以下函数显示了我们如何处理这种情况。

pid_t fork_child()
{
    // shutdown
    log4cplus::Logger::shutdown();
    pid_t p(fork());
    // reconfigure
    log4cplus::PropertyConfigurator::doConfigure("snap.properties");
    return p;
}
© www.soinside.com 2019 - 2024. All rights reserved.