ロガーしたい(loguru::loguru
)
1#include <loguru::loguru>
2
3int main(int argc, char** argv)
4{
5 // ロガーの初期化
6 loguru::init(argc, argv);
7
8 // ファイルの設定
9 loguru::add_file("everything.log", loguru::Append, loguru::Verbosity_MAX);
10
11 // ログ表示
12 LOG_F(ERROR, "Error")
13 LOG_F(WARNING, "Error | Warning")
14 LOG_F(INFO, "Error | Warning | Info")
15 VLOG_F(0, "INFOと同じ")
16 VLOG_F(1, "ERROR | WARNING | INFO | 1")
17 ...
18 VLOG_F(9, "MAX = すべて")
19}
シミュレーションの進行状況は、ログファイルに出力して確認できるようにしておくとよいです。
ここではloguru
でログを設定/出力する方法を紹介します。
ヒント
なんでもかんでもG4cout
やG4cerr
で標準出力に表示していたら、100イベントを実行するのももっさりしていました。
ファイル出力に切り替えたら、一瞬で終わるようになりました。
ログ設定は、できるだけ早めに導入することをオススメします。
ログ出力したい(LOG_F
/ VLOG_F
)
1LOG_F(ログレベル, "表示内容");
2LOG_F(INFO, "RunID= %d", aRun->GetRunID());
3LOG_F(INFO, "EventID= %d", aEvent->GetEventID());
4LOG_F(INFO, "TrackID= %d", aTrack->GetTrackID());
5LOG_F(INFO, "StepID= %d", aTrack->GetCurrentStepNumber());
6VLOG_F(1, "ParentID= %d", aTrack->GetParentID());
7VLOG_F(2, "PVName= %s", aTouchable->GetVolume()->GetName().c_str());
LOG_F
形の関数では文字列、
VLOG_F
形の関数では数値で、表示するときのログレベルをします。
表示内容はprintf
形式で指定きます。
G4String
は.c_str()
で文字列への変換が必要です。
ログレベル
1FATAL
2ERROR // -2
3WARNING // -1
4INFO // 0
51 - 9
loguru
のログレベルは(FATALを除いて)-2 - 9
段階まで用意されています。
表示レベル(loguru::g_stderr_verbosity
)
1loguru::g_stderr_verbosity = 表示レベル
2loguru::g_stderr_verbosity = loguru::Verbosity_WARNING; // WARNING(=-1)以下を表示
3loguru::g_stderr_verbosity = loguru::Verbosity_INFO; // INFO(=0)以下を表示
4loguru::g_stderr_verbosity = loguru::Verbosity_1; // 1以下を表示
5loguru::g_stderr_verbosity = loguru::Verbosity_2; // 2以下を表示
6loguru::g_stderr_verbosity = loguru::Verbosity_MAX; // MAX(=9)以下を表示
loguru::g_stderr_verbosity
で表示レベルを変更できます。
設定した表示レベル以下のログレベルに設定したログ表示されます。
ファイルにログしたい(add_file
)
1loguru::add_file("ファイル名", モード, 表示レベル);
2
3// ファイル名: everything.log
4// モード: 追記
5// 表示レベル: INFO以下(=INFO / WARNING / ERROR)
6loguru::add_file("everything.log", loguru::Append, loguru::Verbosity_INFO);
7
8// ファイル名: latest.log
9// モード: 上書き
10// 表示レベル: MAX以下(=すべて)
11loguru::add_file("latest.log", loguru::Truncate, loguru::Verbosity_MAX);
loguru::add_file
でログをファイルに出力できます。
ファイルへの書き込みモードや、
書き込むログの表示レベルを設定できます。
syslogしたい(add_syslog
)
1loguru::add_syslog("ファイル名", 表示レベル);
CMakeLists.txtの編集
# FetchContentモジュールを読み込む
include(FetchContent)
# Loguruを取得
FetchContent_Declare(
LoguruGitRepo
GIT_REPOSITORY "https://github.com/emilk/loguru"
GIT_TAG "master"
)
set(LOGURU_WITH_STREAMS TRUE)
FetchContent_MakeAvailable(LoguruGitRepo)
# Loguruをリンク
target_link_libraries(実行ファイル名 ${Geant4_LIBRARIES} loguru::loguru)
loguruのCMake Exampleを参考にCMakeLists.txtを編集します。 いくつかの方法がありますが、FetchContentモジュールを使うのが簡単だと思いました。
ソースコードの編集
1// //////////////////////////////////////////////////
2// メインのファイル.cc
3// //////////////////////////////////////////////////
4#include <loguru::loguru>
5
6int main(int argc, char **argv)
7{
8 // main関数(メインファイル)の先頭で初期化する
9 // 一度だけでよい(はず)
10 loguru::init(argc, argv);
11
12 // ファイルにすべてログする
13 loguru::add_file("everything.log", loguru::Truncate, loguru::Verbosity_MAX);
14
15 LOG_F(INFO, "Setup loguru");
16}
1// //////////////////////////////////////////////////
2// 他のファイル.cc
3// //////////////////////////////////////////////////
4#include <loguru::loguru>
5
6コンストラクター
7{
8 // 必要なところでロガーを使うだけ
9 LOG_F(INFO, "コンストラクター")
10}
#include <loguru::loguru>
でロガーが利用できるようになります。
メインのファイルの先頭で
ロガーを初期化(loguru::init
)したり、
ログファイルの設定(loguru::add_file
)したりします。
他のファイルでは初期化せずともログ出力できるようになります。