﷽
→ 最新リリース
→ 変更履歴
→ サンプル
概要 なぜさらに別のライブラリを使用するのか 特徴の概要 はじめる ダウンロード クイックスタート インストール (オプション) アプリケーション引数の設定 構成 レベル 設定する 設定ファイルの使用 el::Configurations クラスの使用 インライン構成の使用 デフォルトの構成 グローバル構成 ロギング形式指定子 日付/時刻形式指定子 カスタム形式指定子 ロギングフラグ アプリケーションの引数 設定マクロ 構成の読み取り ロギング 基本 条件付きロギング 時折のログ記録 printf のようなロギング ネットワークロギング 詳細なログ記録 基本 条件付きおよび時折 詳細レベル 詳細ログがオンになっているかどうかを確認する Vモジュール 新しいロガーの登録 ロガーの登録を解除する 既存のロガー ID の入力 ロギングリポジトリの共有 追加機能 パフォーマンスの追跡 条件付きパフォーマンス追跡 パフォーマンス追跡データを活用する ログファイルのローテーション クラッシュハンドリング カスタム クラッシュ ハンドラーのインストール スタックトレース マルチスレッド マクロのチェック ロギングエラー() Syslogの使用 STL ロギング サポートされているテンプレート Qt のロギング ブーストロギング wxウィジェットのロギング ライブラリの拡張 独自のクラスのログを記録する ロギングサードパーティクラス 手動によるログ ファイルのフラッシュとローリング ログディスパッチコールバック ロガー登録コールバック 非同期ロギング ヘルパークラス 貢献 パッチの送信 バグの報告 互換性 マトリックスの構築 ライセンス 免責事項
Easylogging++ は、C++ アプリケーション用の単一ヘッダーの効率的なロギング ライブラリです。これは非常に強力で、拡張性が高く、ユーザーの要件に合わせて構成できます。これは、独自のシンクを作成する機能を提供します ( LogDispatchCallback
と呼ばれる機能を介して)。このライブラリは現在、github およびその他のオープンソース ソース管理管理サイト上の何百ものオープンソース プロジェクトで使用されています。
このマニュアルは Easylogging++ v9.97.1 用です。他のバージョンについては、github 上の対応するリリースを参照してください。
Residue ロギング サーバーにも興味があるかもしれません。
トップに戻る
C++ で小規模なユーティリティまたは大規模なプロジェクトに取り組んでいる場合、このライブラリは便利です。単一のヘッダーに基づいており、単一のソース ファイルにリンクするだけで済みます。 (元々はヘッダーのみでしたが、問題 #445 でソース ファイルを使用するように変更されました。v9.89 では引き続きヘッダーのみを使用できます)。
このライブラリは、さまざまな考慮事項 (移植性、パフォーマンス、使いやすさ、機能、セットアップの容易さなど) を念頭に置いて設計されています。
なぜさらに別のライブラリがあるのでしょうか?そうですね、答えは非常に簡単です。書いたとおりに使用して、問題があれば(あれば)修正したり、github で問題を報告したりできます。それに加えて、私は個人的に、外出先で設定でき、ニーズに合わせて拡張でき、高速なパフォーマンスが得られるような設計の単一ヘッダーに基づくロギング ライブラリを見たことがありません。 C++ 用の他の単一ヘッダー ロギング ライブラリを見てきましたが、スレッド、正規表現、日付などの特定の機能をサポートするために外部ライブラリ (例: boost または Qt) を使用しています。このライブラリには、外部ライブラリの使用を防ぐためのすべてが組み込まれています。これらのライブラリが嫌いなわけではなく、実際には大好きですが、すべてのプロジェクトがこれらのライブラリを使用するわけではないため、それらに依存するリスクを冒すことはできませんでした。
トップに戻る
Easylogging++ は機能が豊富で、一般的な開発者と上級開発者の両方がソフトウェアを作成する際に必要とする多くの機能が含まれています。
トップに戻る
最新リリースから最新バージョンをダウンロード
他のリリースについては、リリース ページをご覧ください。アプリケーションが C++11 をサポートしていない場合は、v8.91 の使用を検討してください。これは C++98 および C++03 の安定バージョンですが、いくつかの機能が欠けています。
トップに戻る
Easylogging++ の使用を開始するには、次の 3 つの簡単な手順に従うことができます。
easylogging++.h
およびeasylogging++.cc
)# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, char * argv[]) {
LOG (INFO) << " My first info log using default logger " ;
return 0 ;
}
次を使用してコンパイルします
g++ main.cc easylogging++.cc -o prog -std=c++11
それは簡単です! INITIALIZE_EASYLOGGINGPP
は 1 回だけ使用する必要があり、そうしないとコンパイル エラーが発生することに注意してください。これは、いくつかのextern
変数の定義です。これは、アプリケーションごとに 1 回だけ定義できることを意味します。この初期化ステートメントを配置する最適な場所は、 int main(int, char**)
関数が定義されているファイル内の、最後の include ステートメントの直後です。
このヘッダーをシステム全体にインストールしたい場合は、次のように実行できます。
mkdir build
cd build
cmake -Dtest=ON ../
make
make test
make install
次のオプションは Easylogging++ cmake でサポートされており、 -D<option>=ON
使用してこれらのオプションをオンにできます。
lib_utc_datetime
- ELPP_UTC_DATETIME
を定義しますbuild_static_lib
- Easylogging++ の静的ライブラリを構築しますそうは言っても、コンパイルするにはeasylogging++.cc
ファイルが必要になります。ヘッダーのみの場合は、v9.89 以前を確認してください。
または、vcpkg 依存関係マネージャーを使用して easyloggingpp をダウンロードしてインストールすることもできます。
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install easyloggingpp
vcpkg の easyloggingpp ポートは、Microsoft チームのメンバーとコミュニティの貢献者によって最新の状態に維持されます。バージョンが古い場合は、vcpkg リポジトリで問題を作成するか、プル リクエストを作成してください。
トップに戻る
アプリケーション引数を Easylogging++ に渡すことを常にお勧めします。 Easylogging++ の一部の機能では、アプリケーション引数を設定する必要があります。たとえば、詳細レベルまたは vmodule を設定するための詳細ログなどです (後で説明します)。これを行うには、ヘルパー マクロまたはヘルパー クラスを使用できます。
int main ( int argc, char * argv[]) {
START_EASYLOGGINGPP (argc, argv);
...
}
トップに戻る
ログ ライブラリの構成を開始するには、重大度レベルを理解する必要があります。 Easylogging++ は、何が有効で何が無効かを完全に制御するために、階層ログを意図的に使用しません。そうは言っても、 LoggingFlag::HierarchicalLogging
を使用して階層ログを使用するオプションはまだあります。 Easylogging++ には次のレベルがあります (階層レベルに応じて順序付けされています)。
レベル | 説明 |
---|---|
グローバル | すべてのレベルを表す汎用レベル。すべてのレベルのグローバル構成を設定する場合に役立ちます。 |
トレース | 特定のイベントをバックトレースするのに役立つ情報。デバッグ ログよりも役立つことがほとんどです。 |
デバッグ | 開発者がアプリケーションをデバッグするのに最も役立つ情報イベント。 NDEBUG が定義されていない場合 (VC++ 以外の場合)、または _DEBUG が定義されている場合 (VC++ の場合) にのみ適用されます。 |
致命的 | おそらくアプリケーションの中止につながる非常に重大なエラー イベント。 |
エラー | エラー情報が表示されますが、アプリケーションは引き続き実行されます。 |
警告 | アプリケーションのエラーを示す情報ですが、アプリケーションは実行を続けます。 |
情報 | 主にアプリケーションの現在の進行状況を表すのに役立ちます。 |
冗長 | 非常に役立つ情報であり、詳細ログ レベルによって異なります。詳細ログは階層ログには適用できません。 |
未知 | 階層ログにのみ適用され、ログを完全にオフにするために使用されます。 |
トップに戻る
Easylogging++ は設定が簡単です。それには 3 つの方法が考えられますが、
構成は、 Configurations
クラスによって実行時にロードされるファイルによって実行できます。このファイルの形式は次のとおりです。
* LEVEL:
CONFIGURATION NAME = "VALUE" ## Comment
ANOTHER CONFIG NAME = "VALUE"
レベル名はスター (*) で始まり、コロン (:) で終わります。ファイル内で指定されていない構成では自動的にGlobal
の構成が使用されるように、構成ファイルをGlobal
レベルで開始することを強くお勧めします。たとえば、 Filename
Global
に設定し、すべてのレベルで同じファイル名を使用する場合、レベルごとに明示的に設定しないと、ライブラリはGlobal
の構成値を自動的に使用します。次の表には、構成ファイルによってサポートされる構成が含まれています。
構成名 | タイプ | 説明 |
---|---|---|
Enabled | ブール | ロガーの対応するレベルが有効かどうかを決定します。 el::Level::Global 使用してすべてのログを無効にすることができます |
To_File | ブール | 該当するログをログファイルに書き込むかどうか |
To_Standard_Output | ブール | ターミナルやコマンドプロンプトなどの標準出力にログを書き込むかどうか |
Format | 文字* | 対応するレベルとロガーのロギングの形式/パターンを決定します。 |
Filename | 文字* | 対応するレベルとロガーのログを書き込むログ ファイル (フル パス) を決定します。 |
Subsecond_Precision | 単位 | 1 秒未満の精度 (以前は「ミリ秒幅」と呼ばれていました) を指定します。幅は範囲 (1 ~ 6) 内で指定できます。 |
Performance_Tracking | ブール | パフォーマンス追跡が有効かどうかを決定します。これはロガーやレベルには依存しません。パフォーマンス追跡では、指定されない限り常に「パフォーマンス」ロガーが使用されます。 |
Max_Log_File_Size | サイズ_t | 対応するレベルのログ ファイルのサイズが指定されたサイズ以上の場合、ログ ファイルは切り捨てられます。 |
Log_Flush_Threshold | サイズ_t | 保留中のログ データをフラッシュするまで保持するログ エントリの数を指定します |
コメント内のどこでも二重引用符を使用しないでください。予期しない動作が発生する可能性があります。
サンプル構成ファイル
* GLOBAL:
FORMAT = "%datetime %msg"
FILENAME = "/tmp/logs/my.log"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = true
SUBSECOND_PRECISION = 6
PERFORMANCE_TRACKING = true
MAX_LOG_FILE_SIZE = 2097152 ## 2MB - Comment starts with two hashes (##)
LOG_FLUSH_THRESHOLD = 100 ## Flush after every 100 logs
* DEBUG:
FORMAT = "%datetime{%d/%M} %func %msg"
上記のサンプルの構成ファイルの内容は単純です。すべてのレベルをオーバーライドするために、 GLOBAL
レベルから始めます。明示的に定義された後続のレベルは、 GLOBAL
からの構成をオーバーライドします。たとえば、 DEBUG
を除くすべてのレベルは同じ形式 (日付時刻とログ メッセージ) を持ちます。 DEBUG
レベルの場合、日付 (日と月)、ソース関数、およびログ メッセージのみが存在します。 DEBUG
の残りの構成はGLOBAL
から使用されます。また、上記のDEBUG
形式の{%d/%M}
に注意してください。日付形式を指定しない場合は、デフォルトの形式が使用されます。日付/時刻のデフォルト値は%d/%M/%Y %h:%m:%s,%g
です。これらの形式指定子の詳細については、以下の日付/時刻形式指定子のセクションを参照してください。
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
// Load configuration from file
el::Configurations conf ( " /path/to/my-conf.conf " );
// Reconfigure single logger
el::Loggers::reconfigureLogger ( " default " , conf);
// Actually reconfigure all loggers instead
el::Loggers::reconfigureAllLoggers (conf);
// Now all the loggers will use configuration from file
}
構成ファイルは、必要なときにいつでも使用できる (コンストラクターを使用して)
el::Configurations
オブジェクトに変換できます (上記の例のように)。
トップに戻る
構成を設定したり、構成をリセットしたりできます。
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
el::Configurations defaultConf;
defaultConf. setToDefault ();
// Values are always std::string
defaultConf. set (el::Level::Info,
el::ConfigurationType::Format, " %datetime %level %msg " );
// default logger uses default configurations
el::Loggers::reconfigureLogger ( " default " , defaultConf);
LOG (INFO) << " Log using default file " ;
// To set GLOBAL configurations you may use
defaultConf. setGlobally (
el::ConfigurationType::Format, " %date %msg " );
el::Loggers::reconfigureLogger ( " default " , defaultConf);
return 0 ;
}
構成は一度設定するだけで済みます。デフォルト設定で問題ない場合は、それを使用することもできます。
トップに戻る
インライン構成とは、 std::string
で構成を設定できることを意味しますが、すべての改行文字などを必ず追加してください。これは常に煩雑になるため、お勧めできません。
el::Configurations c;
c.setToDefault();
c.parseFromText( " *GLOBAL: n FORMAT = %level %msg " );
上記のコードは Configurations オブジェクトを設定するだけですが、この構成を使用してロガーを再構成する必要があります。
トップに戻る
既存および将来のロガーの構成が必要な場合は、 el::Loggers::setDefaultConfigurations(el::Configurations& configurations, bool configureExistingLoggers = false)
を使用できます。これは、かなり大規模な作業を行っている場合、またはすでに Easylogging++ を使用しているサードパーティ ライブラリを使用している場合に便利です。新しく作成されたロガーはデフォルト設定を使用します。既存のロガーも設定したい場合は、2 番目の引数をtrue
に設定できます (デフォルトはfalse
)。
トップに戻る
Level::Global
グローバル設定とは何の関係もありません。すべてまたは一部のロガーの設定を登録したり、設定ファイルを使用して新しいロガーを登録したりできるという概念です。設定ファイルの構文は次のとおりです。
-- LOGGER ID ## Case sensitive
## Everything else is same as configuration file
-- ANOTHER LOGGER ID
## Configuration for this logger
ロガー ID は 2 つのダッシュで始まります。グローバル設定ファイルを作成したら、単一の関数を使用してすべてのロガーを設定 (および新しいロガーを登録) できます。
int main ( void ) {
// Registers new and configures it or
// configures existing logger - everything in global.conf
el::Loggers::configureFromGlobal ( " global.conf " );
// .. Your prog
return 0 ;
}
構成を定義せずにグローバル構成を使用して新しいロガーを登録することはできないことに注意してください。少なくとも 1 つの構成を定義する必要があります。ロガーを登録する他の方法については、以下の「ロギング」セクションで説明します。
トップに戻る
次の指定子を使用してログの形式をカスタマイズできます。
指定子 | 置換者 |
---|---|
%logger | ロガーID |
%thread | スレッド ID - 利用可能な場合は std::thread を使用し、それ以外の場合は Windows の GetCurrentThreadId() を使用します。 |
%thread_name | Helpers::setThreadName を使用して、現在のスレッド ( setThreadName 実行する場所) の名前を設定します。スレッド名のサンプルを参照してください |
%level | 重大度レベル (情報、デバッグ、エラー、警告、致命的、詳細、トレース) |
%levshort | 重大度レベル (短いバージョン、つまり情報の場合は I、それぞれ D、E、W、F、V、T) |
%vlevel | 詳細レベル (詳細ログに適用) |
%datetime | 日付および/または時刻 - パターンはカスタマイズ可能です - 以下の日付/時刻形式指定子を参照してください。 |
%user | 現在アプリケーションを実行しているユーザー |
%host | アプリケーションが実行されているコンピュータ名 |
%file * | ソース ファイルのファイル名 (フル パス) - この機能はコンパイラの__FILE__ マクロが利用できるかどうかに依存します。 |
%fbase * | ソースファイルのファイル名(ベース名のみ) |
%line * | ソース行番号 - この機能は、コンパイルの__LINE__ マクロが利用できるかどうかに左右されます。 |
%func * | ロギング機能 |
%loc * | ロギングのソースファイル名と行番号(コロンで区切る) |
%msg | 実際のログメッセージ |
% | エスケープ文字 (例: %%level は %level と書きます) |
__LINE__
、 __FILE__
など) トップに戻る
次の指定子を使用して日付/時刻形式をカスタマイズできます
指定子 | 置換者 |
---|---|
%d | 日付 (ゼロ埋め) |
%a | 曜日 – ショート (月、火、水、木、金、土、日) |
%A | 曜日 - 長 (月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日) |
%M | 月 (ゼロ埋め) |
%b | 月 - 短い (1 月、2 月、3 月、4 月、5 月、6 月、7 月、8 月、9 月、10 月、11 月、12 月) |
%B | 月 - 長期 (1 月、2 月、3 月、4 月、5 月、6 月、7 月、8 月、9 月、10 月、11 月、12 月) |
%y | 年 - 2 桁 (13、14 など) |
%Y | 年 - 4 桁 (2013、2014 など) |
%h | 時間 (12 時間形式) |
%H | 時間 (24 時間形式) |
%m | 分 (ゼロ埋め) |
%s | 2 番目 (ゼロ埋め) |
%g | 1 秒未満の部分 (精度は ConfigurationType::SubsecondPrecision によって構成されます) |
%F | 午前/午後指定 |
% | エスケープ文字 |
日付/時刻は最大30
文字に制限されていることに注意してください。
トップに戻る
独自の形式指定子を指定することもできます。これを行うには、 el::Helpers::installCustomFormatSpecifier
使用できます。完璧な例は、TCP サーバー アプリケーションの%ip_addr
です。
const char * getIp ( const el::LogMessage*) {
return " 192.168.1.1 " ;
}
int main ( void ) {
el::Helpers::installCustomFormatSpecifier ( el::CustomFormatSpecifier ( " %ip_addr " , getIp));
el::Loggers::reconfigureAllLoggers (el::ConfigurationType::Format, " %datetime %level %ip_addr : %msg " );
LOG (INFO) << " This is request from client " ;
return 0 ;
}
トップに戻る
ロギングの一部では、ロギング フラグを設定できます。サポートされているフラグは次のとおりです。
フラグ | 説明 |
---|---|
NewLineForContainer (1) | 各コンテナー ログ エントリに新しい行があることを確認します。 |
AllowVerboseIfModuleNotSpecified (2) | -vmodule が使用され、モジュールが指定されていない場合、そのモジュールを介して詳細ログが許可されるようにします。 param が -vmodule=main*=3 で、詳細ログが something.cpp というファイルから書き込まれているとします。このフラグが有効な場合、ログは書き込まれます。それ以外の場合、ログは許可されません。注: これを使用すると、-vmodule の目的が無効になります。 |
LogDetailedCrashReason (4) | デフォルトでクラッシュを処理する場合、詳細なクラッシュ理由もログに記録されます (デフォルトでは無効) (問題 #90) |
DisableApplicationAbortOnFatalLog (8) | FATAL レベルを使用してログに記録される場合、アプリケーションの中止を無効にすることができます。アプリケーションはクラッシュ信号が処理された後に中止される必要があるため、これはデフォルトのクラッシュ ハンドラーには適用されないことに注意してください。 (デフォルトでは追加されません) (問題 #119) |
ImmediateFlush (16) | すべてのログエントリでログをフラッシュします (パフォーマンス重視) - デフォルトでは無効になっています |
StrictLogFileSizeCheck (32) | すべてのログでログ ファイルのサイズが確認されるようにする |
ColoredTerminalOutput (64) | 端末でサポートされている場合、端末出力はカラフルになります。 |
MultiLoggerSupport (128) | 複数のロガーを使用して単一のメッセージを記録するためのサポートを有効にします。 (例: CLOG(INFO, "default", "network") << This will be logged using default and network loggers; ) |
DisablePerformanceTrackingCheckpointComparison (256) | チェックポイント比較を無効にします |
DisableVModules (512) | vmodule の使用を無効にします |
DisableVModulesExtensions (1024) | vmodules 拡張機能を無効にします。つまり、vmodule -vmodule=main*=4 がある場合は、main で始まるすべてのファイルがカバーされますが、これが定義されていない場合と同様、main で始まり次の拡張子のいずれかで終わるすべてのファイルがカバーされます。 .h .c .cpp .cc .cxx .-inl-.h .hxx .hpp。次の vmodule が正しくないことに注意してください -vmodule=main.=4 で、このマクロは定義されていません。これは、main..c をチェックするためです。二重点に注意してください。これを有効にしたい場合は、上記のログ フラグを確認してください:AllowVerboseIfModuleNotSpecified '?'および '' ワイルドカードがサポートされています |
HierarchicalLogging (2048) | 階層ログを有効にします。これは詳細ログには適用されません。 |
CreateLoggerAutomatically (4096) | ロガーが使用できない場合は自動的にロガーを作成します。 |
AutoSpacing (8192) | スペースを自動的に追加します。例: LOG(INFO) << "DODGE" << "THIS!"; 「これを避けてください!」と出力されます。 |
FixedTimeFormat (16384) | パフォーマンスの追跡にのみ適用されます。これにより、フォーマットにかかる時間が防止されます。たとえば、 1001 ms 1.01 sec としてフォーマットされるのではなく、そのまま記録されます。 |
IgnoreSigInt (32768) | アプリケーションがクラッシュした場合、割り込み信号を無視します |
これらのフラグは、静的なel::Loggers::addFlag
およびel::Loggers::removeFlag
を使用して設定/設定解除できます。 el::Loggers::hasFlag
を使用すると、特定のフラグが利用可能かどうかを確認できます。これらの関数はすべて、厳密に型指定された列挙型el::LoggingFlag
を受け取ります。
これらのフラグは、
--logging-flags
コマンド ライン引数を使用して設定できます。マクロELPP_LOGGING_FLAGS_FROM_ARG
を定義して、この機能を有効にする必要があります (引数を構成するには、必ずSTART_EASYLOGGINGPP(argc, argv)
を使用する必要があります)。
ELPP_DEFAULT_LOGGING_FLAGS
を使用してデフォルト (初期) フラグを設定し、初期フラグに数値を設定することもできます。
トップに戻る
次の表では、特定の動作を定義するために使用できるすべてのコマンド ライン引数について説明します。 main(int, char**)
関数でSTART_EASYLOGGINGPP(argc, argv)
を使用して、アプリケーション引数を初期化する必要があります。
口論 | 説明 |
---|---|
-v | 最大限の冗長性を有効にします |
--v=2 | 冗長レベル 2 までの冗長性を有効にします (有効範囲: 0 ~ 9) |
--verbose | 最大限の冗長性を有効にします |
-vmodule=MODULE_NAME | メインからレベル 1 までのファイルの冗長性をアクティブにします。残りのファイルはログ フラグに依存します。AllowVerboseIfModuleNotSpecified 上記のログ フラグのセクションをAllowVerboseIfModuleNotSpecified してください。 2 つのモジュールはカンマで区切ることができます。詳細ログのチェック引数の優先順位は vmodule が最後であることに注意してください。たとえば、vmodule の前にアプリケーション引数に -v がある場合、vmodule は無視されます。 |
--logging-flags=3 | ロギングフラグを設定します。例ie, 3 では、ログ フラグをNewLineForContainer およびAllowVerboseIfModuleNotSpecified に設定します。詳細と値については、上記のログ フラグのセクションを参照してください。この機能を無効にするには、マクロのセクションを参照してください。 |
--default-log-file=FILE | 既存および将来のロガーのデフォルトのログ ファイルを設定します。前処理中にデフォルトの空のログ ファイルが作成されないように、 ELPP_NO_DEFAULT_LOG_FILE を定義することを検討することをお勧めします。この機能を無効にするには、マクロのセクションを参照してください。 |
トップに戻る
一部のロギング オプションはマクロで設定できます。これは熟慮された決定です。たとえば、 ELPP_THREAD_SAFE
を定義している場合、すべてのスレッド セーフ機能が有効になり、それ以外の場合は無効になります (スレッド セーフのオーバーヘッドがそれに伴うことを確認します)。覚えやすくし、競合の可能性を防ぐために、すべてのマクロはELPP_
で始まります。
注:すべてのマクロは、次のいずれかの方法で定義できます。
コンパイラの-D
オプションを使用してマクロを定義します。たとえば、 g++
の場合は、 g++ source.cpp ... -DELPP_SYSLOG -DELPP_THREAD_SAFE ...
(推奨方法)
"easylogging++.h"
内でマクロを定義します(他のファイルでのマクロの定義は機能しません)
マクロ名 | 説明 |
---|---|
ELPP_DEBUG_ASSERT_FAILURE | 最初のアサーションが失敗するとアプリケーションを中止します。このアサーションは、無効な入力 (無効な構成ファイルなど) が原因です。 |
ELPP_UNICODE | ログ記録時に Unicode サポートを有効にします。 START_EASYLOGGINGPP が必要です |
ELPP_THREAD_SAFE | スレッドセーフを有効にします。Linux では -lpthread リンクを確認してください。 |
ELPP_FORCE_USE_STD_THREAD | スレッド化に C++ 標準ライブラリの使用を強制します ( ELPP_THREAD_SAFE 使用する場合にのみ役立ちます) |
ELPP_FEATURE_CRASH_LOG | GCC にのみ適用されます。アプリケーションのクラッシュ時にスタックトレースを有効にします |
ELPP_DISABLE_DEFAULT_CRASH_HANDLING | デフォルトのクラッシュ処理を無効にします。 el::Helpers::setCrashHandler を使用して独自のハンドラーを使用できます。 |
ELPP_DISABLE_LOGS | すべてのログを無効にする - (前処理) |
ELPP_DISABLE_DEBUG_LOGS | デバッグログを無効にする - (前処理) |
ELPP_DISABLE_INFO_LOGS | 情報ログを無効にする - (前処理) |
ELPP_DISABLE_WARNING_LOGS | 警告ログを無効にする - (前処理) |
ELPP_DISABLE_ERROR_LOGS | エラーログを無効にする - (前処理) |
ELPP_DISABLE_FATAL_LOGS | 致命的なログを無効にする - (前処理) |
ELPP_DISABLE_VERBOSE_LOGS | 詳細ログを無効にする - (前処理) |
ELPP_DISABLE_TRACE_LOGS | トレース ログを無効にする - (前処理) |
ELPP_FORCE_ENV_VAR_FROM_BASH | 環境変数が見つからない場合は、代替 bash コマンドを強制的に使用して値を検索します (たとえば、ユーザー名にはwhoami 使用します)。 (すでに Easylogging++ を使用しているライブラリでは、このマクロをLD_PRELOAD とともに使用しないでください。そうしないと、プロセス ( popen ) のスタック オーバーフローが発生します (詳細については、問題 #87 を参照してください)) |
ELPP_DEFAULT_LOG_FILE | 初期ファイルを作成する完全なファイル名。このマクロの値は引用符で囲む必要があります。例: -DELPP_DEFAULT_LOG_FILE='"logs/el.gtest.log"' 二重引用符が一重引用符の中にあることに注意してください。二重引用符はconst char* の値であり、一重引用符は const char* の値を指定します。マクロ |
ELPP_NO_LOG_TO_FILE | 最初はファイルへのログ記録を無効にする |
ELPP_NO_DEFAULT_LOG_FILE | デフォルトのログ ファイルでライブラリを初期化したくない場合は、このマクロを定義します。これにより、UNIX および Windows の場合は null デバイスにログが記録されます。他のプラットフォームではエラーが発生する可能性があるため、 ELPP_DEFAULT_LOG_FILE 使用する必要があります。 (他のプラットフォームのヌルデバイスの PR は大歓迎です) |
ELPP_FRESH_LOG_FILE | ログ ファイルが作成されるたびにログ ファイルを追加しません (一部のユーザーに予期しない結果が生じる可能性があるため、注意して使用してください) |
ELPP_DEBUG_ERRORS | Easylogging++ によって発生した、構成などの原因による内部エラーを見つけたい場合は、このマクロを定義することでそれらを有効にすることができます。標準出力、つまりターミナルまたはコマンド プロンプトにエラーが表示されます。 |
ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS | カスタム書式指定子を強制的に無効にします |
ELPP_DISABLE_LOGGING_FLAGS_FROM_ARG | コマンドライン引数を使用してログフラグを設定する機能を強制的に無効にします |
ELPP_DISABLE_LOG_FILE_FROM_ARG | コマンドライン引数からデフォルトのログファイルを設定する機能を強制的に無効にします |
ELPP_WINSOCK2 | Windows システムでは、 WIN32_LEAN_AND_MEAN が定義されている場合、 winsock.h の代わりにwinsock2.h 強制的に使用します。 |
ELPP_CUSTOM_COUT (上級) | #define ELPP_CUSTOM_COUT qDebug() または#define ELPP_CUSTOM_COUT std::cerr などの値に解決されます。これにより、( std::cout 使用する代わりに) 標準出力の値が使用されます。 |
ELPP_CUSTOM_COUT_LINE (上級) | ELPP_CUSTOM_COUT とともに使用して、カスタム cout でログ行を書き込む方法を定義します。例: #define ELPP_CUSTOM_COUT_LINE(msg) QString::fromStdString(msg).trimmed() |
ELPP_NO_CHECK_MACROS | CHECKマクロを定義しないでください |
ELPP_NO_DEBUG_MACROS | DEBUGマクロを定義しないでください |
ELPP_UTC_DATETIME | ローカル時間の代わりに UTC 時間を使用します (基本的に、 localtime および family 関数の代わりにgmtime 使用します)。 |
ELPP_NO_GLOBAL_LOCK | ディスパッチ時にストレージ全体をロックしないでください。これは注意して使用する必要があります。問題 #580 を参照 |
トップに戻る
特定のロガーの構成を読み取りたい場合は、Logger クラスのtypedConfigurations()
関数を使用してそれを行うことができます。
el::Logger* l = el::Loggers::getLogger( " default " );
bool enabled = l-> typedConfigurations ()->enabled(el::Level::Info);
// Or to read log format/pattern
std::string format =
l-> typedConfigurations ()->logFormat(el::Level::Info).format();
トップに戻る
easylogging++ へのログインは、マクロのコレクションを使用して行われます。これは、ユーザーにとってわかりやすくするため、また、物事がどのように行われるかに関する不必要な詳細をユーザーが知ることを防ぐためです。
ログを書き込むために使用できる 2 つの基本マクロが提供されています。
LOG(LEVEL)
CLOG(LEVEL, logger ID)
LOG
「デフォルト」ロガーが使用されますが、CLOG (カスタム LOG) ではロガー ID を指定します。レベルについては、上記の「構成 - レベル」セクションを参照してください。必要に応じて、ロガーごとに構成が異なる場合があります。カスタム ロガーにアクセスするためのカスタム マクロを作成することもできます。以下のセクションで説明する詳細ログ用のさまざまなマクロもあります。以下は、easylogging++ を初期化した後にこれらのマクロを使用する非常に簡単な例です。
LOG (INFO) << "This is info log";
CLOG (ERROR, " performance " ) << "This is info log using performance logger";
同じマクロ、つまりLOG
(および関連するマクロ) を使用する別の方法もあります。これは、すでに登録されているロガー ID を使用してマクロELPP_DEFAULT_LOGGER
およびELPP_DEFAULT_PERFORMANCE_LOGGER
を定義することで、 LOG
マクロを使用するときに、 default
ロガーの代わりに指定されたロガーが自動的に使用されるようになります。これはヘッダー ファイルではなくソース ファイルで定義する必要があることに注意してください。これは、ヘッダーをインクルードするときに誤って無効なロガーを使用しないようにするためです。
簡単な例はここにあります
# ifndef ELPP_DEFAULT_LOGGER
# define ELPP_DEFAULT_LOGGER " update_manager "
# endif
# ifndef ELPP_DEFAULT_PERFORMANCE_LOGGER
# define ELPP_DEFAULT_PERFORMANCE_LOGGER ELPP_DEFAULT_LOGGER
# endif
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) provided logger is already registered - i.e, update_manager
LOG (INFO) << " This will log using update_manager logger as well " ;
}
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) using default logger because no `ELPP_DEFAULT_LOGGER` is defined unless you have it in makefile
}
Logger
クラスを直接使用してログを書き込むこともできます。この機能は、可変個引数テンプレートをサポートするコンパイラで利用できます。さらに詳しく調べるには、samples/STL/logger-log-functions.cpp
を参照してください。
トップに戻る
Easylogging++ はロギングの特定の側面を提供します。これらの側面の 1 つは条件付きロギングです。つまり、特定の条件が満たされた場合にのみログが書き込まれます。これは状況によっては非常に便利です。ヘルパー マクロは _IF で終わります。
LOG_IF(condition, LEVEL)
CLOG_IF(condition, LEVEL, logger ID)
LOG_IF (condition, INFO) << "Logged if condition is true";
LOG_IF ( false , WARNING) << "Never logged";
CLOG_IF ( true , INFO, " performance " ) << "Always logged (performance logger)"
VLOG_IF
とCVLOG_IF
など、先頭にV
が付く同じマクロを詳細ログに使用できます。詳細については、以下の詳細ログのセクションを参照してください。ニーズに応じて、必要なだけ複雑な条件を設定できます。
トップに戻る
Easylogging++ を使用したロギングのもう 1 つの便利な側面は、時折のロギングです。これは、特定の回数、または特定の時間の一部にヒットした場合、たとえば 10 ヒットごと、100 ヒットごと、または 2 ヒットごとにログが書き込まれることを意味します。ヘルパー マクロは_EVERY_N
で終わります。
LOG_EVERY_N(n, LEVEL)
CLOG_EVERY_N(n, LEVEL, logger ID)
ヒット数に基づいてログを記録する方法は他にもいくつかあります。これらの便利なマクロは、
LOG_AFTER_N(n, LEVEL)
;ヒット数がn
に達した場合のみログを記録しますLOG_N_TIMES(n, LEVEL)
; n 回ログを記録する for ( int i = 1 ; i <= 10 ; ++i) {
LOG_EVERY_N ( 2 , INFO) << " Logged every second iter " ;
}
// 5 logs written; 2, 4, 6, 7, 10
for ( int i = 1 ; i <= 10 ; ++i) {
LOG_AFTER_N ( 2 , INFO) << " Log after 2 hits; " << i;
}
// 8 logs written; 3, 4, 5, 6, 7, 8, 9, 10
for ( int i = 1 ; i <= 100 ; ++i) {
LOG_N_TIMES ( 3 , INFO) << " Log only 3 times; " << i;
}
// 3 logs writter; 1, 2, 3
同じバージョンのマクロが
DEBUG
専用モードで使用できます。これらのマクロはD
(デバッグ用) で始まり、その後に同じ名前が続きます。たとえば、DLOG
デバッグ モード (つまり、_DEBUG
が定義されている場合、またはNDEBUG
が未定義の場合) でのみログを記録します。
トップに戻る
printf
のようなロギングC++11 の可変長引数テンプレートをサポートするコンパイラの場合、「printf」のようなログを記録する機能が利用可能です。これはLogger
クラスを使用して行われます。この機能はスレッドおよびタイプセーフです ( LOG(INFO)
などのマクロは使用しないため)。
これは次の 2 つの手順で行われます。
el::Loggers::getLogger(<logger_id>);
を使用して登録されたロガーを取得します。printf
との唯一の違いは、これらの関数を使用したロギングには各引数に%v
必要であることです (これはタイプ セーフのためです)。カスタム形式指定子の代わりに。 %%v
でこれをエスケープできます
以下に、さまざまな関数シグネチャを示します。
info(const char*, const T&, const Args&...)
warn(const char*, const T&, const Args&...)
error(const char*, const T&, const Args&...)
debug(const char*, const T&, const Args&...)
fatal(const char*, const T&, const Args&...)
trace(const char*, const T&, const Args&...)
verbose(int vlevel, const char*, const T&, const Args&...)
// Use default logger
el::Logger* defaultLogger = el::Loggers::getLogger( " default " );
// STL logging (`ELPP_STL_LOGGING` should be defined)
std::vector< int > i;
i.push_back( 1 );
defaultLogger-> warn ( " My first ultimate log message %v %v %v " , 123 , 222 , i);
// Escaping
defaultLogger-> info ( " My first ultimate log message %% %%v %v %v " , 123 , 222 );
%file
、%func
%line
、および%loc
形式指定子は、ロギングのようなprintf
では機能しません。
トップに戻る
メッセージをネットワークに送信できます。ただし、ログ ディスパッチャ API を使用して独自の方法を実装する必要があります。この目的のために、完全に動作するサンプルを作成しました。ネットワークに送信するサンプルを参照してください。
トップに戻る
詳細ログは、通常よりも多くの情報を記録するために、どのソフトウェアでも役立ちます。トラブルシューティングに非常に役立ちます。以下は、詳細ログ固有のマクロです。
VLOG(verbose-level)
CVLOG(verbose-level, logger ID)
トップに戻る
詳細ログには、条件付きおよび随時ログの側面もあります。
VLOG_IF(condition, verbose-level)
CVLOG_IF(condition, verbose-level, loggerID)
VLOG_EVERY_N(n, verbose-level)
CVLOG_EVERY_N(n, verbose-level, loggerID)
VLOG_AFTER_N(n, verbose-level)
CVLOG_AFTER_N(n, verbose-level, loggerID)
VLOG_N_TIMES(n, verbose-level)
CVLOG_N_TIMES(n, verbose-level, loggerID)
トップに戻る
詳細レベルは、1 ~ 9 の範囲の詳細レベルです。 Verbose レベルは、アプリケーション引数を設定しない限りアクティブになりません。詳細ログの詳細については、「アプリケーションの引数」セクションをお読みください。
詳細レベルをその場で変更するには、 Loggers::setVerboseLevel(base::type::VerboseLevel)
別名Loggers::setVerboseLevel(int)
関数を使用してください。 (現在の冗長レベルはLoggers::verboseLevel()
で確認できます。
トップに戻る
マクロVLOG_IS_ON(verbose-level)
使用すると、指定した詳細レベルのソース ファイルに対して特定のログ記録がオンになっているかどうかを確認できます。これは、if 条件に埋め込むことができるブール値を返します。
if (VLOG_IS_ON( 2 )) {
// Verbosity level 2 is on for this file
}
トップに戻る
VModule は、モジュール/ソース ファイルによって詳細度を指定できる詳細ログ (上の表で説明したとおり) のための機能です。以下にいくつかの例と説明を示します。以下の vmodule はいずれも-vmodule=
で始まり、 LoggingFlag::DisableVModulesExtensions
フラグが設定されていません。 LoggingFlag::DisableVModules
フラグを追加することで Vmodule を完全に無効にすることができます
LoggingFlag::AllowVerboseIfModuleNotSpecified
フラグを使用した例。
main=3,parser*=4
:
main{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}
parser{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}