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 サイトの他の関連記事を参照してください。