136

Goでのアプリケーションロギングのパターンは何ですか? たとえば、ログに記録する必要があるゴルーチンが 5 つある場合、どうすればよいでしょうか...

  • シングルlog.Loggerを作成して配布しますか?
  • それへのポインタを渡しlog.Loggerますか?
  • 各ゴルーチンまたは関数はロガーを作成する必要がありますか?
  • ロガーをグローバル変数として作成する必要がありますか?
4

7 に答える 7

11

この質問が少し古いことは知っていますが、私のように、プロジェクトが複数の小さなファイルで構成されている場合、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)
}
于 2015-09-28T15:10:56.147 に答える
3

これは古い質問ですが、http: //github.com/romana/rlog (私たちが開発したもの)の使用を提案したいと思います。これは環境変数によって構成され、rlog のインポート時にロガー オブジェクトが作成されて初期化されます。したがって、ロガーを渡す必要はありません。

rlog にはかなりの機能があります。

  • 完全に設定可能な日付/時刻スタンプ
  • ファイルだけでなく、stderr または stdout への同時出力。
  • 標準のログ レベル (Debug、Info など) と、自由に構成できるマルチレベルのログ記録。
  • 呼び出し元情報 (ファイル、行番号、関数) のオンデマンド ロギング。
  • ソース ファイルごとに異なるログ レベルを設定する機能。

非常に小さく、標準の Golang ライブラリを除いて外部依存関係がなく、積極的に開発されています。例はリポジトリで提供されています。

于 2016-12-05T00:01:29.943 に答える
0

検討できるロギング モジュールの 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()
}
于 2020-04-05T06:54:03.823 に答える