C++ 在fork()之后,log4cplus会发生什么情况?

C++ 在fork()之后,log4cplus会发生什么情况?,c++,fork,log4cplus,C++,Fork,Log4cplus,我正在服务器上工作,我希望能够使用log4cplus记录消息。到现在为止没什么太复杂的 但是,每次收到连接请求时,我都使用fork()创建一个子进程。fork()用于确保子进程拥有自己的数据库连接实例 现在,我也想在child中使用Logger。它在服务器上工作得很好(即,我可以在控制台中看到日志输出,并在设置时看到文件。)但是在fork()之后,它看起来好像丢失了 现在使用的是一个简化的大纲: log4cplus::PropertyConfigurator::doConfigure(filen

我正在服务器上工作,我希望能够使用log4cplus记录消息。到现在为止没什么太复杂的

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

现在,我也想在child中使用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::PropertyConfigurator::doConfigure(文件名);
log4cplus::Logger l(log4cplus::Logger::getInstance(“snap”);

l、 日志(ll,“服务器已启动”,f_文件,f_行);// 正如在评论中提到的,要使其再次工作,您需要关闭所有内容并重新配置

但是,如果您使用的是较新版本和loggingserver,则至少会有一个线程。在这种情况下,
fork()
将不会复制线程,因此如果在子进程中调用,则调用
log4cplus::Logger::shutdown
将锁定(它将在子进程中永远等待该线程)

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

pid_t fork_child()
{
    // shutdown
    log4cplus::Logger::shutdown();
    pid_t p(fork());
    // reconfigure
    log4cplus::PropertyConfigurator::doConfigure("snap.properties");
    return p;
}

在创建新的记录器实例之前,请关闭子项中现有的记录器实例。是否通过shutdown()调用完成此操作?好的!成功了。shutdown()+重新配置并获取实例()。