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

标签 c++ fork log4cplus

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

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

现在我也想在 child 身上使用记录器。它在服务器上运行良好(即我可以在控制台和文件中看到日志输出,因为我设置了它。)但是在 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?!

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

最佳答案

如评论中所述,要使其重新正常工作,您需要关闭所有内容并重新配置。

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

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

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

关于c++ - fork() 之后 log4cplus 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14657891/

相关文章:

c++ - 什么可以使 nanosleep 在 mac OS X 10.9 上精确漂移 10 秒

c++ - 如何使用输入流重载将项目插入类中的映射成员?

c++ - 免费互斥问题

c++ - 使用 log4cplus 运行代码时出现 bad_alloc 错误

c++ - 如何终止DLL中的log4cplus?

c++ - 如何压缩日志文件?

c++ - 在共享库的用户之间共享数据

c - 一个父进程有 2 个子进程

c - 如何测试 fork(); Windows 上的函数

创建太多进程,似乎只终止父进程