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 ...