結論
以下のように、DEBUG
環境変数が設定されているときに、ログ出力するような関数を定義した場合は、glog.XxxDepth(例ではglog.InfoDepth)を使いましょう。
package main
import (
"flag"
"fmt"
"github.com/golang/glog"
"os"
)
func DebugLog(v interface{}) {
if os.Getenv("DEBUG") != "" {
glog.InfoDepth(1, fmt.Sprintf("%#v", v))
}
}
func main() {
flag.Set("stderrthreshold", "INFO")
flag.Parse()
os.Setenv("DEBUG", "1")
DebugLog("hoge") // ここが20行目
DebugLog("fuga") // ここが21行目
}
出力結果は以下のようになります。
I0829 22:47:11.932758 24176 main.go:20] "hoge"
I0829 22:55:36.233685 24681 main.go:21] "fuga"
出力場所として、main.go:20
main.go:21
が情報として含まれていますね。多くの場合、DebugLog("hoge")
やDebugLog("fuga")
が記述されている行数を出力して欲しいので、意図通りとなっています。
InfoDepthの代わりにInfoを使うとどうなるのか
以下のように Info関数
を使うとどうなるかを示します。
package main
import (
"flag"
"fmt"
"github.com/golang/glog"
"os"
)
func DebugLog(v interface{}) {
if os.Getenv("DEBUG") != "" {
glog.Info(fmt.Sprintf("%#v", v)) // ここが12行目
}
}
func main() {
flag.Set("stderrthreshold", "INFO")
flag.Parse()
os.Setenv("DEBUG", "1")
DebugLog("hoge")
DebugLog("fuga")
}
出力結果は以下のようになります。
I0829 22:57:00.569297 24777 main.go:12] "hoge"
I0829 22:57:00.569872 24777 main.go:12] "fuga"
はい、hoge
の出力も fuga
の出力もmain.go:12
として出力されてしまっています。つまり glog.Info
を呼び出している箇所ですね。これが InfoDepth
を使う理由となっています。