Goでのアプリケーションロギングのパターンは何ですか? たとえば、ログに記録する必要があるゴルーチンが 5 つある場合、どうすればよいでしょうか...
- シングル
log.Logger
を作成して配布しますか? - それへのポインタを渡し
log.Logger
ますか? - 各ゴルーチンまたは関数はロガーを作成する必要がありますか?
- ロガーをグローバル変数として作成する必要がありますか?
この質問が少し古いことは知っていますが、私のように、プロジェクトが複数の小さなファイルで構成されている場合、4番目のオプションに投票します-logger.go
パッケージのメインの一部であるを作成しました。この go ファイルは、ロガーを作成し、それをファイルに割り当て、メインの残りの部分に提供します。エラーログを閉じるための適切な方法を思い付いていないことに注意してください...
package main
import (
"fmt"
"log"
"os"
)
var errorlog *os.File
var logger *log.Logger
func init() {
errorlog, err := os.OpenFile(logfile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Printf("error opening file: %v", err)
os.Exit(1)
}
logger = log.New(errorlog, "applog: ", log.Lshortfile|log.LstdFlags)
}
これは古い質問ですが、http: //github.com/romana/rlog (私たちが開発したもの)の使用を提案したいと思います。これは環境変数によって構成され、rlog のインポート時にロガー オブジェクトが作成されて初期化されます。したがって、ロガーを渡す必要はありません。
rlog にはかなりの機能があります。
非常に小さく、標準の Golang ライブラリを除いて外部依存関係がなく、積極的に開発されています。例はリポジトリで提供されています。
検討できるロギング モジュールの 1 つはklogです。特定のレベルでログを記録する柔軟性を提供する「V」ログをサポートします
klog は glog のフォークであり、以下の欠点を克服しています
サンプル実装
package main
import (
"flag"
"k8s.io/klog"
)
type myError struct {
str string
}
func (e myError) Error() string {
return e.str
}
func main() {
klog.InitFlags(nil)
flag.Set("v", "1")
flag.Parse()
klog.Info("hello", "val1", 1, "val2", map[string]int{"k": 1})
klog.V(3).Info("nice to meet you")
klog.Error(nil, "uh oh", "trouble", true, "reasons", []float64{0.1, 0.11, 3.14})
klog.Error(myError{"an error occurred"}, "goodbye", "code", -1)
klog.Flush()
}