自己紹介

太田一樹。
東京の大学の情報科学科に通う大学生。moratorium満喫中。

お勧め書籍 [全部見る]

飾り

Search


Category Archives

Recent Entries

  1. copybench
  2. Googleのロギングライブラリgoogle-glogを使ってみる
  3. 論文
  4. JJUG CCCでプレゼンします
  5. kzk's bookshelf
  6. En Google by Gulfweed
  7. PNUTS
  8. コメントスパム対策
  9. Hadoop + Luceneで分散インデクシング
  10. Hadoopの解析資料

2008年10月15日

Googleのロギングライブラリgoogle-glogを使ってみる

"google glog"で探せないgoogle-glogを軽く使ってみました。Googleからオープンソースで公開されたC++向けのロギングライブラリです。

google-gflags 1.0と、google-glog 0.1をダウンロードしてインストールします。今回はgoogle-gflagsを使用する場合についてのみ記述します。また、glogのマニュアルに一通り目を通してから読まれると良いかと思います。

まずはとにかく動かしてみます。

#include <glog/logging.h>
int
main(int argc, char **argv)
{
  google::InitGoogleLogging(argv[0]);
  google::ParseCommandLineFlags(&argc, &argv, true);
  LOG(INFO) << "INFO";
  LOG(WARNING) << "WARNING";
  LOG(ERROR) << "ERROR";
  LOG(FATAL) << "FATAL";
}

これをコンパイル & 実行。

pficore% g++ glog.cpp -lglog -lpthread -lgflags; ./a.out
E1015 131626 glog.cpp:9] ERROR
F1015 131626 glog.cpp:10] FATAL
    @     0x2abe222d5ca7  google::LogMessage::SendToLog()
    @     0x2abe222d2017  google::LogMessage::Flush()
    @     0x2abe222d2216  google::LogMessageFatal::~LogMessageFatal()
    @           0x400bb8  main
    @     0x2abe230d68e4  (unknown)
    @           0x4009c9  (unknown)

デフォルトではERROR以上のレベルが標準出力に吐かれます。また、FATALを吐くと自動的にバックトレースを出力してくれます。

次はファイルに書き出してみます。これには-log_dirオプションを指定します(オプション一覧は./a.out --helpで見ることができます)。

pficore% ./a.out -log_dir=.
E1015 131953 glog.cpp:9] ERROR
F1015 131953 glog.cpp:10] FATAL
    @     0x2b685d158ca7  google::LogMessage::SendToLog()
    @     0x2b685d155017  google::LogMessage::Flush()
    @     0x2b685d155216  google::LogMessageFatal::~LogMessageFatal()
    @           0x400bb8  main
    @     0x2b685df598e4  (unknown)
    @           0x4009c9  (unknown)
pficore% ls
a.out        a.out.INFO                                                   a.out.pficore.dyndns.org.kzk.log.FATAL.20081015-131953.7491    glog.cpp
a.out.ERROR  a.out.WARNING                                                a.out.pficore.dyndns.org.kzk.log.INFO.20081015-131953.7491
a.out.FATAL  a.out.pficore.dyndns.org.kzk.log.ERROR.20081015-131953.7491  a.out.pficore.dyndns.org.kzk.log.WARNING.20081015-131953.7491

ログファイル名は、"program name"."hostname"."user name".log."severity level"."date"."time"."pid"になります。また、-log_dirオプションを指定しない場合は実は/tmpに吐かれています。また、"program name"."serverity level"という名前で最新の実行結果のログへのリンクが作成されます。

デバッグ用にstderrだけにログファイルを吐きたい場合は、-logtostderr=1というフラグをつけます。標準ではERRORレベル以上のものしか出力されないので、-stderrthreshold=0とするとINFOから出力されます (ログレベルはINFO, WARNING, ERROR, FATAL の順に 0, 1, 2, 3)。

pficore% ./a.out -logtostderr=1 -stderrthreshold=0
I1015 133604 glog.cpp:7] INFO
W1015 133604 glog.cpp:8] WARNING
E1015 133604 glog.cpp:9] ERROR
F1015 133604 glog.cpp:10] FATAL
    @     0x2ba7fa406ca7  google::LogMessage::SendToLog()
    @     0x2ba7fa403017  google::LogMessage::Flush()
    @     0x2ba7fa403216  google::LogMessageFatal::~LogMessageFatal()
    @           0x400bb8  main
    @     0x2ba7fb2078e4  (unknown)
    @           0x4009c9  (unknown)

ファイルにもstderrにも吐かせたい場合は、-alsologtostderr=1というフラグを利用します。

デバッグ時にはVLOG関数が役立ちます。

pficore% cat glog.cpp
#include <glog/logging.h>
int
main(int argc, char **argv)
{
  google::InitGoogleLogging(argv[0]);
  google::ParseCommandLineFlags(&argc, &argv, true);
  VLOG(1) << "VLOG 1";
  VLOG(2) << "VLOG 2";
}

コンパイル & 実行します。

pficore% g++ glog.cpp -lglog -lpthread -lgflags;
pficore% ./a.out -v=1 -logtostderr=1 -stderrthreshold=0
I1015 134214 glog.cpp:7] VLOG 1
pficore% ./a.out -v=2 -logtostderr=1 -stderrthreshold=0
I1015 134218 glog.cpp:7] VLOG 1
I1015 134218 glog.cpp:8] VLOG 2

VLOGのレベルはINFOと同じなので、-stderrthreshold=0を指定しています。また、-v=Nと指定すると、VLOG(X) (ただし X <= N) のメッセージが表示されます。

後、まだ動かし方が分かってないのが、moduleです。ファイル名ベースでモジュールが作成されるようなのですが、以下のようにしても何も出ないので、もう少し調べる必要が有りそうです (suffixは.ccに変更)。凄く初歩的なミスをしている気がしてならない。

pficore% cat glog.cc
#include <glog/logging.h>
int
main(int argc, char **argv)
{
  google::InitGoogleLogging(argv[0]);
  google::ParseCommandLineFlags(&argc, &argv, true);
  VLOG(1) << "VLOG 1";
  VLOG(2) << "VLOG 2";
}
pficore% g++ glog.cc -lglog -lpthread -lgflags
pficore% ./a.out --vmodule=glog=2 -logtostderr=1 -stderrthreshold=0

一定レベル以上のメッセージをメールで送信する機能もあるので、これも試してみたいと思っています。ログローテート周りも調べないとな。ざっとそんな感じです。

ちょうどid:tkngさんと、ロギングライブラリ欲しいよねーと話していたところにこれがリリースされたので、正直凄くありがたいです。欲しい機能は大体あるし。

google++ shinh++ !!!

P.S
このコメントへーって思った。

    // fwrite() doesn't return an error when the disk is full, for
    // messages that are less than 4096 bytes. When the disk is full,
    // it returns the message length for messages that are less than
    // 4096 bytes. fwrite() returns 4096 for message lengths that are
    // greater than 4096, thereby indicating an error.

まあfwrite()の返り値は write(2)で泣きを見た ISer なら誰でもチェックすると思われるが (including me)、disk full時の細かい挙動までは知らなかった。


trackbacks

trackbackURL:

comments

comment form
comment form