1

Go の標準パッケージは、Python の標準ライブラリlogとは異なり、レベルをサポートしていません。logging

glog多くのパッケージは、やなどのサードパーティのログ パッケージに頼っていますlogrus

サードパーティのロギング パッケージを使用する場合と使用しない場合があるサードパーティのパッケージをインポートする場合、Go の最適なロギング戦略は何ですか。

4

1 に答える 1

2

それで、私が使用しているパッケージがプレーンな古いhttps://golang.org/pkg/log/使用し、私のメイン パッケージがlog.Infolog.Warnlog.Error、およびlog.Debug

log.Loggerパッケージがオブジェクトを公開している場合、SetFlags, SetOutput,を使用SetPrefixしてそれらのログ メッセージの外観を変更したり、完全に無音にしたりすることができますが、特別なサードパーティのログ パッケージでは適切に動作させることはできません。

たとえば、サードパーティのパッケージが次のようになっているとします。

package sayhello

import (
      "log"
      "os"
)

type SayHello {
      Logger *log.Logger
}

func NewSayHello() (SayHello) {
      logger, _ := os.OpenFile("/tmp/tmp.log",  os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
      var sh SayHello
      sh.Logger = log.New(logger, "SAY HELLO LOGGER: ", log.Ldate|log.Ltime|log.Lshortfile)
      return sh
}

func (sh SayHello) Run() {
      sh.Logger.Println("Hello. I ran!")
}

次に、次のように沈黙させることができます。

package main

import (
      "sayhello"
      "io/ioutil"
)

func main() {
      sh := sayhello.NewSayHello()
      sh.Run()
      // output is: 2016/08/10 16:47:46 SAY HELLO LOGGER: Hello. I ran!
      sh.Logger.SetOutput(ioutil.Discard)
      sh.Run()
      // output is nothing
}

log.Printlnしかし、 a のような別のパッケージのログ ステートメントを、探しているものであるlog.Info、またはのようなものに変換する方法は実際にはありません。log.Debug

于 2016-08-10T21:54:28.100 に答える