読者です 読者をやめる 読者になる 読者になる

memoメモ

最近はGo言語関連で。φ(..)メモメモ

glogパッケージをちょっと使ってみる #golang

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へ書きましょう…。忘れると引数に何をいれても動きません。

今日のコード

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る