log4cplus 在 fork() 之后会发生什么
What happens with log4cplus after a fork()?
我在服务器上工作,我希望能够使用 log4cplus 记录消息。到这里为止,没有什么太复杂的。
但是,每次收到连接请求时,我都会使用 fork()
创建子进程。fork()
是确保子进程具有自己的数据库连接实例。
现在我也想在孩子身上使用记录器。它在服务器中运行良好(即我可以在控制台中看到日志输出和设置文件。但是在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 不能在我的环境中使用......
如评论中所述,要使其再次正常工作,您需要关闭所有内容并重新配置。
但是,如果您使用的是较新版本和日志记录服务器,则最终至少有一个线程。在这种情况下,fork()
不会复制线程,因此如果只是在子进程中调用log4cplus::Logger::shutdown
,则调用该线程会锁定(它在子进程中永远等待该线程)。
关闭,分叉,然后在父级和子级中重新配置。以下函数显示了我们如何处理这种情况。
pid_t fork_child()
{
// shutdown
log4cplus::Logger::shutdown();
pid_t p(fork());
// reconfigure
log4cplus::PropertyConfigurator::doConfigure("snap.properties");
return p;
}
相关文章:
- "x += x--"之后的 x 是什么?
- 在函数声明之后声明整数有什么用?
- 是什么导致了构造函数之后的这些"意外令牌"错误?
- 在写依赖性之后,读取了什么
- 在调用解构之后,存储在内存中的动态分配值会发生什么变化
- 我什么时候应该使用删除?(在动态创建的2D数组之后未删除的后果)
- 如果在获取互斥锁之后发生中断,会发生什么
- 当第一个 itr 在最后一个 itr 之后时,std::vector 范围构造函数的官方行为是什么?
- 在 GetTransfer 之后,我在帐户 1 收到未分配变量错误。我无法弄清楚我搞砸了什么逻辑错误
- 在循环双向链表的第一个节点之前/之后插入的算法是什么?
- 无法弄清楚出了什么问题,函数等之后的类中没有正确的变量值
- 对于 (placement_params) 新运算符之后和 c++ 中键入之前的括号意味着什么?
- 当 const 放在函数的声明之后是什么意思?
- 这个分号在try/catch宏之后的效果是什么
- 有没有什么好的方法可以控制手动缩进行之后的行
- 想知道我的代码有什么问题?一旦播放器名称达到 100,应该输出获胜者,但在之后再次循环
- "在返回语句之后' ; '预期,有人可以告诉我我的代码出了什么问题吗?
- Boost库在c++中包含之后会发生什么,除了使用旧的标准代码
- 类的函数声明之后"default"是什么意思?
- log4cplus 在 fork() 之后会发生什么