2014年7月1日火曜日

release: wonderland.log-1.2.2

g++-4.8.2, clang++-3.3, em++-1.20.0 に対応した C++ header only なロガーライブラリー wonderland.log 1.2.2 をリリースしました。
1.1系から1.2系への主な変更点:
  • ロガー本体の log_t をシングルトン化しました。
  • すべての機能をCPPマクロで使用可能にしました。
    • `#define WRP_WONDERLAND_LOG_DISABLE`を定義するとすべてのマクロを無効にできるようにしました。
    • `LOG << "message" << 123;`など使えます。具体的には example をどうぞ。
  • CPPマクロで使用した場合には、自動的に __FILE__ , __LINE__ , __PRETTY_FUNCTION__ または __func__ をログごとに取得してメッセージとは分離してロギングするようにしました。
  • これまでロギングに伴うフック関数を1つだけ仕掛けられる設計でしたが、任意数個のフックを任意の順序で適用可能にしました。
  • フック関数では log_line_t& 型をパラメーターとして受け取り以下のメンバー変数によりログを任意に加工したりフィルターしたりできるようになりました。
    • std::chrono::steady_clock::time_point time // ログの時刻
    • log::level level // ログのレベル( none, debug, info, warn, error, fatal )
    • std::string source_file // ログを出力したソースのファイル
    • std::uint32_t // ログを出力したソースの行番号
    • std::string source_function // ログを出力したソースの関数名
    • std::string message // ログメッセージ
  • これまでロガー本体 log_t 型の内部でログデータを保持していましたが廃止しました。(任意の出力フックに対応したため本体がログをバッファリングする必要が無くなったため。)
  • 全体で使用しているstd::chronoのclockをhigh_resolution_clockからsteady_clockに変更しました。
  • exeption_if_fatal を廃止し、 if_fatal フラグに置き換えました。
    • if_fatal::none // fatal ログが検出されても何もしません。
    • if_fatal::exit // fatal ログが検出されたら std::exit( EXIT_FAILURE ) します。
    • if_fatal::quick_exit // fatal ログが検出されたら std::quick_exit( EXIT_FAILURE ) します。
    • if_fatal::exception // fatal ログが検出されたら std::runtime_error から派生した fatal_exception に fatal ログのメッセージを what に入れて throw します。
  • UNIXコマンドの`tee`風のフックを生成するヘルパーを `make_output_string_hook` へ名前を変更しました。機能は以前と同様に ostream へのログ出力フックオブジェクトを生成します。
  • template < class T > で任意の T::push( std::string ) が可能な型 T に対してのログ出力フックを生成するヘルパーバージョンの `make_output_string_hook` も用意しました。(これは std::queue への対応というよりは wonderland.data_structure ライブラリーに最近追加した time_deferred_buffer_t への対応のためです。 )
↑Chrome-35, em++-1.20.0

↑nodejs-0.10.25, em++-1.20.0

↑ clang++-3.3 ( g++-4.8.2 でも同様)

以前はよく google-glog を自分の書くコードには仕込んでしましたが、ライブラリーにまでログを仕込むと競合したり、glogのような事前コンパイルが前提であったり、それ自体にファイルシステムを含んでしまっているライブラリーではリンクの問題も起こるので使わないようになっていました。(ライブラリーには、です。)

Emscriptenに対応した、やがてはゲームエンジンを構成するライブラリー群を開発する Wonderland 計画の始動に伴い、C++ヘッダーオンリーで使い勝手の良い、またそれ自身はファイルシステムなどのIOを内包したり強く依存したりしないロガーが欲しくなりました。それで開発したのが wonderland.log です。

wonderland.log を開発した当初は、まだ最終的なアプリの開発時にのみロガーは仕込むつもりでいましたし、Webで書き込み可能なファイルシステムを簡単には扱えない点への対応は未定としていました。

しかし、どうにも Web であるとか Emscripten を通すとなるといわゆる printf (というか std::cerr )デバッグのようなロギングベースのデバッグ材料がとてもとてもとても欲しくなります。ライブラリーの開発でもなおのこと。

そこで、方針を変更し、今後は wonderland.log をシングルトン化しつつ、またどこの誰がログを記録したのか明瞭かつ自動的で省力的に記録可能なようにと改修し、Webにおけるファイルシステムについても Web Storage にログを出力する方針で関連ライブラリーの改修も進めています。

ロガーを強化、整備したことで、今後の Wonderland の開発が良く効率化できるはずです。微妙に転職が絡んで焦っていたりもしますが、趣味のゲームエンジン開発は生きている限り続きます(╹◡╹)

0 件のコメント:

コメントを投稿