物理実験のエラーロギングに Boost.Log を使ってみる
最近 Cherenkov Telescope Array (CTA) のデータ収集 (DAQ) 用のライブラリを C++ で書いている。自分は物理実験屋であってプログラマではないので、あんまり高級なことはやらないのだけど、色々と作業を楽にするために平均的な物理実験屋よりは新しいものを使いたがる傾向にある。
このライブラリを書き始めた当初、エラーログの管理をどうするかな、というのが検討事項のひとつに挙がった。まあ、エラーの出力を標準エラーやテキストファイルに書き出すだけなので難しいことではないのだけど、以下の要求を満たす必要がある。
- ユーザが簡単に使えること。
- エラーレベルが複数に分かれていて (今回の場合は Debug/Info/Warning/Error/Fatal の 5 種類)、目的に応じて出力レベルの切り替えが出来ること。
- エラーの発生時刻も自動で記録すること。
- 出力先を標準エラーにしたり、テキストファイルにしたりできること (もしくは両方)。
- マルチスレッドでちゃんと動くこと。
- 車輪の最発明をしたくないので、既存のライブラリを使う。ただし、開発が今後 10 年間は継続すると見込まれること。
で、Boost.Log を使うことにしました。Boost 自体はこのページに辿りつく人には説明する必要がないかもしれませんが、C++ の巨大なライブラリ群です。Boost で採用されたライブラリが C++11 で採用されていたりします。Boost.Log は Boost に正式採択されたのが 2010 年なので、比較的新しい部類に入ります。
- 作者: ビョルン・カールソン,村上雅章
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/10/07
- メディア: 単行本(ソフトカバー)
- 購入: 9人 クリック: 61回
- この商品を含むブログ (22件) を見る
ロギング (logging) という作業自体は色々なプログラムで必要となりますが、その単純な作業の割に Boost.Log の仕組みは複雑でマニュアルも分かりやすくありません。そのせいか、検索してもあまり良い使用例が出てこないのが難点です。
先述した CTA のデータ収集用のプログラムでは、以下のような Logger という class を作って使用しています。gLogger というグローバルな子を作ってやっておいて、全てのエラーはあらゆる場所から gLogger.Error なり gLogger.Info なりを呼び出して出力します。これをテキストファイルに保存したいときは、どこか別の場所で Logger のインスタンスを作ってやり、それの出力レベルさえ決めてやれば後は自動で保存してくれます。
で、↓こんな感じでコンパイルして実行すると、標準エラーには Warning 以上の出力が、debug.log にはデバッグレベルの出力まで全て出ます。
他にも Boost.Log には色々な機能があるのですが、ひとまずこれで要求は満たしているのでいいや、と。動く (はず) のサンプルは以下に。