OpenCVのLogger

OpenCVに、なんとログ出力用のクラスがあります。しかもflannの中にです。伏兵過ぎますね。

ごく簡素な実装なのですが、紹介します。

定義

わかる方はこれをご覧になって下されば、以下読まなくて良いです。flannの中にいてもflann臭さは全く無く、ヘッダのみで実装が完結しています。

opencv/logger.h at master · Itseez/opencv · GitHub

OpenCV 2.4.10, 3.0, 3.1で存在を確認しました。ここ最近のバージョンならばどれでも大丈夫そうです。

使い方

include

明示的に指定が必要です。

#include <opencv2/flann/logger.h>

using namespace cvflann; // 以降のコードはこれ前提

準備

cvflann::Loggerというクラスが担当します。プログラムのどこからでも呼べるようにするためか、操作はすべてstatic関数です。

setDestination でログファイルの出力先を指定します。未指定またはNULLを指定するとstdout(標準出力)になります。

setLevel でログに書きだすレベルの下限を指定します。

Logger::setDestination(R"(C:\temp\log.txt)");
Logger::setLevel(FLANN_LOG_ERROR);

ログレベルについて

cvflann名前空間に以下のようなenumが定義されており、このいずれかの値を指定します。

enum flann_log_level_t
{
    FLANN_LOG_NONE = 0,
    FLANN_LOG_FATAL = 1,
    FLANN_LOG_ERROR = 2,
    FLANN_LOG_WARN = 3,
    FLANN_LOG_INFO = 4
};

このあとで示すログ書き出しの際に、setLevelで指定した値以下の(より重大な)レベルならば書き出され、大きな値(より軽度な)レベルならば何もしません。

Logger::setLevel(FLANN_LOG_ERROR);

// errorよりfatalは重大なので、書き出される
Logger::log(FLANN_LOG_FATAL, "やばいエラー"); 

// infoはerrorより軽度なので、何もしない
Logger::log(FLANN_LOG_INFO, "いちおうメモ"); 

setLevelでFLANN_LOG_NONEを指定した場合は、どのレベルでも何も出力されません。(書き出し時にNONEを指定するような禁じ手を打たない限り)

ログ書き出し

log関数で、レベルと文字列を指定して書きだします。引数はprintf同様のフォーマットが使えるようです。

Logger::log(FLANN_LOG_ERROR, "引数'%d'がマイナス", intValue);

Logger::log(FLANN_LOG_INFO, "hogeStringの結果: '%s'", hogeString);

ログレベル指定を省略できる関数 fatal error warn info もあります。以下は、上と同じ意味です。

Logger::error("引数'%d'がマイナス", intValue);

Logger::info("hogeStringの結果: '%s'", hogeString);

注意点

  • プログラムを再度実行すると、setDestinationの指定を変えていない限り、前のログは消えます。

もっとすごいloggerは巷に溢れていますが、すごいのは往々にして導入が面倒なので、さくっと使いたいときには良いのではないでしょうか。 かつ、ヘッダで実装が完結しているので、自分で拡張してみるのも簡単です。