From 91a0db4d92037cc4aea0bc5ea35065f62e9b61f9 Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sat, 21 Dec 2024 17:40:55 -0600 Subject: [PATCH 01/10] Added ability to configure database and collection name via the config file instead of just the connectionString --- .../log4j/mongodb/MongoDbProvider.java | 37 +++++++++++++++--- .../mongodb/MongoDbCollectionNameIT.java | 36 +++++++++++++++++ .../MongoDbDatabaseAndCollectionNameIT.java | 36 +++++++++++++++++ .../resources/MongoDbCollectionNameIT.xml | 37 ++++++++++++++++++ .../MongoDbDatabaseAndCollectionNameIT.xml | 39 +++++++++++++++++++ 5 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCollectionNameIT.java create mode 100644 log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbDatabaseAndCollectionNameIT.java create mode 100644 log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml create mode 100644 log4j-mongodb/src/test/resources/MongoDbDatabaseAndCollectionNameIT.xml diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java index 8bc0098809c..ad8f91f1137 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java @@ -54,9 +54,15 @@ public static class Builder> extends AbstractFilterable.Bui @PluginAttribute("capped") private boolean capped = false; + @PluginAttribute("collectionName") + private String collectionName = null; + + @PluginAttribute("datbaseName") + private String databaseName = null; + @Override public MongoDbProvider build() { - return new MongoDbProvider(connectionStringSource, capped, collectionSize); + return new MongoDbProvider(connectionStringSource, capped, collectionSize, databaseName, collectionName); } public B setConnectionStringSource(final String connectionStringSource) { @@ -73,6 +79,16 @@ public B setCollectionSize(final long collectionSize) { this.collectionSize = collectionSize; return asBuilder(); } + + public B setCollectionName(final String collectionName) { + this.collectionName = collectionName; + return asBuilder(); + } + + public B setDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return asBuilder(); + } } private static final Logger LOGGER = StatusLogger.getLogger(); @@ -94,11 +110,13 @@ public static > B newBuilder() { private final Long collectionSize; private final boolean isCapped; + private final String collectionName; + private final String databaseName; private final MongoClient mongoClient; private final MongoDatabase mongoDatabase; private final ConnectionString connectionString; - private MongoDbProvider(final String connectionStringSource, final boolean isCapped, final Long collectionSize) { + private MongoDbProvider(final String connectionStringSource, final boolean isCapped, final Long collectionSize, final String databaseName, final String collectionName) { LOGGER.debug("Creating ConnectionString {}...", connectionStringSource); this.connectionString = new ConnectionString(connectionStringSource); LOGGER.debug("Created ConnectionString {}", connectionString); @@ -113,10 +131,19 @@ private MongoDbProvider(final String connectionStringSource, final boolean isCap LOGGER.debug("Creating MongoClient {}...", settings); this.mongoClient = MongoClients.create(settings); LOGGER.debug("Created MongoClient {}", mongoClient); - final String databaseName = this.connectionString.getDatabase(); - LOGGER.debug("Getting MongoDatabase {}...", databaseName); - this.mongoDatabase = this.mongoClient.getDatabase(databaseName); + if (databaseName == null || databaseName.isEmpty()) { + this.databaseName = this.connectionString.getDatabase(); + } else { + this.databaseName = databaseName; + } + LOGGER.debug("Getting MongoDatabase {}...", this.databaseName); + this.mongoDatabase = this.mongoClient.getDatabase(this.databaseName); LOGGER.debug("Got MongoDatabase {}", mongoDatabase); + if (collectionName == null || collectionName.isEmpty()) { + this.collectionName = this.connectionString.getCollection(); + } else { + this.collectionName = collectionName; + } this.isCapped = isCapped; this.collectionSize = collectionSize; } diff --git a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCollectionNameIT.java b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCollectionNameIT.java new file mode 100644 index 00000000000..60c74dff597 --- /dev/null +++ b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCollectionNameIT.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.logging.log4j.mongodb; + +import com.mongodb.client.MongoClient; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.test.junit.LoggerContextSource; +import org.apache.logging.log4j.test.junit.UsingStatusListener; +import org.junit.jupiter.api.Test; + +@UsingMongoDb +@LoggerContextSource("MongoDbCollectionNameIT.xml") +// Print debug status logger output upon failure +@UsingStatusListener +class MongoDbCollectionNameIT extends AbstractMongoDbCappedIT { + + @Test + @Override + protected void test(LoggerContext ctx, MongoClient mongoClient) { + super.test(ctx, mongoClient); + } +} diff --git a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbDatabaseAndCollectionNameIT.java b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbDatabaseAndCollectionNameIT.java new file mode 100644 index 00000000000..8d399d10ac9 --- /dev/null +++ b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbDatabaseAndCollectionNameIT.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.logging.log4j.mongodb; + +import com.mongodb.client.MongoClient; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.test.junit.LoggerContextSource; +import org.apache.logging.log4j.test.junit.UsingStatusListener; +import org.junit.jupiter.api.Test; + +@UsingMongoDb +@LoggerContextSource("MongoDbDatabaseAndCollectionNameIT.xml") +// Print debug status logger output upon failure +@UsingStatusListener +class MongoDbDatabaseAndCollectionNameIT extends AbstractMongoDbCappedIT { + + @Test + @Override + protected void test(LoggerContext ctx, MongoClient mongoClient) { + super.test(ctx, mongoClient); + } +} diff --git a/log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml b/log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml new file mode 100644 index 00000000000..2f2dcc3d7c9 --- /dev/null +++ b/log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + diff --git a/log4j-mongodb/src/test/resources/MongoDbDatabaseAndCollectionNameIT.xml b/log4j-mongodb/src/test/resources/MongoDbDatabaseAndCollectionNameIT.xml new file mode 100644 index 00000000000..adf32a000d9 --- /dev/null +++ b/log4j-mongodb/src/test/resources/MongoDbDatabaseAndCollectionNameIT.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + From 18368090d3f197d7ab8fca356e243ea44970ff39 Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sat, 21 Dec 2024 17:50:50 -0600 Subject: [PATCH 02/10] Added changelog file --- src/changelog/.3.x.x/update_org_log4j_mongodb.xml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/changelog/.3.x.x/update_org_log4j_mongodb.xml diff --git a/src/changelog/.3.x.x/update_org_log4j_mongodb.xml b/src/changelog/.3.x.x/update_org_log4j_mongodb.xml new file mode 100644 index 00000000000..cf632d89059 --- /dev/null +++ b/src/changelog/.3.x.x/update_org_log4j_mongodb.xml @@ -0,0 +1,8 @@ + + + + Update log4j-mongodb to allow collectionName and databaseName to be defined via the config file + From 9d9608d3d0d2ec4c064e608332e4231eeefd4de3 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Wed, 25 Dec 2024 10:14:37 +0100 Subject: [PATCH 03/10] Formatting --- .../org/apache/logging/log4j/mongodb/MongoDbProvider.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java index ad8f91f1137..4db68505086 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java @@ -116,7 +116,12 @@ public static > B newBuilder() { private final MongoDatabase mongoDatabase; private final ConnectionString connectionString; - private MongoDbProvider(final String connectionStringSource, final boolean isCapped, final Long collectionSize, final String databaseName, final String collectionName) { + private MongoDbProvider( + final String connectionStringSource, + final boolean isCapped, + final Long collectionSize, + final String databaseName, + final String collectionName) { LOGGER.debug("Creating ConnectionString {}...", connectionStringSource); this.connectionString = new ConnectionString(connectionStringSource); LOGGER.debug("Created ConnectionString {}", connectionString); From aa4c0bcf033087d34d168f94ef3a24ae695e9d27 Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sat, 28 Dec 2024 19:45:21 -0600 Subject: [PATCH 04/10] Solved merge conflict in MongoDbProvider class --- log4j-mongodb/pom.xml | 11 ++ .../log4j/mongodb/MongoDbConnection.java | 19 ++-- .../log4j/mongodb/MongoDbProvider.java | 69 +++++++----- .../log4j/mongodb/MongoDbProviderTest.java | 100 ++++++++++++++++++ .../appenders/database/nosql-mongo-keys.json | 4 +- .../database/nosql-mongo-keys.properties | 5 +- .../appenders/database/nosql-mongo-keys.xml | 2 +- .../appenders/database/nosql-mongo-keys.yaml | 4 +- .../appenders/database/nosql-mongo.json | 4 +- .../appenders/database/nosql-mongo.properties | 4 +- .../manual/appenders/database/nosql-mongo.xml | 2 +- .../appenders/database/nosql-mongo.yaml | 4 +- .../ROOT/pages/manual/appenders/database.adoc | 22 ++++ 13 files changed, 209 insertions(+), 41 deletions(-) create mode 100644 log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java diff --git a/log4j-mongodb/pom.xml b/log4j-mongodb/pom.xml index b03b534e66e..a4c329fb853 100644 --- a/log4j-mongodb/pom.xml +++ b/log4j-mongodb/pom.xml @@ -141,6 +141,17 @@ junit-jupiter-api test + + junit + junit + test + + + org.mockito + mockito-junit-jupiter + 5.14.2 + test + diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java index cabc6c73e1e..e3db2751638 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java @@ -59,20 +59,19 @@ private static MongoCollection getOrCreateMongoCollection( } } - private final ConnectionString connectionString; + private final MongoCollection collection; private final MongoClient mongoClient; public MongoDbConnection( - final ConnectionString connectionString, final MongoClient mongoClient, final MongoDatabase mongoDatabase, + final String collectionName, final boolean isCapped, final Long sizeInBytes) { - this.connectionString = connectionString; this.mongoClient = mongoClient; this.collection = - getOrCreateMongoCollection(mongoDatabase, connectionString.getCollection(), isCapped, sizeInBytes); + getOrCreateMongoCollection(mongoDatabase, collectionName, isCapped, sizeInBytes); } @Override @@ -107,7 +106,15 @@ public void insertObject(final NoSqlObject object) { @Override public String toString() { return String.format( - "Mongo4Connection [connectionString=%s, collection=%s, mongoClient=%s]", - connectionString, collection, mongoClient); + "Mongo4Connection [collection=%s, mongoClient=%s]", collection, mongoClient); + } + + public MongoCollection getCollection(){ + return this.collection; } + + public MongoClient getMongoClient(){ + return this.mongoClient; + } + } diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java index 4db68505086..44b79ef5d71 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java @@ -18,6 +18,7 @@ import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; +import com.mongodb.MongoNamespace; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; @@ -57,12 +58,40 @@ public static class Builder> extends AbstractFilterable.Bui @PluginAttribute("collectionName") private String collectionName = null; - @PluginAttribute("datbaseName") + @PluginAttribute("databaseName") private String databaseName = null; @Override public MongoDbProvider build() { - return new MongoDbProvider(connectionStringSource, capped, collectionSize, databaseName, collectionName); + LOGGER.debug("Creating ConnectionString {}...", connectionStringSource); + ConnectionString connectionString; + try { + connectionString = new ConnectionString(connectionStringSource); + } catch (final IllegalArgumentException e) { + LOGGER.error("Invalid MongoDB connection string `{}`.", connectionStringSource, e); + return null; + } + + String effectiveDatabaseName = databaseName != null ? databaseName : connectionString.getDatabase(); + String effectiveCollectionName = collectionName != null ? collectionName: connectionString.getCollection(); + // Validate the provided databaseName property + try { + MongoNamespace.checkDatabaseNameValidity(effectiveDatabaseName); + databaseName = effectiveDatabaseName; + } catch (final IllegalArgumentException e) { + LOGGER.error("Invalid MongoDB database name `{}`.", effectiveDatabaseName, e); + return null; + } + // Validate the provided collectionName property + try { + MongoNamespace.checkCollectionNameValidity(effectiveCollectionName); + collectionName = effectiveCollectionName; + } catch (final IllegalArgumentException e) { + LOGGER.error("Invalid MongoDB collection name `{}`.", effectiveCollectionName, e); + return null; + } + + return new MongoDbProvider(connectionString, capped, collectionSize, databaseName, collectionName); } public B setConnectionStringSource(final String connectionStringSource) { @@ -111,24 +140,18 @@ public static > B newBuilder() { private final Long collectionSize; private final boolean isCapped; private final String collectionName; - private final String databaseName; private final MongoClient mongoClient; private final MongoDatabase mongoDatabase; private final ConnectionString connectionString; - private MongoDbProvider( - final String connectionStringSource, - final boolean isCapped, - final Long collectionSize, - final String databaseName, - final String collectionName) { - LOGGER.debug("Creating ConnectionString {}...", connectionStringSource); - this.connectionString = new ConnectionString(connectionStringSource); + private MongoDbProvider(final ConnectionString connectionString, final boolean isCapped, final Long collectionSize, final String databaseName, final String collectionName) { + LOGGER.debug("Created ConnectionString {}", connectionString); + this.connectionString = connectionString; LOGGER.debug("Creating MongoClientSettings..."); // @formatter:off final MongoClientSettings settings = MongoClientSettings.builder() - .applyConnectionString(this.connectionString) + .applyConnectionString(connectionString) .codecRegistry(CODEC_REGISTRIES) .build(); // @formatter:on @@ -136,37 +159,29 @@ private MongoDbProvider( LOGGER.debug("Creating MongoClient {}...", settings); this.mongoClient = MongoClients.create(settings); LOGGER.debug("Created MongoClient {}", mongoClient); - if (databaseName == null || databaseName.isEmpty()) { - this.databaseName = this.connectionString.getDatabase(); - } else { - this.databaseName = databaseName; - } - LOGGER.debug("Getting MongoDatabase {}...", this.databaseName); - this.mongoDatabase = this.mongoClient.getDatabase(this.databaseName); + LOGGER.debug("Getting MongoDatabase {}...", databaseName); + this.mongoDatabase = this.mongoClient.getDatabase(databaseName); LOGGER.debug("Got MongoDatabase {}", mongoDatabase); - if (collectionName == null || collectionName.isEmpty()) { - this.collectionName = this.connectionString.getCollection(); - } else { - this.collectionName = collectionName; - } + this.collectionName = collectionName; this.isCapped = isCapped; this.collectionSize = collectionSize; } @Override public MongoDbConnection getConnection() { - return new MongoDbConnection(connectionString, mongoClient, mongoDatabase, isCapped, collectionSize); + return new MongoDbConnection(mongoClient, mongoDatabase, collectionName, isCapped, collectionSize); } @Override public String toString() { return String.format( - "%s [connectionString=%s, collectionSize=%s, isCapped=%s, mongoClient=%s, mongoDatabase=%s]", + "%s [connectionString=%s, collectionSize=%s, isCapped=%s, mongoClient=%s, mongoDatabase=%s, collectionName=%s]", MongoDbProvider.class.getSimpleName(), connectionString, collectionSize, isCapped, mongoClient, - mongoDatabase); + mongoDatabase, + collectionName); } } diff --git a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java new file mode 100644 index 00000000000..57ceee3eb38 --- /dev/null +++ b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java @@ -0,0 +1,100 @@ +package org.apache.logging.log4j.mongodb; + +import com.mongodb.MongoNamespace; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import org.apache.logging.log4j.plugins.util.Assert; +import org.bson.Document; +import org.junit.Before; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + + +class MongoDbProviderTest { + + private String validConnectionString = "mongodb://localhost:27017"; + private String invalidConnectionString = "test:test"; + + @Mock + private MongoDatabase mockDB; + + @Mock + private MongoCollection mockCollection; + + @Mock + private MongoClient mockClient; + + @Mock + private MongoNamespace mockNamespace; + + @Before + public void initMocks(){ + when(mockClient.getDatabase(anyString())).thenReturn(mockDB); + + } + + + + @Test + void databaseNameAndCollectionNameProvided() { + String collectionName = "logsTest"; + String databaseName = "loggingTest"; + + MongoCollection mockCollection = mock(MongoCollection.class); + MongoNamespace mockNamespace = mock(MongoNamespace.class); + when(mockNamespace.getCollectionName()).thenReturn(collectionName); + when(mockNamespace.getDatabaseName()).thenReturn(databaseName); + when(mockCollection.getNamespace()).thenReturn(mockNamespace); + + + MongoDbProvider provider = MongoDbProvider.newBuilder() + .setConnectionStringSource(this.validConnectionString) + .setDatabaseName(databaseName) + .setCollectionName(collectionName) + .build(); + + assertNotNull("Returned provider is null", provider); + assertEquals("Collection names do not match", collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); + assertEquals("Database names do not match", databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName()); + + } + + @Test + void databaseNameOmitted() { + + } + + @Test + void collectionNameProvided(){ + + + } + + @Test + void collectionNameOmitted(){ + + } + + @Test + void connectionStringValid(){ + + } + + @Test + void connectionStringEmpty() { + + } + + @Test + void connectionStringInvalid(){ + + } + + +} \ No newline at end of file diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.json b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.json index 2b47690c0b5..cac61efc980 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.json +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.json @@ -5,7 +5,9 @@ "NoSql": { "name": "MONGO", "MongoDb": { - "connection": "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs" + "connection": "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017", + "databaseName": "logging", + "collectionName": "logs" }, "KeyValuePair": [ { diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.properties b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.properties index f0b64894e28..30713a12737 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.properties +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.properties @@ -19,7 +19,10 @@ Appenders.0.type = NoSql Appenders.0.name = MONGO Appenders.0.provider.type = MongoDB -Appenders.0.provider.connection = mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs +Appenders.0.provider.connection = mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017 +Appenders.0.provider.databaseName = logging +Appenders.0.provider.collectionName = logs + Appenders.0.kv[0].type = KeyValuePair Appenders.0.kv[0].key = startTime diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.xml b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.xml index cd9f458ac3a..60232ae5be6 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.xml +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.xml @@ -23,7 +23,7 @@ - + diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.yaml b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.yaml index 2cb5df2c85f..90a8ad766d4 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.yaml +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.yaml @@ -20,7 +20,9 @@ Configuration: NoSql: name: "MONGO" MongoDb: - connection: "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs" + connection: "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017" + databaseName: "logging" + collectionName: "logs" KeyValuePair: - key: "startTime" value: "${date:yyyy-MM-dd hh:mm:ss.SSS}" # <1> diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.json b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.json index d06b3a190f6..cf01b6a549a 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.json +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.json @@ -10,7 +10,9 @@ "NoSql": { "name": "MONGO", "MongoDb": { - "connection": "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs" + "connection": "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017", + "databaseName" : "logging", + "collectionName": "logs" } } // end::appender[] diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.properties b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.properties index 2853c83137c..c5cafac439c 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.properties +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.properties @@ -22,7 +22,9 @@ Appenders.0.layout.type = JsonTemplateLayout Appenders.1.type = NoSql Appenders.1.name = MONGO Appenders.1.provider.type = MongoDB -Appenders.1.provider.connection = mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs +Appenders.1.provider.connection = mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017 +Appenders.1.provider.databaseName = logging +Appenders.1.provider.collectionName = logs # end::appender[] # tag::loggers[] diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.xml b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.xml index 31fe89f2f19..e05746405d6 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.xml +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.xml @@ -27,7 +27,7 @@ - + diff --git a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.yaml b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.yaml index f5bd4b66121..6469b81593c 100644 --- a/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.yaml +++ b/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.yaml @@ -24,7 +24,9 @@ Configuration: NoSql: name: "MONGO" MongoDb: - connection: "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs" + connection: "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017" + databaseName: "logging" + collectionName: "logs" # end::appender[] Loggers: # tag::loggers[] diff --git a/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc b/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc index 079891da044..62b4ad35c2b 100644 --- a/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc +++ b/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc @@ -817,6 +817,28 @@ for its format. **Required** +| [[MongoDbProvider-attr-databaseName]]databaseName +| 'string' +| +| +It specifies the name of the database for the logger to use. + +Overrides the value provided in the connection string if present. + +**Required** + +| [[MongoDbProvider-attr-collectionName]]collectionName +| 'string' +| +| +It pecifies the name of the collection for the logger to use. + +Overrides the value provided in the connection string if present. + +**Required** + + + | [[MongoDbProvider-attr-capped]]capped | `boolean` | `false` From b746300c6b4058a1ba85553c7e8bf620dbf3dbf1 Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sat, 28 Dec 2024 22:06:25 -0600 Subject: [PATCH 05/10] Added unit tests for MongoDbProvider --- log4j-mongodb/pom.xml | 10 +- .../log4j/mongodb/MongoDbConnection.java | 8 +- .../log4j/mongodb/MongoDbProviderTest.java | 110 ++++++++++-------- 3 files changed, 65 insertions(+), 63 deletions(-) diff --git a/log4j-mongodb/pom.xml b/log4j-mongodb/pom.xml index a4c329fb853..ce0c72f14fd 100644 --- a/log4j-mongodb/pom.xml +++ b/log4j-mongodb/pom.xml @@ -76,6 +76,7 @@ org.apache.logging.log4j log4j-api + 3.0.0-SNAPSHOT @@ -146,13 +147,6 @@ junit test - - org.mockito - mockito-junit-jupiter - 5.14.2 - test - - @@ -162,7 +156,7 @@ org.apache.maven.plugins maven-surefire-plugin - true + false diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java index e3db2751638..ea8f52a23d4 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java @@ -109,12 +109,12 @@ public String toString() { "Mongo4Connection [collection=%s, mongoClient=%s]", collection, mongoClient); } + /* + * This method is exposed to help support unit tests for the MongoDbProvider class. + * + */ public MongoCollection getCollection(){ return this.collection; } - public MongoClient getMongoClient(){ - return this.mongoClient; - } - } diff --git a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java index 57ceee3eb38..3bcb294701c 100644 --- a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java +++ b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java @@ -1,100 +1,108 @@ package org.apache.logging.log4j.mongodb; -import com.mongodb.MongoNamespace; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; -import org.apache.logging.log4j.plugins.util.Assert; -import org.bson.Document; -import org.junit.Before; import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import static org.junit.Assert.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; class MongoDbProviderTest { - private String validConnectionString = "mongodb://localhost:27017"; + private String validConnectionStringWithoutDatabase = "mongodb://localhost:27017"; private String invalidConnectionString = "test:test"; + private String validConnectionStringWithDatabase = "mongodb://localhost:27017/logging"; + private String validConnectionStringWithDatabaseAndCollection = "mongodb://localhost:27017/logging.logs"; - @Mock - private MongoDatabase mockDB; + private String collectionName = "logsTest"; + private String databaseName = "loggingTest"; - @Mock - private MongoCollection mockCollection; - @Mock - private MongoClient mockClient; - @Mock - private MongoNamespace mockNamespace; - @Before - public void initMocks(){ - when(mockClient.getDatabase(anyString())).thenReturn(mockDB); + @Test + void createProviderWithDatabaseAndCollectionProvidedViaConfig() { - } + MongoDbProvider provider = MongoDbProvider.newBuilder() + .setConnectionStringSource(this.validConnectionStringWithoutDatabase) + .setDatabaseName(this.databaseName) + .setCollectionName(this.collectionName) + .build(); + assertNotNull("Returned provider is null", provider); + assertEquals("Collection names do not match", this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); + assertEquals("Database names do not match", this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName()); + } @Test - void databaseNameAndCollectionNameProvided() { - String collectionName = "logsTest"; - String databaseName = "loggingTest"; - - MongoCollection mockCollection = mock(MongoCollection.class); - MongoNamespace mockNamespace = mock(MongoNamespace.class); - when(mockNamespace.getCollectionName()).thenReturn(collectionName); - when(mockNamespace.getDatabaseName()).thenReturn(databaseName); - when(mockCollection.getNamespace()).thenReturn(mockNamespace); - + void createProviderWithoutDatabaseName() { MongoDbProvider provider = MongoDbProvider.newBuilder() - .setConnectionStringSource(this.validConnectionString) - .setDatabaseName(databaseName) - .setCollectionName(collectionName) + .setConnectionStringSource(this.validConnectionStringWithoutDatabase) .build(); - assertNotNull("Returned provider is null", provider); - assertEquals("Collection names do not match", collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); - assertEquals("Database names do not match", databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName()); + assertNull("Provider should be null but was not", provider); + } @Test - void databaseNameOmitted() { + void createProviderWithoutDatabaseNameWithCollectionName(){ - } + MongoDbProvider provider = MongoDbProvider.newBuilder() + .setConnectionStringSource(this.validConnectionStringWithoutDatabase) + .setCollectionName(this.collectionName) + .build(); + + assertNull("Provider should be null but was not", provider); - @Test - void collectionNameProvided(){ } @Test - void collectionNameOmitted(){ + void createProviderWithoutCollectionName(){ - } + MongoDbProvider provider = MongoDbProvider.newBuilder() + .setConnectionStringSource(this.validConnectionStringWithoutDatabase) + .setDatabaseName(this.databaseName) + .build(); + + assertNull("Provider should be null but was not", provider); - @Test - void connectionStringValid(){ } @Test - void connectionStringEmpty() { + void createProviderWithDatabaseOnConnectionString(){ + MongoDbProvider provider = MongoDbProvider.newBuilder() + .setConnectionStringSource(this.validConnectionStringWithDatabase) + .setCollectionName(this.collectionName) + .build(); + + assertNotNull("Provider should be null but was not", provider); + assertEquals("Collection names do not match", this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); + assertEquals("Database names do not match", "logging", provider.getConnection().getCollection().getNamespace().getDatabaseName()); } @Test - void connectionStringInvalid(){ + void createProviderConfigOverridesConnectionString() { + + MongoDbProvider provider = MongoDbProvider.newBuilder() + .setConnectionStringSource(this.validConnectionStringWithDatabaseAndCollection) + .setCollectionName(this.collectionName) + .setDatabaseName(this.databaseName) + .build(); + + assertNotNull("Provider should not be null", provider); + assertEquals("Collection name does not match provided configuration", this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); + assertEquals("Database name does not match provided configuration", this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName()); } + + } \ No newline at end of file From 3bd99b7a514f28b2afa4c4bb5712ec4b5b02bd78 Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sun, 29 Dec 2024 09:58:37 -0600 Subject: [PATCH 06/10] Cleanup on documentation and updates to JUnit 5 from 4. Removed extraneous dependencies. --- log4j-mongodb/pom.xml | 6 ---- .../log4j/mongodb/MongoDbProvider.java | 4 +-- .../log4j/mongodb/MongoDbProviderTest.java | 31 +++++++++---------- .../ROOT/pages/manual/appenders/database.adoc | 9 +++--- 4 files changed, 21 insertions(+), 29 deletions(-) diff --git a/log4j-mongodb/pom.xml b/log4j-mongodb/pom.xml index ce0c72f14fd..dcac5e620ec 100644 --- a/log4j-mongodb/pom.xml +++ b/log4j-mongodb/pom.xml @@ -76,7 +76,6 @@ org.apache.logging.log4j log4j-api - 3.0.0-SNAPSHOT @@ -142,11 +141,6 @@ junit-jupiter-api test - - junit - junit - test - diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java index 44b79ef5d71..d18bd865405 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java @@ -77,7 +77,6 @@ public MongoDbProvider build() { // Validate the provided databaseName property try { MongoNamespace.checkDatabaseNameValidity(effectiveDatabaseName); - databaseName = effectiveDatabaseName; } catch (final IllegalArgumentException e) { LOGGER.error("Invalid MongoDB database name `{}`.", effectiveDatabaseName, e); return null; @@ -85,13 +84,12 @@ public MongoDbProvider build() { // Validate the provided collectionName property try { MongoNamespace.checkCollectionNameValidity(effectiveCollectionName); - collectionName = effectiveCollectionName; } catch (final IllegalArgumentException e) { LOGGER.error("Invalid MongoDB collection name `{}`.", effectiveCollectionName, e); return null; } - return new MongoDbProvider(connectionString, capped, collectionSize, databaseName, collectionName); + return new MongoDbProvider(connectionString, capped, collectionSize, effectiveDatabaseName, effectiveCollectionName); } public B setConnectionStringSource(final String connectionStringSource) { diff --git a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java index 3bcb294701c..e775c691fc8 100644 --- a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java +++ b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java @@ -2,15 +2,14 @@ import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; class MongoDbProviderTest { private String validConnectionStringWithoutDatabase = "mongodb://localhost:27017"; - private String invalidConnectionString = "test:test"; private String validConnectionStringWithDatabase = "mongodb://localhost:27017/logging"; private String validConnectionStringWithDatabaseAndCollection = "mongodb://localhost:27017/logging.logs"; @@ -29,9 +28,9 @@ void createProviderWithDatabaseAndCollectionProvidedViaConfig() { .setCollectionName(this.collectionName) .build(); - assertNotNull("Returned provider is null", provider); - assertEquals("Collection names do not match", this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); - assertEquals("Database names do not match", this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName()); + assertNotNull(provider, "Returned provider is null"); + assertEquals(this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName(), "Collection names do not match"); + assertEquals( this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName(), "Database names do not match"); } @@ -42,7 +41,7 @@ void createProviderWithoutDatabaseName() { .setConnectionStringSource(this.validConnectionStringWithoutDatabase) .build(); - assertNull("Provider should be null but was not", provider); + assertNull( provider, "Provider should be null but was not"); } @@ -55,7 +54,7 @@ void createProviderWithoutDatabaseNameWithCollectionName(){ .setCollectionName(this.collectionName) .build(); - assertNull("Provider should be null but was not", provider); + assertNull(provider,"Provider should be null but was not"); @@ -69,7 +68,7 @@ void createProviderWithoutCollectionName(){ .setDatabaseName(this.databaseName) .build(); - assertNull("Provider should be null but was not", provider); + assertNull(provider,"Provider should be null but was not"); } @@ -81,9 +80,9 @@ void createProviderWithDatabaseOnConnectionString(){ .setCollectionName(this.collectionName) .build(); - assertNotNull("Provider should be null but was not", provider); - assertEquals("Collection names do not match", this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); - assertEquals("Database names do not match", "logging", provider.getConnection().getCollection().getNamespace().getDatabaseName()); + assertNotNull(provider,"Provider should not be null"); + assertEquals(this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName(), "Provider should be null but was not"); + assertEquals( "logging", provider.getConnection().getCollection().getNamespace().getDatabaseName(),"Database names do not match"); } @@ -96,9 +95,9 @@ void createProviderConfigOverridesConnectionString() { .setDatabaseName(this.databaseName) .build(); - assertNotNull("Provider should not be null", provider); - assertEquals("Collection name does not match provided configuration", this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName()); - assertEquals("Database name does not match provided configuration", this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName()); + assertNotNull(provider,"Provider should not be null"); + assertEquals(this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName(), "Collection name does not match provided configuration"); + assertEquals(this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName(), "Database name does not match provided configuration"); } diff --git a/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc b/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc index 62b4ad35c2b..09503ec45a5 100644 --- a/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc +++ b/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc @@ -821,7 +821,7 @@ for its format. | 'string' | | -It specifies the name of the database for the logger to use. +It specifies the name of the database for the appender to use. Overrides the value provided in the connection string if present. @@ -831,9 +831,10 @@ Overrides the value provided in the connection string if present. | 'string' | | -It pecifies the name of the collection for the logger to use. - -Overrides the value provided in the connection string if present. +It specifies the name of the collection for the appender to use. +For backward compatibility, the collection name can also be specified in the +https://mongodb.github.io/mongo-java-driver/5.0/apidocs/mongodb-driver-core/com/mongodb/ConnectionString.html[Java-specific connection string] +If collection name is specified in both places, the value provided here will be used. **Required** From 73b96f23f6473bd7a4252769ddff564db3051edc Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sun, 29 Dec 2024 10:14:17 -0600 Subject: [PATCH 07/10] Updated example config files to use new configuration options --- log4j-mongodb/src/test/resources/MongoDbAdditionalFields.xml | 2 +- log4j-mongodb/src/test/resources/MongoDbAuthFailureIT.xml | 2 +- log4j-mongodb/src/test/resources/MongoDbCappedIntIT.xml | 4 +++- log4j-mongodb/src/test/resources/MongoDbCappedLongIT.xml | 4 +++- log4j-mongodb/src/test/resources/MongoDbIT.xml | 2 +- log4j-mongodb/src/test/resources/MongoDbMapMessageIT.xml | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/log4j-mongodb/src/test/resources/MongoDbAdditionalFields.xml b/log4j-mongodb/src/test/resources/MongoDbAdditionalFields.xml index 600296753eb..07047334424 100644 --- a/log4j-mongodb/src/test/resources/MongoDbAdditionalFields.xml +++ b/log4j-mongodb/src/test/resources/MongoDbAdditionalFields.xml @@ -22,7 +22,7 @@ https://logging.apache.org/xml/ns/log4j-config-3.xsd"> - + diff --git a/log4j-mongodb/src/test/resources/MongoDbAuthFailureIT.xml b/log4j-mongodb/src/test/resources/MongoDbAuthFailureIT.xml index 797dfb47ed7..03df1ab9f33 100644 --- a/log4j-mongodb/src/test/resources/MongoDbAuthFailureIT.xml +++ b/log4j-mongodb/src/test/resources/MongoDbAuthFailureIT.xml @@ -23,7 +23,7 @@ + connection="mongodb://log4jUser:12345678@localhost:${sys:log4j.mongo.port:-27017}" databaseName="testDb" collectionName="MongoDbAuthFailureIT" /> diff --git a/log4j-mongodb/src/test/resources/MongoDbCappedIntIT.xml b/log4j-mongodb/src/test/resources/MongoDbCappedIntIT.xml index f1574d396ae..645cac894a8 100644 --- a/log4j-mongodb/src/test/resources/MongoDbCappedIntIT.xml +++ b/log4j-mongodb/src/test/resources/MongoDbCappedIntIT.xml @@ -23,7 +23,9 @@ diff --git a/log4j-mongodb/src/test/resources/MongoDbCappedLongIT.xml b/log4j-mongodb/src/test/resources/MongoDbCappedLongIT.xml index 0ac524fdea7..16de25d2619 100644 --- a/log4j-mongodb/src/test/resources/MongoDbCappedLongIT.xml +++ b/log4j-mongodb/src/test/resources/MongoDbCappedLongIT.xml @@ -24,7 +24,9 @@ diff --git a/log4j-mongodb/src/test/resources/MongoDbIT.xml b/log4j-mongodb/src/test/resources/MongoDbIT.xml index df713f01795..2ed62df6fe7 100644 --- a/log4j-mongodb/src/test/resources/MongoDbIT.xml +++ b/log4j-mongodb/src/test/resources/MongoDbIT.xml @@ -22,7 +22,7 @@ https://logging.apache.org/xml/ns/log4j-config-3.xsd"> - + diff --git a/log4j-mongodb/src/test/resources/MongoDbMapMessageIT.xml b/log4j-mongodb/src/test/resources/MongoDbMapMessageIT.xml index 774fa4bfaed..64bb492a720 100644 --- a/log4j-mongodb/src/test/resources/MongoDbMapMessageIT.xml +++ b/log4j-mongodb/src/test/resources/MongoDbMapMessageIT.xml @@ -22,7 +22,7 @@ https://logging.apache.org/xml/ns/log4j-config-3.xsd"> - + From c1dd909d7c5238db1b7882a14cd836e5b3c3f7b2 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Sun, 29 Dec 2024 19:53:14 +0100 Subject: [PATCH 08/10] Update src/changelog/.3.x.x/update_org_log4j_mongodb.xml --- src/changelog/.3.x.x/update_org_log4j_mongodb.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/changelog/.3.x.x/update_org_log4j_mongodb.xml b/src/changelog/.3.x.x/update_org_log4j_mongodb.xml index cf632d89059..2f7c1f37760 100644 --- a/src/changelog/.3.x.x/update_org_log4j_mongodb.xml +++ b/src/changelog/.3.x.x/update_org_log4j_mongodb.xml @@ -2,7 +2,7 @@ - + type="added"> + Update log4j-mongodb to allow collectionName and databaseName to be defined via the config file From a6dcb4fa07daf0cd273f0714bb6576086ac48be2 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Sun, 29 Dec 2024 19:54:50 +0100 Subject: [PATCH 09/10] Formatting --- .../log4j/mongodb/MongoDbConnection.java | 11 +-- .../log4j/mongodb/MongoDbProvider.java | 12 ++- .../log4j/mongodb/MongoDbProviderTest.java | 84 +++++++++++-------- 3 files changed, 62 insertions(+), 45 deletions(-) diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java index ea8f52a23d4..2b53911088c 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java @@ -16,7 +16,6 @@ */ package org.apache.logging.log4j.mongodb; -import com.mongodb.ConnectionString; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; @@ -59,7 +58,6 @@ private static MongoCollection getOrCreateMongoCollection( } } - private final MongoCollection collection; private final MongoClient mongoClient; @@ -70,8 +68,7 @@ public MongoDbConnection( final boolean isCapped, final Long sizeInBytes) { this.mongoClient = mongoClient; - this.collection = - getOrCreateMongoCollection(mongoDatabase, collectionName, isCapped, sizeInBytes); + this.collection = getOrCreateMongoCollection(mongoDatabase, collectionName, isCapped, sizeInBytes); } @Override @@ -105,16 +102,14 @@ public void insertObject(final NoSqlObject object) { @Override public String toString() { - return String.format( - "Mongo4Connection [collection=%s, mongoClient=%s]", collection, mongoClient); + return String.format("Mongo4Connection [collection=%s, mongoClient=%s]", collection, mongoClient); } /* * This method is exposed to help support unit tests for the MongoDbProvider class. * */ - public MongoCollection getCollection(){ + public MongoCollection getCollection() { return this.collection; } - } diff --git a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java index d18bd865405..5b31d6f89ba 100644 --- a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java +++ b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java @@ -73,7 +73,7 @@ public MongoDbProvider build() { } String effectiveDatabaseName = databaseName != null ? databaseName : connectionString.getDatabase(); - String effectiveCollectionName = collectionName != null ? collectionName: connectionString.getCollection(); + String effectiveCollectionName = collectionName != null ? collectionName : connectionString.getCollection(); // Validate the provided databaseName property try { MongoNamespace.checkDatabaseNameValidity(effectiveDatabaseName); @@ -89,7 +89,8 @@ public MongoDbProvider build() { return null; } - return new MongoDbProvider(connectionString, capped, collectionSize, effectiveDatabaseName, effectiveCollectionName); + return new MongoDbProvider( + connectionString, capped, collectionSize, effectiveDatabaseName, effectiveCollectionName); } public B setConnectionStringSource(final String connectionStringSource) { @@ -142,7 +143,12 @@ public static > B newBuilder() { private final MongoDatabase mongoDatabase; private final ConnectionString connectionString; - private MongoDbProvider(final ConnectionString connectionString, final boolean isCapped, final Long collectionSize, final String databaseName, final String collectionName) { + private MongoDbProvider( + final ConnectionString connectionString, + final boolean isCapped, + final Long collectionSize, + final String databaseName, + final String collectionName) { LOGGER.debug("Created ConnectionString {}", connectionString); this.connectionString = connectionString; diff --git a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java index e775c691fc8..093c84dbecb 100644 --- a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java +++ b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbProviderTest.java @@ -1,11 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.logging.log4j.mongodb; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import org.junit.jupiter.api.Test; class MongoDbProviderTest { @@ -16,9 +31,6 @@ class MongoDbProviderTest { private String collectionName = "logsTest"; private String databaseName = "loggingTest"; - - - @Test void createProviderWithDatabaseAndCollectionProvidedViaConfig() { @@ -29,9 +41,14 @@ void createProviderWithDatabaseAndCollectionProvidedViaConfig() { .build(); assertNotNull(provider, "Returned provider is null"); - assertEquals(this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName(), "Collection names do not match"); - assertEquals( this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName(), "Database names do not match"); - + assertEquals( + this.collectionName, + provider.getConnection().getCollection().getNamespace().getCollectionName(), + "Collection names do not match"); + assertEquals( + this.databaseName, + provider.getConnection().getCollection().getNamespace().getDatabaseName(), + "Database names do not match"); } @Test @@ -41,49 +58,47 @@ void createProviderWithoutDatabaseName() { .setConnectionStringSource(this.validConnectionStringWithoutDatabase) .build(); - assertNull( provider, "Provider should be null but was not"); - - + assertNull(provider, "Provider should be null but was not"); } @Test - void createProviderWithoutDatabaseNameWithCollectionName(){ + void createProviderWithoutDatabaseNameWithCollectionName() { MongoDbProvider provider = MongoDbProvider.newBuilder() .setConnectionStringSource(this.validConnectionStringWithoutDatabase) .setCollectionName(this.collectionName) .build(); - assertNull(provider,"Provider should be null but was not"); - - - + assertNull(provider, "Provider should be null but was not"); } @Test - void createProviderWithoutCollectionName(){ + void createProviderWithoutCollectionName() { MongoDbProvider provider = MongoDbProvider.newBuilder() .setConnectionStringSource(this.validConnectionStringWithoutDatabase) .setDatabaseName(this.databaseName) .build(); - assertNull(provider,"Provider should be null but was not"); - - + assertNull(provider, "Provider should be null but was not"); } @Test - void createProviderWithDatabaseOnConnectionString(){ + void createProviderWithDatabaseOnConnectionString() { MongoDbProvider provider = MongoDbProvider.newBuilder() .setConnectionStringSource(this.validConnectionStringWithDatabase) .setCollectionName(this.collectionName) .build(); - assertNotNull(provider,"Provider should not be null"); - assertEquals(this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName(), "Provider should be null but was not"); - assertEquals( "logging", provider.getConnection().getCollection().getNamespace().getDatabaseName(),"Database names do not match"); - + assertNotNull(provider, "Provider should not be null"); + assertEquals( + this.collectionName, + provider.getConnection().getCollection().getNamespace().getCollectionName(), + "Provider should be null but was not"); + assertEquals( + "logging", + provider.getConnection().getCollection().getNamespace().getDatabaseName(), + "Database names do not match"); } @Test @@ -95,13 +110,14 @@ void createProviderConfigOverridesConnectionString() { .setDatabaseName(this.databaseName) .build(); - assertNotNull(provider,"Provider should not be null"); - assertEquals(this.collectionName, provider.getConnection().getCollection().getNamespace().getCollectionName(), "Collection name does not match provided configuration"); - assertEquals(this.databaseName, provider.getConnection().getCollection().getNamespace().getDatabaseName(), "Database name does not match provided configuration"); - + assertNotNull(provider, "Provider should not be null"); + assertEquals( + this.collectionName, + provider.getConnection().getCollection().getNamespace().getCollectionName(), + "Collection name does not match provided configuration"); + assertEquals( + this.databaseName, + provider.getConnection().getCollection().getNamespace().getDatabaseName(), + "Database name does not match provided configuration"); } - - - - -} \ No newline at end of file +} From bd66bc70a4a352a56333c1ee1d8eca891b2a4905 Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Tue, 11 Feb 2025 16:51:41 -0600 Subject: [PATCH 10/10] Fixed type in one of the IT tests that was causing it to fail --- log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml b/log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml index 2f2dcc3d7c9..ef84c991cae 100644 --- a/log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml +++ b/log4j-mongodb/src/test/resources/MongoDbCollectionNameIT.xml @@ -26,7 +26,7 @@ connection="mongodb://localhost:${sys:log4j.mongo.port:-27017}/testDb" capped="true" collectionSize="1073741824" - collectionName="MongoDBCollectionNameIT"/> + collectionName="MongoDbCollectionNameIT"/>