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

Boost.Log ファイルサイズによるローテーション

C++

Boost.Logのログファイル出力には、ローテーションの機能が付いています。
出力する日時によって出力先のログファイルを切り替えたり、ファイルサイズが大きくなってきたら他のファイルに切り替えたりする機能です。

今回は、ファイルサイズでのローテーションを紹介します。

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

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

int main()
{
    // ログファイルの出力設定
    // logsディレクトリに「年月日_時分秒_番号.log」というファイル名でログ出力
    // 1ファイルあたり1KBで区切る
    boost::log::add_file_log(
        keywords::file_name = "logs/%Y%m%d_%H%M%S_%5N.log",
        keywords::rotation_size = 10 * 1024,
        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";
    }
}

ここでは、ログファイルのサイズが1KBを超えたら、自動的に新たなログファイルを作るようにしています。
ログファイル名に「%N」というプレースホルダを書いておけば、それが新たなログファイルを作る際にインクリメントされるカウンタとして扱われます。ここでは、5桁のカウンタにするために「%5N」と書いています。


これを実行すると、カレントディレクトリ以下に「logs」という名前のディレクトリが作られ、そのディレクトリに以下のような名前の、4つのログファイルが作られます。

20130801_153725_00000.log
20130801_153725_00001.log
20130801_153725_00002.log
20130801_153725_00003.log

これらのファイルの中身は、以下のようになっています:

[2013-Aug-01 15:37:25.058761]: hello
[2013-Aug-01 15:37:25.058946]: hello
[2013-Aug-01 15:37:25.058990]: hello
[2013-Aug-01 15:37:25.059031]: hello
[2013-Aug-01 15:37:25.059077]: hello
...