C++のLogger

ヘッダ1つで使えるeasyloggingppというのを
このあいだ使ったので、自分が使いそうな機能だけ抜き出して、メモ。

ソース
#include "easylogging++.h"

#include <iostream>
#include <string>
#include <unistd.h>
#include <thread>




// 最初に初期化する
_INITIALIZE_EASYLOGGINGPP


using namespace std;

// 関数の実行時間計測
void func(){
  TIMED_FUNC(timerObj);
  this_thread::sleep_for(chrono::milliseconds(100));
  PERFORMANCE_CHECKPOINT(timerObj);
  this_thread::sleep_for(chrono::milliseconds(200));
}


int main(int argc, char *argv[]){
  // 引数の処理
  _START_EASYLOGGINGPP(argc, argv);

  // 引数は破壊されない
  for (int i = 0; i < argc; i++) {
    cout << argv[i] << endl;
  }

  // loggerの設定
  el::Loggers::configureFromGlobal("global.conf");

  // 引数に--debugが有れば、LOG(DEBUG)を有効にする
  bool debug = false;
  for (int i = 0; i < argc; i++) {
    if(string(argv[i]) == "--debug"){
      debug = true;
    }
  }
  if(debug){
    el::Configurations conf;
    conf.set(el::Level::Debug,
             el::ConfigurationType::Enabled,
             "true");
    el::Loggers::reconfigureLogger("default", conf);
  }

  // 普通のログ出力
  LOG(DEBUG) << "log to debug";
  LOG(INFO) << "log to info";

  // 10hit毎にログ出力
  for (size_t i = 0; i < 100; i++) {
    LOG_EVERY_N(10, INFO) << "i=" << i << ": log to info every 10 times";
  }

  for (size_t i = 1; i <= 9; i++) {
    // verbose levleは、コマンドから--v=xで出来る
    // 1 <= x<= 9で、xが大きい程、より煩い
    VLOG(i) << "verbose level=" << i; 
  }
  if(VLOG_IS_ON(3)){
    LOG(INFO) << "verbose level is greater than 3";
  }

  // 関数の実行時間計測
  func();
  func();

  // ブロックの実行時間計測
  for (size_t i = 0; i < 3; i++) {
    TIMED_SCOPE(timerBlkObj, "heavy-iter");
    this_thread::sleep_for(chrono::milliseconds(i*100));
  }

  return 0;
}
設定ファイル
-- default
  * DEBUG:
    ENABLED = false