[ C++で開発 ]
プログラムの開発・保守に欠かせない機能が「ロギング」です。開発中のデバッグ効率や、運用中の障害解析に、ロギングの機能が効いてきます。しかしながら、これを使えば、という定番がないのがC++の現状です。
ロギングライブラリには、ロギング機能のみを提供するロギング単体ライブラリと、フレームワークの一部としてロギング機能を提供するものがあります。
ログレベル、カテゴリ(分類)によるログ出力有無・出力先の設定
ログファイルのローテーション
出力形式の設定(タイムスタンプの分解能・時刻帯の指定、ロケール、他)
ログ出力コーディングの簡潔さ
コンソール、ファイル、ネットワーク、システムログなどへの出力手段
性能への考慮
ライブラリのメンテナンス状況
Windows上のVC++は、VC++8以降でないとコンパイルが通らない。原因はLocaltime.cppがVC++7.1以下を考慮していないため。具体的には、マクロ_MSC_VERの数値でバージョンを判定すべきところを、単にマクロ_MSC_VERが定義されていれば、VC++8以降で追加されたlocaltime_s関数を呼ぶようになっているから。修正としては、以下のようにコンパイラバージョンにより実行コードを変える。
// 修正結果
#if defined(_MSC_VER) && (_MSC_VER >= 1400) && defined(LOG4CPP_HAVE_LOCALTIME_R)
void localtime(const ::time_t* time, ::tm* t)
{
localtime_s(t, time);
}
#end
// 中略
#if defined(_MSC_VER) && (_MSC_VER < 1400) || !defined(LOG4CPP_HAVE_LOCALTIME_R)
void localtime(const ::time_t* time, ::tm* t)
{
::tm* tmp = ::localtime(time);
memcpy(t, tmp, sizeof(::tm));
}
#endif
Apache財団のプロジェクト。ライセンスはApache License 2.0、外部ライブラリ APR(The Apache Portable Runtime Library)を必要とする。ログ設定ファイルの書式は、log4j互換。
デバッグログ出力例
LOG4CXX_DEBUG(logger, "Hello, my name is " << name);
Googleのプロジェクト。ライセンスはBSD License (OSIの定義?するBSD License)
WindowsはVC++8以降(localtime_sなどが使われている)
Pantheios開発者による比較記事なのでバイアスがかかっているものとして見る必要がありますが、十分参考になります。