package logger
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
collectionMap map[string]*mongo.Collection
|
|
)
|
|
|
|
func NewMongoDriver(config db, level int) (driver, error) {
|
|
if collectionMap == nil {
|
|
collectionMap = make(map[string]*mongo.Collection)
|
|
}
|
|
var collection *mongo.Collection
|
|
mKey := config.Host + strconv.Itoa(config.Port) + config.Database + config.Table
|
|
collection = collectionMap[mKey]
|
|
if collection == nil {
|
|
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
|
|
client, err := mongo.Connect(ctx, options.Client().ApplyURI(fmt.Sprintf("mongodb://%s:%d", config.Host, config.Port)))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = client.Ping(ctx, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
collection = client.Database(config.Database).Collection(config.Table)
|
|
collectionMap[mKey] = collection
|
|
}
|
|
|
|
return &mongoLogger{
|
|
level: level,
|
|
collection: collection,
|
|
}, nil
|
|
}
|
|
|
|
type mongoLogger struct {
|
|
level int
|
|
collection *mongo.Collection
|
|
}
|
|
|
|
func (m *mongoLogger) Record(message message) {
|
|
if (message.Level == debugLevel || message.Level == DebugLevel) && m.level > debugLevelInt {
|
|
return
|
|
}
|
|
if (message.Level == infoLevel || message.Level == InfoLevel) && m.level > infoLevelInt {
|
|
return
|
|
}
|
|
if (message.Level == warnLevel || message.Level == WarnLevel) && m.level > warnLevelInt {
|
|
return
|
|
}
|
|
if (message.Level == errorLevel || message.Level == ErrorLevel) && m.level > errorLevelInt {
|
|
return
|
|
}
|
|
if (message.Level == fatalLevel || message.Level == FatalLevel) && m.level > fatalLevelInt {
|
|
return
|
|
}
|
|
_, _ = m.collection.InsertOne(context.TODO(), message)
|
|
}
|