Introduction
C++ 用のロギングライブラリといえば
- spdlog
- log4cxx
- boost log
等があるのですが、 spdlog が高速、ヘッダーオンリー、MIT ライセンスと使いやすいことこの上ないのです。
しかし、一つだけ欠点があります。
それが、「設定ファイルによる制御ができない」です。
例えば、log4cxx は log4j.xml といった設定ファイルでソースコードの変更なしにログレベルや出力先を制御できますが、 spdlog にはそのような機能はありません。
厳密には、コマンドラインの引数などを駆使すれば、制御できなくもないのですが、それはそれで面倒。
という欠点を解決したのが、
です。
toml ファイルによって、ログを制御できます。
spdlog も含めた、自動ビルドによる、spdlog_setup のサンプルコードを下記に用意しました。
https://github.com/takuya-takeuchi/Demo/tree/master/Logging/spdlog/01_configuration_by_toml
How to use
基本、上のサンプルの Build.ps1 を叩き、 Demog.exe を実行するだけなのですが、それだけではあれなので。
サンプルのソースは下記です。
1 | // Demo.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。 |
特に難しい点もありません。
設定ファイルを spdlog_setup::from_file
で読み込み、設定ファイルに記載された設定を spdlog::get
でメモリに展開するだけです。logger
変数が std::shard_ptr<spdlog::logger>
になっているくらいが、注意点です。
また、設定ファイルは下記です。
1 | # max_size supports suffix |
spdlog でお馴染みのワードが出てきますが、 sinks
に複数の sink を指定することで、ログを複数の出力際に吐き出せます。
上記は標準出力とログファイルに出力しています。
Watch out!
spdlog も spdlog_setup も割とモダンな実装なのですが、どういうわけか Visual Studio の言語設定で ISO C++ 20 標準 (/std:c++20)
を有効にして、 spdlog_setup をリンクしてビルドするとエラーになってしまいます。
ISO C++ 17 標準 (/std:c++17)
または ISO C++ 14 標準 (/std:c++14)
であれば問題ありません。
一応、issue として C++ 20 compilation problem が上がっていますが、こちらで遭遇した現象とは違う気がします。
が、放置されているところを見ると的を得ていないのかもしれません。
Source Code
https://github.com/takuya-takeuchi/Demo/tree/master/Logging/spdlog/01_configuration_by_toml