ロガーしたい(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でログを設定/出力する方法を紹介します。

ヒント

なんでもかんでもG4coutG4cerrで標準出力に表示していたら、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)したりします。

他のファイルでは初期化せずともログ出力できるようになります。

リファレンス