読者です 読者をやめる 読者になる 読者になる

Boost.Log 自動的にフラッシュする

C++

ファイルにログ出力するなら、やはり書き込むたびに自動的にフラッシュしてほしいです。(std::fstreamは自動的にフラッシュされます。)
Boost.Logは、ファイル出力のセットアップ時に、自動的にフラッシュするかどうかを設定できます。

先日の、時間によるローテーションを行うサンプルを、ちょっと修正してみます。

#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/attributes.hpp>

#include <boost/thread.hpp>
#include <boost/chrono/duration.hpp>

namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;
namespace sinks = boost::log::sinks;

int main()
{
    // ログファイルの出力設定
    // logsディレクトリに「年_月_日.log」というファイル名でログ出力
    // 0時0分0秒に、新たなログファイルを作成する
    boost::log::add_file_log(
        keywords::file_name = "logs/%Y_%m_%d.log",
        keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
        keywords::format = "[%TimeStamp%]: %Message%",
        keywords::auto_flush = true
    );

    // タイムスタンプの属性を設定(ローカル時間)
    boost::log::core::get()->add_global_attribute("TimeStamp", attrs::local_clock());

    for (int i = 0; i < 1000; ++i) {
        BOOST_LOG_TRIVIAL(info) << "hello";
//      boost::log::core::get()->flush(); // 手動フラッシュはいらないのでコメントアウト

        // 30秒起きに出力
        boost::this_thread::sleep_for(boost::chrono::seconds(30));
    }
}

add_file_log()関数の名前付き引数として、「keywords::auto_flush = true」を渡しています。
これで、書き込みのたびに自動的にフラッシュされます。