glogパッケージをちょっと使ってみる #golang
つい最近アナウンスされたglogパッケージを使ってみました。glogは簡単に言うとログをとるためのパッケージです。実行時の引数でログレベルを指定したり、指定したモジュールのログだけを出力したりと、簡単に使うことができます。
glogパッケージで利用できる引数の使い方は、 google-glog ライブラリ(C++)の作法を参考にしているようです。
準備
まずはgo get
でglogパッケージを取得しましょう。glogパッケージは本体とは違い、 githubにホストされています:
$ go get github.com/golang/glog
基礎
まずは単純に:main.go
package main import ( "flag" "github.com/golang/glog" ) func main() { flag.Parse() glog.Info("info v1") glog.Error("error v1") }
go buildしてhelpを見てみると:
$ ./glog --help Usage of ./glog: -alsologtostderr=false: log to standard error as well as files -log_backtrace_at=:0: when logging hits line file:N, emit a stack trace -log_dir="": If non-empty, write log files in this directory -logtostderr=false: log to standard error instead of files -stderrthreshold=0: logs at or above this threshold go to stderr -v=0: log level for V logs -vmodule=: comma-separated list of pattern=N settings for file-filtered logging
となっています。 -logtostderr
でとりあえず、標準出力します:
$ ./glog -logtostderr I0720 11:00:57.398363 25717 main.go:12] info v1 E0720 11:00:57.398468 25717 main.go:13] error v1
先程の例にログレベル2を追加してみましょう:
if glog.V(2) {
glog.Info("info v2")
glog.Error("error v2")
}
すると:
$ ./glog -logtostderr -v 2 I0720 11:03:51.137019 25734 main.go:12] info v1 E0720 11:03:51.137136 25734 main.go:13] error v1 I0720 11:03:51.137144 25734 main.go:16] info v2 E0720 11:03:51.137148 25734 main.go:17] error v2
となり無事に出力されることがわかります。
ちょっと応用
foo.goを追加して、そのfooに書かれたログを吐き出すようにしてみます。
foo.goを追加してみる:foo.go
package main import ( "github.com/golang/glog" ) func foo() { glog.Info("info v1") glog.Error("error v1") glog.V(2).Info("info v2") }
で実行。
$ ./glog -logtostderr I0720 11:05:38.503918 25749 main.go:12] info v1 E0720 11:05:38.504035 25749 main.go:13] error v1 I0720 11:05:38.504043 25749 foo.go:8] info v1 E0720 11:05:38.504049 25749 foo.go:9] error v1
ここまではいい。
mainのv=2は除外して、fooのv=2のログだけを出力するには、-vmodule
でfoo=2を指定します。すると:
$ ./glog -logtostderr -vmodule=foo=2 I0720 11:07:04.466255 25795 main.go:12] info v1 E0720 11:07:04.466354 25795 main.go:13] error v1 I0720 11:07:04.466366 25795 foo.go:8] info v1 E0720 11:07:04.466372 25795 foo.go:9] error v1 I0720 11:07:04.466378 25795 foo.go:11] info v2
となり、mainのV=2のログは出力されずに、fooのV=2のログが出力されます。モジュールのログを出したいときにつかいます。
ここでつかったサンプルはgistでどぞ: https://gist.github.com/atotto/6043590
ログはどこへ出力されるのか
log_dir
を指定するとそのディレクトリへ出力されます
$ ./glog -log_dir="." E0720 13:41:21.245751 26875 main.go:12] error v1 E0720 13:41:21.246226 26875 foo.go:9] error v1 $ ls glog glog.Mac.atotto.log.ERROR.20130720-134121.26875 glog.Mac.atotto.log.INFO.20130720-134121.26875 glog.Mac.atotto.log.WARNING.20130720-134121.26875 glog.ERROR glog.INFO glog.WARNING foo.go main.go
感想
ログ出力は標準パッケージにlogパッケージがあります。しかし、大規模開発になると一律でログを出力するため使いにくいのが難点でした。(syslog使って解決してもいいのですが、モジュールログは扱いにくい。)このglogパッケージはその点を解決していると思います。
ハマったこと
flag.Parse()
を忘れずにmainへ書きましょう…。忘れると引数に何をいれても動きません。
今日のコード
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る