Skip to content

Commit 2b08de6

Browse files
vyjesmith17
andauthored
Add collectionName and databaseName attributes to MongoDbProvider (#3702)
Co-authored-by: Josh Smith <[email protected]>
1 parent 5c3c23c commit 2b08de6

File tree

20 files changed

+243
-37
lines changed

20 files changed

+243
-37
lines changed

log4j-mongodb/pom.xml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@
141141
<artifactId>junit-jupiter-api</artifactId>
142142
<scope>test</scope>
143143
</dependency>
144-
145144
</dependencies>
146145

147146
<build>
@@ -150,9 +149,7 @@
150149
<plugin>
151150
<groupId>org.apache.maven.plugins</groupId>
152151
<artifactId>maven-surefire-plugin</artifactId>
153-
<configuration>
154-
<skip>true</skip>
155-
</configuration>
152+
156153
<dependencies>
157154

158155
<dependency>

log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
*/
1717
package org.apache.logging.log4j.mongodb;
1818

19-
import com.mongodb.ConnectionString;
2019
import com.mongodb.MongoException;
2120
import com.mongodb.client.MongoClient;
2221
import com.mongodb.client.MongoCollection;
@@ -59,20 +58,17 @@ private static MongoCollection<Document> getOrCreateMongoCollection(
5958
}
6059
}
6160

62-
private final ConnectionString connectionString;
6361
private final MongoCollection<Document> collection;
6462
private final MongoClient mongoClient;
6563

6664
public MongoDbConnection(
67-
final ConnectionString connectionString,
6865
final MongoClient mongoClient,
6966
final MongoDatabase mongoDatabase,
67+
final String collectionName,
7068
final boolean isCapped,
7169
final Long sizeInBytes) {
72-
this.connectionString = connectionString;
7370
this.mongoClient = mongoClient;
74-
this.collection =
75-
getOrCreateMongoCollection(mongoDatabase, connectionString.getCollection(), isCapped, sizeInBytes);
71+
this.collection = getOrCreateMongoCollection(mongoDatabase, collectionName, isCapped, sizeInBytes);
7672
}
7773

7874
@Override
@@ -106,8 +102,6 @@ public void insertObject(final NoSqlObject<Document> object) {
106102

107103
@Override
108104
public String toString() {
109-
return String.format(
110-
"Mongo4Connection [connectionString=%s, collection=%s, mongoClient=%s]",
111-
connectionString, collection, mongoClient);
105+
return String.format("Mongo4Connection [collection=%s, mongoClient=%s]", collection, mongoClient);
112106
}
113107
}

log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.mongodb.ConnectionString;
2020
import com.mongodb.MongoClientSettings;
21+
import com.mongodb.MongoNamespace;
2122
import com.mongodb.client.MongoClient;
2223
import com.mongodb.client.MongoClients;
2324
import com.mongodb.client.MongoDatabase;
@@ -54,9 +55,45 @@ public static class Builder<B extends Builder<B>> extends AbstractFilterable.Bui
5455
@PluginAttribute("capped")
5556
private boolean capped = false;
5657

58+
@PluginAttribute("collectionName")
59+
private String collectionName;
60+
61+
@PluginAttribute("databaseName")
62+
private String databaseName;
63+
5764
@Override
5865
public MongoDbProvider build() {
59-
return new MongoDbProvider(connectionStringSource, capped, collectionSize);
66+
67+
LOGGER.debug("Creating ConnectionString {}...", connectionStringSource);
68+
final ConnectionString connectionString;
69+
try {
70+
connectionString = new ConnectionString(connectionStringSource);
71+
} catch (final IllegalArgumentException exception) {
72+
final String message = String.format("Invalid MongoDB connection string `%s`.", connectionStringSource);
73+
throw new IllegalArgumentException(message, exception);
74+
}
75+
76+
// Validate the provided databaseName property
77+
final String effectiveDatabaseName = databaseName != null ? databaseName : connectionString.getDatabase();
78+
try {
79+
MongoNamespace.checkDatabaseNameValidity(effectiveDatabaseName);
80+
} catch (final IllegalArgumentException exception) {
81+
final String message = String.format("Invalid MongoDB database name `%s`.", effectiveDatabaseName);
82+
throw new IllegalArgumentException(message, exception);
83+
}
84+
85+
// Validate the provided collectionName property
86+
final String effectiveCollectionName =
87+
collectionName != null ? collectionName : connectionString.getCollection();
88+
try {
89+
MongoNamespace.checkCollectionNameValidity(effectiveCollectionName);
90+
} catch (final IllegalArgumentException exception) {
91+
final String message = String.format("Invalid MongoDB collection name `%s`.", effectiveCollectionName);
92+
throw new IllegalArgumentException(message, exception);
93+
}
94+
95+
return new MongoDbProvider(
96+
connectionString, capped, collectionSize, effectiveDatabaseName, effectiveCollectionName);
6097
}
6198

6299
public B setConnectionStringSource(final String connectionStringSource) {
@@ -73,6 +110,16 @@ public B setCollectionSize(final long collectionSize) {
73110
this.collectionSize = collectionSize;
74111
return asBuilder();
75112
}
113+
114+
public B setCollectionName(final String collectionName) {
115+
this.collectionName = collectionName;
116+
return asBuilder();
117+
}
118+
119+
public B setDatabaseName(final String databaseName) {
120+
this.databaseName = databaseName;
121+
return asBuilder();
122+
}
76123
}
77124

78125
private static final Logger LOGGER = StatusLogger.getLogger();
@@ -94,47 +141,54 @@ public static <B extends Builder<B>> B newBuilder() {
94141

95142
private final Long collectionSize;
96143
private final boolean isCapped;
144+
private final String collectionName;
97145
private final MongoClient mongoClient;
98146
private final MongoDatabase mongoDatabase;
99147
private final ConnectionString connectionString;
100148

101-
private MongoDbProvider(final String connectionStringSource, final boolean isCapped, final Long collectionSize) {
102-
LOGGER.debug("Creating ConnectionString {}...", connectionStringSource);
103-
this.connectionString = new ConnectionString(connectionStringSource);
149+
private MongoDbProvider(
150+
final ConnectionString connectionString,
151+
final boolean isCapped,
152+
final Long collectionSize,
153+
final String databaseName,
154+
final String collectionName) {
155+
104156
LOGGER.debug("Created ConnectionString {}", connectionString);
157+
this.connectionString = connectionString;
105158
LOGGER.debug("Creating MongoClientSettings...");
106159
// @formatter:off
107160
final MongoClientSettings settings = MongoClientSettings.builder()
108-
.applyConnectionString(this.connectionString)
161+
.applyConnectionString(connectionString)
109162
.codecRegistry(CODEC_REGISTRIES)
110163
.build();
111164
// @formatter:on
112165
LOGGER.debug("Created MongoClientSettings {}", settings);
113166
LOGGER.debug("Creating MongoClient {}...", settings);
114167
this.mongoClient = MongoClients.create(settings);
115168
LOGGER.debug("Created MongoClient {}", mongoClient);
116-
final String databaseName = this.connectionString.getDatabase();
117169
LOGGER.debug("Getting MongoDatabase {}...", databaseName);
118170
this.mongoDatabase = this.mongoClient.getDatabase(databaseName);
119171
LOGGER.debug("Got MongoDatabase {}", mongoDatabase);
172+
this.collectionName = collectionName;
120173
this.isCapped = isCapped;
121174
this.collectionSize = collectionSize;
122175
}
123176

124177
@Override
125178
public MongoDbConnection getConnection() {
126-
return new MongoDbConnection(connectionString, mongoClient, mongoDatabase, isCapped, collectionSize);
179+
return new MongoDbConnection(mongoClient, mongoDatabase, collectionName, isCapped, collectionSize);
127180
}
128181

129182
@Override
130183
public String toString() {
131184
return String.format(
132-
"%s [connectionString=%s, collectionSize=%s, isCapped=%s, mongoClient=%s, mongoDatabase=%s]",
185+
"%s [connectionString=%s, collectionSize=%s, isCapped=%s, mongoClient=%s, mongoDatabase=%s, collectionName=%s]",
133186
MongoDbProvider.class.getSimpleName(),
134187
connectionString,
135188
collectionSize,
136189
isCapped,
137190
mongoClient,
138-
mongoDatabase);
191+
mongoDatabase,
192+
collectionName);
139193
}
140194
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to you under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.logging.log4j.mongodb;
18+
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
21+
22+
import com.mongodb.MongoNamespace;
23+
import com.mongodb.client.MongoCollection;
24+
import java.lang.reflect.Field;
25+
import org.bson.Document;
26+
import org.junit.jupiter.api.Test;
27+
28+
class MongoDbProviderTest {
29+
30+
private static final String CS_WO_DB = "mongodb://localhost:27017";
31+
private static final String CS_W_DB = "mongodb://localhost:27017/logging";
32+
private static final String CS_W_DB_N_COLL = "mongodb://localhost:27017/logging.logs";
33+
34+
private static final String COLL_NAME = "logsTest";
35+
private static final String DB_NAME = "loggingTest";
36+
37+
@Test
38+
void createProviderWithDatabaseAndCollectionProvidedViaConfig() {
39+
final MongoDbProvider provider = MongoDbProvider.newBuilder()
40+
.setConnectionStringSource(CS_WO_DB)
41+
.setDatabaseName(DB_NAME)
42+
.setCollectionName(COLL_NAME)
43+
.build();
44+
final MongoNamespace namespace = getNamespace(provider.getConnection());
45+
assertThat(namespace.getCollectionName()).isEqualTo(COLL_NAME);
46+
assertThat(namespace.getDatabaseName()).isEqualTo(DB_NAME);
47+
}
48+
49+
@Test
50+
void createProviderWithoutDatabaseName() {
51+
assertThatThrownBy(() -> MongoDbProvider.newBuilder()
52+
.setConnectionStringSource(CS_WO_DB)
53+
.build())
54+
.isInstanceOf(IllegalArgumentException.class)
55+
.hasMessageStartingWith("Invalid MongoDB database name");
56+
}
57+
58+
@Test
59+
void createProviderWithoutDatabaseNameWithCollectionName() {
60+
assertThatThrownBy(() -> MongoDbProvider.newBuilder()
61+
.setConnectionStringSource(CS_WO_DB)
62+
.setCollectionName(COLL_NAME)
63+
.build())
64+
.isInstanceOf(IllegalArgumentException.class)
65+
.hasMessageStartingWith("Invalid MongoDB database name");
66+
}
67+
68+
@Test
69+
void createProviderWithoutCollectionName() {
70+
assertThatThrownBy(() -> MongoDbProvider.newBuilder()
71+
.setConnectionStringSource(CS_WO_DB)
72+
.setDatabaseName(DB_NAME)
73+
.build())
74+
.isInstanceOf(IllegalArgumentException.class)
75+
.hasMessageStartingWith("Invalid MongoDB collection name");
76+
}
77+
78+
@Test
79+
void createProviderWithDatabaseOnConnectionString() {
80+
final MongoDbProvider provider = MongoDbProvider.newBuilder()
81+
.setConnectionStringSource(CS_W_DB)
82+
.setCollectionName(COLL_NAME)
83+
.build();
84+
final MongoNamespace namespace = getNamespace(provider.getConnection());
85+
assertThat(namespace.getCollectionName()).isEqualTo(COLL_NAME);
86+
assertThat(namespace.getDatabaseName()).isEqualTo("logging");
87+
}
88+
89+
@Test
90+
void createProviderConfigOverridesConnectionString() {
91+
final MongoDbProvider provider = MongoDbProvider.newBuilder()
92+
.setConnectionStringSource(CS_W_DB_N_COLL)
93+
.setCollectionName(COLL_NAME)
94+
.setDatabaseName(DB_NAME)
95+
.build();
96+
final MongoNamespace namespace = getNamespace(provider.getConnection());
97+
assertThat(namespace.getCollectionName()).isEqualTo(COLL_NAME);
98+
assertThat(namespace.getDatabaseName()).isEqualTo(DB_NAME);
99+
}
100+
101+
private static MongoNamespace getNamespace(final MongoDbConnection connection) {
102+
try {
103+
final Field collectionField = MongoDbConnection.class.getDeclaredField("collection");
104+
collectionField.setAccessible(true);
105+
@SuppressWarnings("unchecked")
106+
final MongoCollection<Document> collection = (MongoCollection<Document>) collectionField.get(connection);
107+
return collection.getNamespace();
108+
} catch (final Exception exception) {
109+
throw new RuntimeException(exception);
110+
}
111+
}
112+
}

log4j-mongodb/src/test/resources/MongoDbAdditionalFields.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
https://logging.apache.org/xml/ns/log4j-config-3.xsd">
2323
<Appenders>
2424
<NoSql name="MONGO">
25-
<MongoDb connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}/testDb.MongoDbAdditionalFieldsIT"/>
25+
<MongoDb
26+
connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}"
27+
databaseName="testDb"
28+
collectionName="MongoDbAdditionalFieldsIT"/>
2629
<KeyValuePair key="A" value="1"/>
2730
<KeyValuePair key="B" value="2"/>
2831
<KeyValuePair key="env1" value="${env:PATH}"/>

log4j-mongodb/src/test/resources/MongoDbAuthFailureIT.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
<Appenders>
2424
<NoSql name="MONGO">
2525
<MongoDb
26-
connection="mongodb://log4jUser:12345678@localhost:${sys:log4j.mongo.port:-27017}/testDb.MongoDbAuthFailureIT" />
26+
connection="mongodb://log4jUser:12345678@localhost:${sys:log4j.mongo.port:-27017}"
27+
databaseName="testDb"
28+
collectionName="MongoDbAuthFailureIT" />
2729
</NoSql>
2830
</Appenders>
2931
<Loggers>

log4j-mongodb/src/test/resources/MongoDbCappedIntIT.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
<Appenders>
2424
<NoSql name="MONGO">
2525
<MongoDb
26-
connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}/testDb.MongoDbCappedIntIT"
26+
connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}"
27+
databaseName="testDb"
28+
collectionName="MongoDbCappedIntIT"
2729
capped="true"
2830
collectionSize="1073741824"/>
2931
</NoSql>

log4j-mongodb/src/test/resources/MongoDbCappedLongIT.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
<NoSql name="MONGO">
2525
<!-- collectionSize="2147483657" is max int + 10 -->
2626
<MongoDb
27-
connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}/testDb.MongoDbCappedLongIT"
27+
connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}"
28+
databaseName="testDb"
29+
collectionName="MongoDbCappedLongIT"
2830
capped="true"
2931
collectionSize="2147483657"/>
3032
</NoSql>

log4j-mongodb/src/test/resources/MongoDbIT.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
https://logging.apache.org/xml/ns/log4j-config-3.xsd">
2323
<Appenders>
2424
<NoSql name="MONGO">
25-
<MongoDb connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}/testDb.MongoDbIT" />
25+
<MongoDb connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}" collectionName="MongoDbIT" databaseName="testDb" />
2626
</NoSql>
2727
</Appenders>
2828
<Loggers>

log4j-mongodb/src/test/resources/MongoDbMapMessageIT.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@
2222
https://logging.apache.org/xml/ns/log4j-config-3.xsd">
2323
<Appenders>
2424
<NoSql name="MONGO">
25-
<MongoDb connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}/testDb.MongoDbMapMessageIT" />
25+
<MongoDb
26+
connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}"
27+
databaseName="testDb"
28+
collectionName="MongoDbMapMessageIT"/>
2629
<MessageLayout />
2730
</NoSql>
2831
</Appenders>
2932
<Loggers>
3033
<Root level="ALL">
31-
<AppenderRef ref="MONGO" />
34+
<AppenderRef ref="MONGO"/>
3235
</Root>
3336
</Loggers>
3437
</Configuration>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="https://logging.apache.org/xml/ns"
4+
xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd"
5+
type="added">
6+
<issue id="3322" link="https://github.com/apache/logging-log4j2/pull/3322"/>
7+
<description format="asciidoc">Add `collectionName` and `databaseName` arguments to the MongoDB appender</description>
8+
</entry>

0 commit comments

Comments
 (0)