log.Logger
なので、これは簡単に実行できます。 typeは、各ログメッセージが宛先のio.Writer
に配信されることを保証します 単一のWriter.Write()
で 電話:
各ロギング操作は、WriterのWriteメソッドを1回呼び出します。ロガーは、複数のゴルーチンから同時に使用できます。 Writerへのアクセスをシリアル化することが保証されます。
したがって、基本的には、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 := ... // Get a MongoDB session
mw := &MongoWriter{sess}
log.SetOutput(mw)
// Now the default Logger of the log package uses our MongoWriter.
// Generate a log message that will be inserted into MongoDB:
log.Println("I'm the first log message.")
log.Println("I'm multi-line,\nbut will still be in a single log message.")
明らかに、別のlog.Logger
を使用している場合 インスタンス、MongoWriter
を設定します 例:
mylogger := log.New(mw, "", 0)
mylogger.Println("Custom logger")
ログメッセージは、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 is the same
return origLen, nil // Must return original length (we resliced p)
}