func info(format string, args ...interface{}) {
_, file, line, _ := runtime.Caller(1)
prefix := fmt.Sprintf("%v:%v: ", path.Base(file), line)
if logger != nil {
logger.Printf(prefix+format+"\n", args...)
}
}
メソッドを適切な出力にメッセージを送信する:
回避策は、log.Lshortfile
フラグを削除し、手動での動作を実現することです。 Logger.Output()
は、calldepth
(スキップするフレーム数)を渡すことを許可します。
残念なことに、log.Logger
のメソッドにはcalldepth
が「配線されている」ため、ラッパー関数のフレームをスキップするためにオフセットを指定することはできません。
しかし、はるかに良い代替方法は、このLogger.Output()
をラッパーから呼び出すことです。フレームや行を気にする必要はありません。また、"\n"
という改行を追加する必要はありません。log.Logger
タイプでは、ログに記録されるメッセージが改行で終わっていない場合は、既にそれが行われています。
だから、代替より良いと短い:
var myLogger = log.New(os.Stdout, "[my]", log.Lshortfile)
func info(pattern string, args ...interface{}) {
myLogger.Output(2, fmt.Sprintf(pattern, args...))
}
テストそれ:
func main() {
log.SetFlags(log.Lshortfile)
log.Println("hello")
info("world")
}
出力(Go Playground上でそれを試してみてください):
main.go:11: hello
[my]main.go:12: world
あなたが見ることができるように、info()
適切な行番号を印刷します(+1はで印刷された行番号前の行の)。
これは私が話していることです:D大きな答え – Hubro