Boost.Log は fork() をサポートしていません。これは信じられないことですが、チケットのコメントに回避策が記載されています。
[..]したがって、今のところ、フォーク時にライブラリを再初期化するのはユーザー次第です。このような再初期化を行うには、pthread_atfork を使用できます。
したがって、私の質問: fork() の後に Boost.Log を正確に再初期化するにはどうすればよいですか?
コード例は大歓迎です。
すべてのシンクを処理し、子pthread_atfork
プロセスのハンドラーでそれらを再作成する必要があります。つまり、or関数は aをシンクに返します。それをリセットして、もう一度初期化します。add_console_log
add_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 ライブラリが fork のハンドラーを提供するのは皮肉なことですが、スレッドがある場合はこれを避けたいと考えています ...)。