6

ブースト 1.54.0 で Boost.Log を使用して、アプリケーションの実行可能なオプションであるかどうかを確認しています。一般に、バッファリングに問題はないので、auto_flush などをオンにするつもりはありません...しかし、呼び出す前にログに記録されたメッセージfork()が重複していることに気付きました。それらはバッファリングされるため、プロセスイメージがコピーされるとバッファが複製され、最終的に両方のプロセスがバッファコピーをログファイルに書き込みます...

fork()したがって、基本的には、メッセージがまだメモリに残っていないことを確認するために、呼び出す直前に、ログを 1 回だけ手動でフラッシュしたいと思います。つまり、ブースト ログで使用できる 、 、 などfflush().flush()似たものを探しています。<< flush

ログを使用<< flushしてみましたが、それでも重複したメッセージが表示されるため、フラッシュが原因で重複が他の問題によって引き起こされているのか、それとも何らかの形でサイレントに無視されているのかは 100% わかりません<< flush...

編集:

私は周りを見回していて、ブーストログがフォークセーフではないことがわかりました. したがって、親プロセスと子プロセスで同じログを使用しようとしていないことを付け加えておきます。私は2つの分岐シナリオを持っています.1つは、親がすぐに終了し、子が継続する(安全であるため)、もう1つは、子が独自の別のログファイルを開く必要があるため、これも安全である必要があります...しかし、私はログ ファイル シンクを閉じてから (別のファイルで) 新しいものを開く方法を理解する必要があります。シンクを閉じることも、フラッシュを強制する方法かもしれないと思います...?

4

2 に答える 2

7

さらに単純なコード (単純なログを使用):

#include <boost/filesystem.hpp>
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>

namespace logging = boost::log;

void InitLogging() {
  boost::filesystem::path full_path(boost::filesystem::current_path());

  auto sink = logging::add_file_log("sample.log");
  BOOST_LOG_TRIVIAL(info) << "Log initialized.";
  BOOST_LOG_TRIVIAL(info) << "Working dir: " << full_path;
  sink->flush();
}

int main() {
  InitLogging();
  return 0;
}

私のテストによると、フラッシュはブロック方法です。初期化中にのみ使用するので、そこで何か問題が発生した場合、実行がどこにあったかがわかります。

于 2013-12-31T14:58:25.050 に答える