Help us understand the problem. What is going on with this article?

nanolog, C++11 で python "{}" 記法をサポートした小さいロギングライブラリ

背景

  • 主にグラフィックス系 C++11 アプリでロギングほしい
    • 演算メインのときではあまり print しないが, データロードとかセーブのときとかにログを出したい
    • デバッグ用にベクトルの値とかをプリントしたい
    • 速度はそんなに高速である必要はない. しかしコンパイルは早くしたい
    • すごい機能がいっぱい欲しいわけでなく, python の "{}" のような表記が使えれば OK

既存ライブラリ

  • spdlog https://github.com/gabime/spdlog : "{}" 記法が使える. 今まで 3, 4 年ほどメインで使っているが, テンプレートいっぱい使っているのでコンパイル遅い(実際には spdlog が利用している fmtlib が主にコンパイル遅い. non-header only にするとコンパイル早くなると記述があるが, やっぱりそれでも遅い).
    • あと, なぜか Android NDK r20+ clang で C++14 モードだとコンパイルに失敗する
  • glog : ビルドシステムとコードが古臭い. ストリーム記法しかない. 他のサードパーティライブラリが glog 使っていると, メインのアプリと干渉したり, またマクロ名が衝突したりすることがあり面倒になる

=> 本当に欲しい機能というはそんなにあるわけでないので, 自作しました.

nanolog

https://github.com/lighttransport/nanolog

#include "nanolog.hh"

// logging method
NANOLOG_TRACE("The answer is {}", 42);
NANOLOG_DEBUG("The answer is {}", 42);
NANOLOG_INFO("The answer is {}", 42);

こんな感じで使えます.

pprintpp

python の "{}" 表記を実現するのに,

Typesafe Python Style Printf Formatting for C++
https://github.com/tfc/pprintpp

をバックエンドに使っています.
(fmtlib backend もあります. コンパイルは pprintpp のほうが fmtlib に比べて 4~5 倍は早いです)

printpp も template で "{}" をパースしたりしてコンパイル型チェックしてくれます.
実装がテンプレートバリバリでよくわからない :cry: ので, みなさん是非解析してみてください.

実装的には, AUTOFORMAT マクロで, ("{}", 1) が与えたれたときに, フォーマット文字列を "%d" にコンパイル時に置き換えるというのをしています.

NANOLOG_XXX

__LINE__, __func__ あたりはマクロを使わないと実現できないので, ログ関数のエントリはマクロになっています.

nanolog の内部実装的には, printf するところだけ mutex で lock_guard 入れて multi-thread safe にしているという単純なものです.

TODO

  • const char * を print すると, 文字列ではなくアドレスが表示されるのを直す
  • 精度はあまり求めないので, 高速な unix epoch time -> 時刻文字列生成を行う(既存のライブラリで, locale を考慮するといろいろ遅くなるみたいな噂を聞いた)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした