BoostLogでtrivialなログを外部ファイルに出力する際にSeverityを追加する

プログラミング中にリソースの確保,処理の成否判定などを後から確認するためにログを出力したくなったため,Boost.Logを使いはじめることにしました.
とりあえずシンプルなものから触ってみようと思ったためまずはtrivialなlogを吐くことのできるBOOST_LOG_TRIVIALから使い始めることにしました.

使ってみて

サンプルコードをちょろちょろ書いてみてコンソール出力してみる

#include <iostream>
#include <string>


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


int main()
{
	BOOST_LOG_TRIVIAL( trace ) << "A trace severity message";
	BOOST_LOG_TRIVIAL( debug ) << "A debug severity message";
	BOOST_LOG_TRIVIAL( info ) << "An informational severity message";
	BOOST_LOG_TRIVIAL( warning ) << "A warning severity message";
	BOOST_LOG_TRIVIAL( error ) << "An error severity message";
	BOOST_LOG_TRIVIAL( fatal ) << "A fatal severity message";

	return 0;
}

出力

[2015-06-14 16:00:00.234050] [0x00000092] [trace]   A trace severity message
[2015-06-14 16:00:00.235050] [0x00000092] [debug]   A debug severity message
[2015-06-14 16:00:00.235050] [0x00000092] [info]    An informational severity me
ssage
[2015-06-14 16:00:00.235050] [0x00000092] [warning] A warning severity message
[2015-06-14 16:00:00.235050] [0x00000092] [error]   An error severity message
[2015-06-14 16:00:00.235050] [0x00000092] [fatal]   A fatal severity message

良いですね.とりあえずデフォルトのseverityだけであってもerrorやwarning,fatal,debugなどでフィルタできそうです(ちなみに出力際のフィルタもコード上で書けます).

コンソール出力を使用できない環境

しかし,このコードはコンソール出力が使えることを前提としているため,現在私はWin32ウインドウアプリケーションを作成しており,コンソールをそのまま見ることはできません.なので,後から見返す用にファイル出力してみます.

ファイル出力するコード

ファイル出力するにはboost::log::add_file_logを使用します(boost/log/utility/setup/file.hppがのインクルードが必要).

int main()
{
	boost::log::add_common_attributes();
	boost::log::add_file_log( "test.log" );

	
	BOOST_LOG_TRIVIAL( trace ) << "A trace severity message";
	BOOST_LOG_TRIVIAL( debug ) << "A debug severity message";
	BOOST_LOG_TRIVIAL( info ) << "An informational severity message";
	BOOST_LOG_TRIVIAL( warning ) << "A warning severity message";
	BOOST_LOG_TRIVIAL( error ) << "An error severity message";
	BOOST_LOG_TRIVIAL( fatal ) << "A fatal severity message";

	return 0;
}

このコードによりtest.logというファイルが出力されます.
出力

A trace severity message
A debug severity message
An informational severity message
A warning severity message
An error severity message
A fatal severity message

出力が違う

出力が違いますね.少なくともsevirityは欲しいところです.そこでboost::log::register_simple_formatter_factoryの出番です.これを使うことで出力にSeverityを登録することができます.

ファイルにもSeverityを出力したい

#include <iostream>
#include <string>

#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp> //add_common_attributesに使用.必須ではない
#include <boost/log/trivial.hpp>


int main()
{
	boost::log::register_simple_formatter_factory< boost::log::trivial::severity_level, char >( "Severity" );
	boost::log::add_common_attributes();//TimeStampを使うために追加
	boost::log::add_file_log( "test.log",
		boost::log::keywords::format = "[%TimeStamp%][%Severity%]: %Message%" );

	
	BOOST_LOG_TRIVIAL( trace ) << "A trace severity message";
	BOOST_LOG_TRIVIAL( debug ) << "A debug severity message";
	BOOST_LOG_TRIVIAL( info ) << "An informational severity message";
	BOOST_LOG_TRIVIAL( warning ) << "A warning severity message";
	BOOST_LOG_TRIVIAL( error ) << "An error severity message";
	BOOST_LOG_TRIVIAL( fatal ) << "A fatal severity message";

	return 0;
}

出力

[2015-Jun-14 16:13:30.993423][trace]: A trace severity message
[2015-Jun-14 16:13:30.995423][debug]: A debug severity message
[2015-Jun-14 16:13:30.995423][info]: An informational severity message
[2015-Jun-14 16:13:30.995423][warning]: A warning severity message
[2015-Jun-14 16:13:30.996423][error]: An error severity message
[2015-Jun-14 16:13:30.996423][fatal]: A fatal severity message

Sevirityが追加されました.これでSevirityによるフィルタを後から適当にすることも可能になりますし,目でも追いやすくなります.

補足

上記のコード,出力の中でTimeStampも出力しています.これを使うにはboost/log/utility/setup/common_attributes.hppをインクルードし,boost::log::add_common_attributesを呼びださなければなりません.これを使うことにより,他にもプロセスのIDやスレッドのIDなどを出力できるようになります.適宜formatを編集するとよいでしょう.

以上,BoostLogでtrivialなログにSeverityを追加する方法でした.