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

Boost.Log 時間によるローテーション

C++

Boost.Logによるログファイル出力は、時間指定でもローテーションできます。
以下は、0時0分0秒になったら新たなログファイルを作成するプログラムです。

#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%"
    );

    // タイムスタンプの属性を設定(ローカル時間)
    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));
    }
}

時間によるローテーションには、time_based_rotationという名前付き引数を使用します。0時0分0秒にローテーションするために、ここではrotation_at_time_point(0, 0, 0)を指定しています。


これを実行すると、カレントディレクトリ以下に「log」という名前のディレクトリがまず作られます。

その後、「2013_08_01.log」のような、日付のログファイルが作られ、以下のような内容が出力されます。

[2013-Aug-01 23:57:00.460673]: hello
[2013-Aug-01 23:57:30.462061]: hello
[2013-Aug-01 23:58:00.462524]: hello
[2013-Aug-01 23:58:30.463472]: hello
[2013-Aug-01 23:59:00.464903]: hello
[2013-Aug-01 23:59:30.466290]: hello

日付が変わり、0時0分0秒になると、「2013_08_02.log」のような次の日のログファイルが作られ、以下のような内容が出力されます。

[2013-Aug-02 00:00:00.467714]: hello
[2013-Aug-02 00:00:30.470263]: hello
[2013-Aug-02 00:01:00.471617]: hello

ローテーションの条件は、先日紹介したファイルサイズと今回の時間によるものを複合指定できます。その場合はOR条件となり、「ファイルサイズが一定のところまで大きくなるか、もしくは指定された時間に到達したら新たなログファイルを作成する」という動作になります。