1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.mongodb4;
18
19 import org.apache.logging.log4j.Logger;
20 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
21 import org.apache.logging.log4j.core.appender.nosql.AbstractNoSqlConnection;
22 import org.apache.logging.log4j.core.appender.nosql.NoSqlConnection;
23 import org.apache.logging.log4j.core.appender.nosql.NoSqlObject;
24 import org.apache.logging.log4j.status.StatusLogger;
25 import org.bson.Document;
26
27 import com.mongodb.ConnectionString;
28 import com.mongodb.MongoException;
29 import com.mongodb.client.MongoClient;
30 import com.mongodb.client.MongoCollection;
31 import com.mongodb.client.MongoDatabase;
32 import com.mongodb.client.model.CreateCollectionOptions;
33 import com.mongodb.client.result.InsertOneResult;
34
35
36
37
38 public final class MongoDb4Connection extends AbstractNoSqlConnection<Document, MongoDb4DocumentObject> {
39
40 private static final Logger LOGGER = StatusLogger.getLogger();
41
42 private static MongoCollection<Document> getOrCreateMongoCollection(final MongoDatabase database,
43 final String collectionName, final boolean isCapped, final Integer sizeInBytes) {
44 try {
45 LOGGER.debug("Gettting collection '{}'...", collectionName);
46
47 final MongoCollection<Document> found = database.getCollection(collectionName);
48 LOGGER.debug("Got collection {}", found);
49 return found;
50 } catch (final IllegalStateException e) {
51 LOGGER.debug("Collection '{}' does not exist.", collectionName);
52 final CreateCollectionOptions options = new CreateCollectionOptions().capped(isCapped)
53 .sizeInBytes(sizeInBytes);
54 LOGGER.debug("Creating collection '{}' with options {}...", collectionName, options);
55 database.createCollection(collectionName, options);
56 LOGGER.debug("Created collection.");
57 final MongoCollection<Document> created = database.getCollection(collectionName);
58 LOGGER.debug("Got created collection {}", created);
59 return created;
60 }
61
62 }
63
64 private final ConnectionString connectionString;
65 private final MongoCollection<Document> collection;
66 private final MongoClient mongoClient;
67
68 public MongoDb4Connection(final ConnectionString connectionString, final MongoClient mongoClient,
69 final MongoDatabase mongoDatabase, final boolean isCapped, final Integer sizeInBytes) {
70 this.connectionString = connectionString;
71 this.mongoClient = mongoClient;
72 this.collection = getOrCreateMongoCollection(mongoDatabase, connectionString.getCollection(), isCapped,
73 sizeInBytes);
74 }
75
76 @Override
77 public void closeImpl() {
78
79 mongoClient.close();
80 }
81
82 @Override
83 public MongoDb4DocumentObject[] createList(final int length) {
84 return new MongoDb4DocumentObject[length];
85 }
86
87 @Override
88 public MongoDb4DocumentObject createObject() {
89 return new MongoDb4DocumentObject();
90 }
91
92 @Override
93 public void insertObject(final NoSqlObject<Document> object) {
94 try {
95 final Document unwrapped = object.unwrap();
96 LOGGER.debug("Inserting BSON Document {}", unwrapped);
97 InsertOneResult insertOneResult = this.collection.insertOne(unwrapped);
98 LOGGER.debug("Insert MongoDb result {}", insertOneResult);
99 } catch (final MongoException e) {
100 throw new AppenderLoggingException("Failed to write log event to MongoDB due to error: " + e.getMessage(),
101 e);
102 }
103 }
104
105 @Override
106 public String toString() {
107 return String.format("Mongo4Connection [connectionString=%s, collection=%s, mongoClient=%s]", connectionString,
108 collection, mongoClient);
109 }
110
111 }