2013-08-31 53 views
8

Boost.Log does not support fork()。这是令人难以置信的,但一个ticket comment描述了一个解决方法:如何在叉上重新初始化Boost日志库?

[..]所以现在是由用户重新初始化叉库。你可以使用pthread_atfork来做这种重新初始化。

因此我的问题:如何在fork()之后重新初始化Boost.Log?

代码示例非常感谢。

+0

您是否找到了解决方案?谢谢。 – marathon

+0

@马拉松,不幸的是,我没有。 – maxschlepzig

回答

1

您必须照顾所有接收器,并在处理器中在子进程 process_中重新创建它们。即add_console_logadd_file_log函数会将boost::shared_ptr返回到接收器。重置它,并再次初始化 。

... 
boost::shared_ptr< 
    sinks::synchronous_sink<sinks::text_ostream_backend> 
> console_sink = logging::add_console_log(); 
... 
void fork_child_handler(void) 
{ 
    console_sink = logging::add_console_log(); 
    return; 
} 

// in some global setup code of your application 
pthread_atfork(NULL /*prepare*/, 
       NULL /* parent */, 
       &fork_child_handler); 

保重,那fork可能留下的不仅仅是打破 日志水槽更多的事情。远离多线程和fork通过所有的手段 (它的一些讽刺,pthread库提供了处理程序叉, ,你想避免,如果有线程...)。