C++
spdlog

C++高速LoggerなSpdlogを使ってみる

More than 1 year has passed since last update.


spdlogとは


  • C++のLoggerLibraryで結構早いらしい。

threads
boost log 1.54
glog
easylogging
spdlog

1
4.169s
1.066s
0.975s
0.302s

10
6.180s
3.032s
2.857s
0.968s

100
5.981s
1.139s
4.512s
0.497s

基本の使い方は公式のGithubにきさいされてる

https://github.com/gabime/spdlog


使ってみる


  • 今回使用するときちょっと悩んだんで公式にきれいに例がなかった使い方

  • 考えればわかる程度のことなのでメモです


  • ファイル出力形式のLogで毎日Rotateしてくれるようにする。



コード


header

//class作る

//includeはspdlog関係のみ記載

#include <spdlog/spdlog.h>
#include <spdlog/sinks/file_sinks.h>

using namespace std;

class logger
{
public:
logger();
~logger();
void init(char* sink, char* filePath);
void addCategory(char* category);
void infoLog(char* category, char* log);
//..errorなども適当に追加
private:
shared_ptr<spdlog::sinks::daily_file_sink_mt> m_pLogger;
map<string,spdlog::sink_ptr> m_pLogMap;


cpp

  //略

void logger::init(char* sink, char* filePath){
//毎日0:00にLogをローテートする
auto Logger = make_shared<spdlog::sinks::daily_file_sink_mt>(filePath, 0,0);
m_pLogMap.emplace(sink,Logger);
}

void logger::addCategory(char* sink){
auto itr = m_pLogMap.find(sink);
if(itr == m_pLogMap.end()){return:}

auto newCategory = make_shared<spdlog::logger>(sink,itr->second);
spdlog::register_logger(newCategory);
}

void logger::infoLog(char* category, char* log){
spdlog::get(category)->info(log);
spdlog::get(category)->flush();
}

的な感じでやってみました。

大枠のLoggerを作成しそこに各種カテゴリごとのLogを生成していきます。それを管理しやすいようにMapでまとめてしまってかぶりがないように検索をしています。

またregister_loggerでspdlog側で管理させるとget()でカテゴリ手に入るのでinfo()で書き込みます。

デフォルトのフォーマットだと

[2017-06-09 11:11:11.342] [sink] [info] 〜logの内容〜

のようになります。

もしフォーマットを変えたい場合は今回のところでいうとaddCategoryの中で

newCategory->set_pattern(" ",spdlog::pattern_time_type::local);

を使うとフォーマットを変えられます。””の中にwiki記載の指定子を書き加えればおkです。また基準時間を変えたい場合はlocalかutcで2種類で変更できるみたいです。

ただ僕が使いたい方法で使おうと思ったら時間表示あたりは不便(見つけられてないだけかも)だったので指定子を%vにしてしまって時間表記も自分で書き加えたりしました。そのあたりは改変するか機能探すかなどしてみてください。

ちなみにやりたかったことは連携させていたアプリがアプリがTimeZone設定を持っていてその値を持ってきてUTCに足しこんでアプリ内の時間を表示させたかった。けど指定がLocalかUTCしかなく、さらにその時間にタイムゾーンをたせる関数が見つけられなかったため断念しました。

見つけたら教えていただけると助かるです

ローテートの時間はLocalTimeなのでローテートの時間も僕のようなやり方をしたい場合はLocalのTimeZoneを取得してApp内のTimeZoneを差し引いてその時間で指定してあげるといいと思います。

以上です。