sql >> データベース >  >> NoSQL >> MongoDB

Go:mongodbデータベースにログを記録するためのio.Writerインターフェースを作成します

    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)
    }
    



    1. マングースモデルでメソッドを定義するにはどうすればよいですか?

    2. MongoDBの配列に埋め込まれたドキュメントを置き換える

    3. フィールド名にドットを使用する方法は?

    4. Rails + MongoMapper+EmbeddedDocumentフォームヘルプ