ホームページ > バックエンド開発 > Golang > Go の `log.New()` は `io.Writer` を使用して MongoDB に直接ログを記録できますか?

Go の `log.New()` は `io.Writer` を使用して MongoDB に直接ログを記録できますか?

Susan Sarandon
リリース: 2024-12-05 13:11:09
オリジナル
371 人が閲覧しました

Can Go's `log.New()` use an `io.Writer` to directly log to MongoDB?

Go: MongoDB ロギングのための io.Writer インターフェイスの利用

サーバーに直接出力するロガーを確立できるかどうかという疑問が生じます。データベース、特に MongoDB のコンテキスト内で。より正確には、io.Writer インターフェイスを実装して、log.New() への初期パラメータとして提供できますか?このインターフェイスにより、MongoDB データベースへの直接ロギングが効果的に有効になります。

従来のアプローチでは、カスタム データベース ロギング関数を作成します。ただし、この機能を提供する Go 言語内に既存のオプションがあるかどうかを検討する価値はあります。

MongoDB のコンテキスト内では、mgo.v2 はデータベース処理に使用される主要なライブラリです。ただし、明確な目的を果たす GridFS 以外には io.Writer インターフェイスがありません。

それにもかかわらず、MongoDB ログ用に io.Writer を実装することは可能です。これは、各ログ メッセージが 1 回の Writer.Write() 呼び出しで指定された io.Writer に配信されるという log.Logger 型による保証を前提としています。

io.Writer に準拠する型の実装。その Write() メソッドは、バイト スライスのペイロードを含むドキュメントを作成し、それを MongoDB に保存します。

type MongoWriter struct {
    sess *mgo.Session
}

func (mw *MongoWriter) Write(p []byte) (n int, err error) {
    c := mw.sess.DB("").C("log")
    err = c.Insert(bson.M{
        "created": time.Now(),
        "msg":     string(p),
    })
    if err != nil {
        return
    }
    return len(p), nil
}
ログイン後にコピー

この実装を利用すると、次のようになります。

sess := ... // Obtain a MongoDB session

mw := &MongoWriter{sess}
log.SetOutput(mw)

// The default Logger of the log package now utilizes our MongoWriter.
// Generate a log message for insertion into MongoDB:
log.Println("I'm the inaugural log message.")
log.Println("I'm multi-line,\nbut remain within a single log message.")
ログイン後にコピー

ログ メッセージは通常、改行で終わり、それが存在しない場合でも log.Logger によって追加されることに注意することが重要です。実際のメッセージより。この終了改行を省略したい場合は、単にトリミングしてください:

func (mw *MongoWriter) Write(p []byte) (n int, err error) {
    origLen := len(p)
    if len(p) > 0 && p[len(p)-1] == '\n' {
        p = p[:len(p)-1] // Cut terminating newline
    }

    c := mw.sess.DB("").C("log")

    // ... the rest remains unchanged

    return origLen, nil // Original length must be returned (due to p being resliced)
}
ログイン後にコピー

以上がGo の `log.New()` は `io.Writer` を使用して MongoDB に直接ログを記録できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート