golang でレベルベースのロギングに使用できる適切なラッパーはありますか? そうでない場合、自分で実装するにはどうすればよいですか?
私が欲しいものはとてもシンプルです。私はいくつかの機能が欲しい
log.Error()
log.Info()
出力を stdout に表示し、これらをログ ファイルに保存します (コマンドライン引数としてプログラムに指定されたレベルに基づきます)。このラッパーを実装するにはどうすればよいですか?
既存の回答がかなり古いため、いくつかの提案があります。
どちらのライブラリにもレベル フックがあり、これは非常に興味深い機能です。フックは、特定のログ レベルに登録できます。たとえば、エラー(を使用してログに記録log.Error()
)が発生した場合は、監視ツールなどに報告できます。
http://cgl.tideland.bizを見て、パッケージ「applog」を見てください。そのように機能しています。
PS: 現在、CGL 全体が作り直されており、まもなく新しい機能がリリースされますが、別の名前でリリースされます。;)
stdlogは、要件に正確に適合します。
log := stdlog.GetFromFlags()
log.Info("Connecting to the server...")
log.Errorf("Connection failed: %q", err)
検討できるロギング モジュールの 1 つは klog です。特定のレベルでログを記録する柔軟性を提供する「V」ログをサポートします
klog は glog のフォークであり、以下の欠点を克服しています
glog には多くの「落とし穴」があり、コンテナー化された環境に課題をもたらしますが、これらはすべて十分に文書化されていません。glog はログをテストする簡単な方法を提供していないため、それを使用するソフトウェアの安定性が損なわれます glog は C++ ベースであり、klog は純粋な golang 実装です
サンプル実装
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()
}