1

サーバーで作業していますが、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は私の環境では使用できません...

4

1 に答える 1

2

コメントで述べたように、すべてを再び機能させるには、すべてを閉じて再構成する必要があります。

ただし、新しいバージョンとロギングサーバーを使用している場合は、少なくとも1つのスレッドになります。その状況では、fork()はスレッドを複製しないためlog4cplus::Logger::shutdown、子プロセスで呼び出された場合は呼び出しがロックされます(子プロセスでそのスレッドを永久に待機します)。

したがって、これを行う適切な方法は、親でシャットダウンし、フォークしてから、親と子で再構成することです。次の関数は、状況を処理する方法を示しています。

pid_t fork_child()
{
    // shutdown
    log4cplus::Logger::shutdown();
    pid_t p(fork());
    // reconfigure
    log4cplus::PropertyConfigurator::doConfigure("snap.properties");
    return p;
}
于 2015-06-01T07:27:15.997 に答える