http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/CouchDbProvider.java
----------------------------------------------------------------------
diff --git 
a/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/CouchDbProvider.java
 
b/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/CouchDbProvider.java
deleted file mode 100644
index cdae592..0000000
--- 
a/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/CouchDbProvider.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * 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.nosql.appender.couchdb;
-
-import java.lang.reflect.Method;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
-import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
-import org.apache.logging.log4j.core.util.NameUtil;
-import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.Strings;
-import org.lightcouch.CouchDbClient;
-import org.lightcouch.CouchDbProperties;
-
-/**
- * The Apache CouchDB implementation of {@link NoSqlProvider}.
- */
-@Plugin(name = "CouchDB", category = "Core", printObject = true)
-public final class CouchDbProvider implements NoSqlProvider<CouchDbConnection> 
{
-    private static final int HTTP = 80;
-    private static final int HTTPS = 443;
-    private static final Logger LOGGER = StatusLogger.getLogger();
-
-    private final CouchDbClient client;
-    private final String description;
-
-    private CouchDbProvider(final CouchDbClient client, final String 
description) {
-        this.client = client;
-        this.description = "couchDb{ " + description + " }";
-    }
-
-    @Override
-    public CouchDbConnection getConnection() {
-        return new CouchDbConnection(this.client);
-    }
-
-    @Override
-    public String toString() {
-        return this.description;
-    }
-
-    /**
-     * Factory method for creating an Apache CouchDB provider within the 
plugin manager.
-     *
-     * @param databaseName The name of the database to which log event 
documents will be written.
-     * @param protocol Either "http" or "https," defaults to "http" and 
mutually exclusive with
-     *                 {@code factoryClassName&factoryMethodName!=null}.
-     * @param server The host name of the CouchDB server, defaults to 
localhost and mutually exclusive with
-     *               {@code factoryClassName&factoryMethodName!=null}.
-     * @param port The port that CouchDB is listening on, defaults to 80 if 
{@code protocol} is "http" and 443 if
-     *             {@code protocol} is "https," and mutually exclusive with
-     *             {@code factoryClassName&factoryMethodName!=null}.
-     * @param username The username to authenticate against the MongoDB server 
with, mutually exclusive with
-     *                 {@code factoryClassName&factoryMethodName!=null}.
-     * @param password The password to authenticate against the MongoDB server 
with, mutually exclusive with
-     *                 {@code factoryClassName&factoryMethodName!=null}.
-     * @param factoryClassName A fully qualified class name containing a 
static factory method capable of returning a
-     *                         {@link CouchDbClient} or {@link 
CouchDbProperties}.
-     * @param factoryMethodName The name of the public static factory method 
belonging to the aforementioned factory
-     *                          class.
-     * @return a new Apache CouchDB provider.
-     */
-    @PluginFactory
-    public static CouchDbProvider createNoSqlProvider(
-            @PluginAttribute("databaseName") final String databaseName,
-            @PluginAttribute("protocol") String protocol,
-            @PluginAttribute(value = "server", defaultString = "localhost") 
@ValidHost final String server,
-            @PluginAttribute(value = "port", defaultString = "0") @ValidPort 
final String port,
-            @PluginAttribute("username") final String username,
-            @PluginAttribute(value = "password", sensitive = true) final 
String password,
-            @PluginAttribute("factoryClassName") final String factoryClassName,
-            @PluginAttribute("factoryMethodName") final String 
factoryMethodName) {
-        CouchDbClient client;
-        String description;
-        if (Strings.isNotEmpty(factoryClassName) && 
Strings.isNotEmpty(factoryMethodName)) {
-            try {
-                final Class<?> factoryClass = 
LoaderUtil.loadClass(factoryClassName);
-                final Method method = 
factoryClass.getMethod(factoryMethodName);
-                final Object object = method.invoke(null);
-
-                if (object instanceof CouchDbClient) {
-                    client = (CouchDbClient) object;
-                    description = "uri=" + client.getDBUri();
-                } else if (object instanceof CouchDbProperties) {
-                    final CouchDbProperties properties = (CouchDbProperties) 
object;
-                    client = new CouchDbClient(properties);
-                    description = "uri=" + client.getDBUri() + ", username=" + 
properties.getUsername()
-                            + ", passwordHash=" + NameUtil.md5(password + 
CouchDbProvider.class.getName())
-                            + ", maxConnections=" + 
properties.getMaxConnections() + ", connectionTimeout="
-                            + properties.getConnectionTimeout() + ", 
socketTimeout=" + properties.getSocketTimeout();
-                } else if (object == null) {
-                    LOGGER.error("The factory method [{}.{}()] returned 
null.", factoryClassName, factoryMethodName);
-                    return null;
-                } else {
-                    LOGGER.error("The factory method [{}.{}()] returned an 
unsupported type [{}].", factoryClassName,
-                            factoryMethodName, object.getClass().getName());
-                    return null;
-                }
-            } catch (final ClassNotFoundException e) {
-                LOGGER.error("The factory class [{}] could not be loaded.", 
factoryClassName, e);
-                return null;
-            } catch (final NoSuchMethodException e) {
-                LOGGER.error("The factory class [{}] does not have a no-arg 
method named [{}].", factoryClassName,
-                        factoryMethodName, e);
-                return null;
-            } catch (final Exception e) {
-                LOGGER.error("The factory method [{}.{}()] could not be 
invoked.", factoryClassName, factoryMethodName,
-                        e);
-                return null;
-            }
-        } else if (Strings.isNotEmpty(databaseName)) {
-            if (protocol != null && protocol.length() > 0) {
-                protocol = protocol.toLowerCase();
-                if (!protocol.equals("http") && !protocol.equals("https")) {
-                    LOGGER.error("Only protocols [http] and [https] are 
supported, [{}] specified.", protocol);
-                    return null;
-                }
-            } else {
-                protocol = "http";
-                LOGGER.warn("No protocol specified, using default port 
[http].");
-            }
-
-            final int portInt = TypeConverters.convert(port, int.class, 
protocol.equals("https") ? HTTPS : HTTP);
-
-            if (Strings.isEmpty(username) || Strings.isEmpty(password)) {
-                LOGGER.error("You must provide a username and password for the 
CouchDB provider.");
-                return null;
-            }
-
-            client = new CouchDbClient(databaseName, false, protocol, server, 
portInt, username, password);
-            description = "uri=" + client.getDBUri() + ", username=" + 
username + ", passwordHash="
-                    + NameUtil.md5(password + CouchDbProvider.class.getName());
-        } else {
-            LOGGER.error("No factory method was provided so the database name 
is required.");
-            return null;
-        }
-
-        return new CouchDbProvider(client, description);
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/package-info.java
----------------------------------------------------------------------
diff --git 
a/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/package-info.java
 
b/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/package-info.java
deleted file mode 100644
index b783f87..0000000
--- 
a/log4j-couchdb/src/main/java/org/apache/logging/log4j/nosql/appender/couchdb/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.
- */
-/**
- * The classes in this package contain the Apache CouchDB provider for the 
NoSQL Appender.
- */
-package org.apache.logging.log4j.nosql.appender.couchdb;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..4ad0671
--- /dev/null
+++ 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbConnection.java
@@ -0,0 +1,96 @@
+/*
+ * 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.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.appender.AppenderLoggingException;
+import org.apache.logging.log4j.core.appender.nosql.AbstractNoSqlConnection;
+import org.apache.logging.log4j.core.appender.nosql.NoSqlConnection;
+import org.apache.logging.log4j.core.appender.nosql.NoSqlObject;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.bson.BSON;
+import org.bson.Transformer;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.MongoException;
+import com.mongodb.WriteConcern;
+
+/**
+ * The MongoDB implementation of {@link NoSqlConnection}.
+ */
+public final class MongoDbConnection extends 
AbstractNoSqlConnection<BasicDBObject, MongoDbObject> {
+
+    private static final Logger LOGGER = StatusLogger.getLogger();
+
+    static {
+        BSON.addEncodingHook(Level.class, new Transformer() {
+            @Override
+            public Object transform(final Object o) {
+                if (o instanceof Level) {
+                    return ((Level) o).name();
+                }
+                return o;
+            }
+        });
+    }
+
+    private final DBCollection collection;
+    private final WriteConcern writeConcern;
+
+    public MongoDbConnection(final DB database, final WriteConcern 
writeConcern, final String collectionName,
+            final Boolean isCapped, final Integer collectionSize) {
+        if (database.collectionExists(collectionName)) {
+            collection = database.getCollection(collectionName);
+        } else {
+            final BasicDBObject options = new BasicDBObject();
+            options.put("capped", isCapped);
+            options.put("size", collectionSize);
+            this.collection = database.createCollection(collectionName, 
options);
+        }
+        this.writeConcern = writeConcern;
+    }
+
+    @Override
+    public MongoDbObject createObject() {
+        return new MongoDbObject();
+    }
+
+    @Override
+    public MongoDbObject[] createList(final int length) {
+        return new MongoDbObject[length];
+    }
+
+    @Override
+    public void insertObject(final NoSqlObject<BasicDBObject> object) {
+        try {
+            this.collection.insert(object.unwrap(), this.writeConcern);
+        } catch (final MongoException e) {
+            throw new AppenderLoggingException("Failed to write log event to 
MongoDB due to error: " + e.getMessage(),
+                    e);
+        }
+    }
+
+    @Override
+    public void closeImpl() {
+        // LOG4J2-1196
+        this.collection.getDB().getMongo().close();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbObject.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbObject.java
 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbObject.java
new file mode 100644
index 0000000..541d941
--- /dev/null
+++ 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbObject.java
@@ -0,0 +1,66 @@
+/*
+ * 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 java.util.Collections;
+
+import org.apache.logging.log4j.core.appender.nosql.NoSqlObject;
+
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+
+/**
+ * The MongoDB implementation of {@link NoSqlObject}.
+ */
+public final class MongoDbObject implements NoSqlObject<BasicDBObject> {
+    private final BasicDBObject mongoObject;
+
+    public MongoDbObject() {
+        this.mongoObject = new BasicDBObject();
+    }
+
+    @Override
+    public void set(final String field, final Object value) {
+        this.mongoObject.append(field, value);
+    }
+
+    @Override
+    public void set(final String field, final NoSqlObject<BasicDBObject> 
value) {
+        this.mongoObject.append(field, value.unwrap());
+    }
+
+    @Override
+    public void set(final String field, final Object[] values) {
+        final BasicDBList list = new BasicDBList();
+        Collections.addAll(list, values);
+        this.mongoObject.append(field, list);
+    }
+
+    @Override
+    public void set(final String field, final NoSqlObject<BasicDBObject>[] 
values) {
+        final BasicDBList list = new BasicDBList();
+        for (final NoSqlObject<BasicDBObject> value : values) {
+            list.add(value.unwrap());
+        }
+        this.mongoObject.append(field, list);
+    }
+
+    @Override
+    public BasicDBObject unwrap() {
+        return this.mongoObject;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..f7077b3
--- /dev/null
+++ 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/MongoDbProvider.java
@@ -0,0 +1,351 @@
+/*
+ * 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 java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.Core;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
+import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
+import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
+import org.apache.logging.log4j.core.filter.AbstractFilterable;
+import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util.Strings;
+
+import com.mongodb.DB;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoCredential;
+import com.mongodb.ServerAddress;
+import com.mongodb.WriteConcern;
+
+/**
+ * The MongoDB implementation of {@link NoSqlProvider}.
+ */
+@Plugin(name = "MongoDb", category = Core.CATEGORY_NAME, printObject = true)
+public final class MongoDbProvider implements NoSqlProvider<MongoDbConnection> 
{
+
+    private static final WriteConcern DEFAULT_WRITE_CONCERN = 
WriteConcern.ACKNOWLEDGED;
+    private static final Logger LOGGER = StatusLogger.getLogger();
+    private static final int DEFAULT_PORT = 27017;
+    private static final int DEFAULT_COLLECTION_SIZE = 536870912;
+
+    private final String collectionName;
+    private final DB database;
+    private final String description;
+    private final WriteConcern writeConcern;
+    private final boolean isCapped;
+    private final Integer collectionSize;
+
+    private MongoDbProvider(final DB database, final WriteConcern 
writeConcern, final String collectionName,
+            final boolean isCapped, final Integer collectionSize, final String 
description) {
+        this.database = database;
+        this.writeConcern = writeConcern;
+        this.collectionName = collectionName;
+        this.isCapped = isCapped;
+        this.collectionSize = collectionSize;
+        this.description = "mongoDb{ " + description + " }";
+    }
+
+    @Override
+    public MongoDbConnection getConnection() {
+        return new MongoDbConnection(this.database, this.writeConcern, 
this.collectionName, this.isCapped, this.collectionSize);
+    }
+
+    @Override
+    public String toString() {
+        return this.description;
+    }
+
+    /**
+     * Factory method for creating a MongoDB provider within the plugin 
manager.
+     *
+     * @param collectionName The name of the MongoDB collection to which log 
events should be written.
+     * @param writeConcernConstant The {@link WriteConcern} constant to 
control writing details, defaults to
+     *                             {@link WriteConcern#ACKNOWLEDGED}.
+     * @param writeConcernConstantClassName The name of a class containing the 
aforementioned static WriteConcern
+     *                                      constant. Defaults to {@link 
WriteConcern}.
+     * @param databaseName The name of the MongoDB database containing the 
collection to which log events should be
+     *                     written. Mutually exclusive with {@code 
factoryClassName&factoryMethodName!=null}.
+     * @param server The host name of the MongoDB server, defaults to 
localhost and mutually exclusive with
+     *               {@code factoryClassName&factoryMethodName!=null}.
+     * @param port The port the MongoDB server is listening on, defaults to 
the default MongoDB port and mutually
+     *             exclusive with {@code 
factoryClassName&factoryMethodName!=null}.
+     * @param userName The username to authenticate against the MongoDB server 
with.
+     * @param password The password to authenticate against the MongoDB server 
with.
+     * @param factoryClassName A fully qualified class name containing a 
static factory method capable of returning a
+     *                         {@link DB} or a {@link MongoClient}.
+     * @param factoryMethodName The name of the public static factory method 
belonging to the aforementioned factory
+     *                          class.
+     * @return a new MongoDB provider.
+     * @deprecated in 2.8; use {@link #newBuilder()} instead.
+     */
+    @PluginFactory
+    public static MongoDbProvider createNoSqlProvider(
+            final String collectionName,
+            final String writeConcernConstant,
+            final String writeConcernConstantClassName,
+            final String databaseName,
+            final String server,
+            final String port,
+            final String userName,
+            final String password,
+            final String factoryClassName,
+                       final String factoryMethodName) {
+       LOGGER.info("createNoSqlProvider");
+               return 
newBuilder().setCollectionName(collectionName).setWriteConcernConstant(writeConcernConstantClassName)
+                               
.setWriteConcernConstant(writeConcernConstant).setDatabaseName(databaseName).setServer(server)
+                               
.setPort(port).setUserName(userName).setPassword(password).setFactoryClassName(factoryClassName)
+                               
.setFactoryMethodName(factoryMethodName).build();
+       }
+
+       @PluginBuilderFactory
+       public static <B extends Builder<B>> B newBuilder() {
+               return new Builder<B>().asBuilder();
+       }
+
+       public static class Builder<B extends Builder<B>> extends 
AbstractFilterable.Builder<B>
+                       implements 
org.apache.logging.log4j.core.util.Builder<MongoDbProvider> {
+
+               @PluginBuilderAttribute
+               @ValidHost
+               private String server = "localhost";
+
+               @PluginBuilderAttribute
+               @ValidPort
+               private String port = "" + DEFAULT_PORT;
+
+               @PluginBuilderAttribute
+               @Required(message = "No database name provided")
+               private String databaseName;
+
+               @PluginBuilderAttribute
+               @Required(message = "No collection name provided")
+               private String collectionName;
+
+               @PluginBuilderAttribute
+               private String userName;
+
+               @PluginBuilderAttribute(sensitive = true)
+               private String password;
+
+               @PluginBuilderAttribute("capped")
+               private boolean isCapped = false;
+
+               @PluginBuilderAttribute
+               private int collectionSize = DEFAULT_COLLECTION_SIZE;
+
+               @PluginBuilderAttribute
+               private String factoryClassName;
+
+               @PluginBuilderAttribute
+               private String factoryMethodName;
+
+               @PluginBuilderAttribute
+               private String writeConcernConstantClassName;
+
+               @PluginBuilderAttribute
+               private String writeConcernConstant;
+
+               public B setServer(final String server) {
+                       this.server = server;
+                       return asBuilder();
+               }
+
+               public B setPort(final String port) {
+                       this.port = port;
+                       return asBuilder();
+               }
+
+               public B setDatabaseName(final String databaseName) {
+                       this.databaseName = databaseName;
+                       return asBuilder();
+               }
+
+               public B setCollectionName(final String collectionName) {
+                       this.collectionName = collectionName;
+                       return asBuilder();
+               }
+
+               public B setUserName(final String userName) {
+                       this.userName = userName;
+                       return asBuilder();
+               }
+
+               public B setPassword(final String password) {
+                       this.password = password;
+                       return asBuilder();
+               }
+
+               public B setCapped(final boolean isCapped) {
+                       this.isCapped = isCapped;
+                       return asBuilder();
+               }
+
+               public B setCollectionSize(final int collectionSize) {
+                       this.collectionSize = collectionSize;
+                       return asBuilder();
+               }
+
+               public B setFactoryClassName(final String factoryClassName) {
+                       this.factoryClassName = factoryClassName;
+                       return asBuilder();
+               }
+
+               public B setFactoryMethodName(final String factoryMethodName) {
+                       this.factoryMethodName = factoryMethodName;
+                       return asBuilder();
+               }
+
+               public B setWriteConcernConstantClassName(final String 
writeConcernConstantClassName) {
+                       this.writeConcernConstantClassName = 
writeConcernConstantClassName;
+                       return asBuilder();
+               }
+
+               public B setWriteConcernConstant(final String 
writeConcernConstant) {
+                       this.writeConcernConstant = writeConcernConstant;
+                       return asBuilder();
+               }
+        
+               @Override
+               public MongoDbProvider build() {
+               DB database;
+               String description;
+               if (Strings.isNotEmpty(factoryClassName) && 
Strings.isNotEmpty(factoryMethodName)) {
+                   try {
+                       final Class<?> factoryClass = 
LoaderUtil.loadClass(factoryClassName);
+                       final Method method = 
factoryClass.getMethod(factoryMethodName);
+                       final Object object = method.invoke(null);
+
+                       if (object instanceof DB) {
+                           database = (DB) object;
+                       } else if (object instanceof MongoClient) {
+                           if (Strings.isNotEmpty(databaseName)) {
+                               database = ((MongoClient) 
object).getDB(databaseName);
+                           } else {
+                               LOGGER.error("The factory method [{}.{}()] 
returned a MongoClient so the database name is "
+                                       + "required.", factoryClassName, 
factoryMethodName);
+                               return null;
+                           }
+                       } else if (object == null) {
+                           LOGGER.error("The factory method [{}.{}()] returned 
null.", factoryClassName, factoryMethodName);
+                           return null;
+                       } else {
+                           LOGGER.error("The factory method [{}.{}()] returned 
an unsupported type [{}].", factoryClassName,
+                                   factoryMethodName, 
object.getClass().getName());
+                           return null;
+                       }
+
+                       description = "database=" + database.getName();
+                       final List<ServerAddress> addresses = 
database.getMongo().getAllAddress();
+                       if (addresses.size() == 1) {
+                           description += ", server=" + 
addresses.get(0).getHost() + ", port=" + addresses.get(0).getPort();
+                       } else {
+                           description += ", servers=[";
+                           for (final ServerAddress address : addresses) {
+                               description += " { " + address.getHost() + ", " 
+ address.getPort() + " } ";
+                           }
+                           description += "]";
+                       }
+                   } catch (final ClassNotFoundException e) {
+                       LOGGER.error("The factory class [{}] could not be 
loaded.", factoryClassName, e);
+                       return null;
+                   } catch (final NoSuchMethodException e) {
+                       LOGGER.error("The factory class [{}] does not have a 
no-arg method named [{}].", factoryClassName,
+                               factoryMethodName, e);
+                       return null;
+                   } catch (final Exception e) {
+                       LOGGER.error("The factory method [{}.{}()] could not be 
invoked.", factoryClassName, factoryMethodName,
+                               e);
+                       return null;
+                   }
+               } else if (Strings.isNotEmpty(databaseName)) {
+                   final List<MongoCredential> credentials = new ArrayList<>();
+                   description = "database=" + databaseName;
+                   if (Strings.isNotEmpty(userName) && 
Strings.isNotEmpty(password)) {
+                       description += ", username=" + userName + ", 
passwordHash="
+                               + NameUtil.md5(password + 
MongoDbProvider.class.getName());
+                       
credentials.add(MongoCredential.createCredential(userName, databaseName, 
password.toCharArray()));
+                   }
+                   try {
+                       final int portInt = TypeConverters.convert(port, 
int.class, DEFAULT_PORT);
+                       description += ", server=" + server + ", port=" + 
portInt;
+                       database = new MongoClient(new ServerAddress(server, 
portInt), credentials).getDB(databaseName);
+                   } catch (final Exception e) {
+                       LOGGER.error(
+                               "Failed to obtain a database instance from the 
MongoClient at server [{}] and " + "port [{}].",
+                               server, port);
+                       return null;
+                   }
+               } else {
+                   LOGGER.error("No factory method was provided so the 
database name is required.");
+                   return null;
+               }
+
+               try {
+                   database.getCollectionNames(); // Check if the database 
actually requires authentication
+               } catch (final Exception e) {
+                   LOGGER.error(
+                           "The database is not up, or you are not 
authenticated, try supplying a username and password to the MongoDB provider.",
+                           e);
+                   return null;
+               }
+
+               final WriteConcern writeConcern = 
toWriteConcern(writeConcernConstant, writeConcernConstantClassName);
+
+               return new MongoDbProvider(database, writeConcern, 
collectionName, isCapped, collectionSize, description);
+               }
+
+           private static WriteConcern toWriteConcern(final String 
writeConcernConstant,
+                   final String writeConcernConstantClassName) {
+               WriteConcern writeConcern;
+               if (Strings.isNotEmpty(writeConcernConstant)) {
+                   if (Strings.isNotEmpty(writeConcernConstantClassName)) {
+                       try {
+                           final Class<?> writeConcernConstantClass = 
LoaderUtil.loadClass(writeConcernConstantClassName);
+                           final Field field = 
writeConcernConstantClass.getField(writeConcernConstant);
+                           writeConcern = (WriteConcern) field.get(null);
+                       } catch (final Exception e) {
+                           LOGGER.error("Write concern constant [{}.{}] not 
found, using default.",
+                                   writeConcernConstantClassName, 
writeConcernConstant);
+                           writeConcern = DEFAULT_WRITE_CONCERN;
+                       }
+                   } else {
+                       writeConcern = 
WriteConcern.valueOf(writeConcernConstant);
+                       if (writeConcern == null) {
+                           LOGGER.warn("Write concern constant [{}] not found, 
using default.", writeConcernConstant);
+                           writeConcern = DEFAULT_WRITE_CONCERN;
+                       }
+                   }
+               } else {
+                   writeConcern = DEFAULT_WRITE_CONCERN;
+               }
+               return writeConcern;
+           }
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/package-info.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/package-info.java
 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/package-info.java
new file mode 100644
index 0000000..f944511
--- /dev/null
+++ 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/mongodb/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+/**
+ * The classes in this package contain the MongoDB provider for the NoSQL 
Appender.
+ */
+package org.apache.logging.log4j.mongodb;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbConnection.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbConnection.java
 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbConnection.java
deleted file mode 100644
index 66e205d..0000000
--- 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbConnection.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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.nosql.appender.mongodb;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.appender.AppenderLoggingException;
-import org.apache.logging.log4j.core.appender.nosql.AbstractNoSqlConnection;
-import org.apache.logging.log4j.core.appender.nosql.NoSqlConnection;
-import org.apache.logging.log4j.core.appender.nosql.NoSqlObject;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.bson.BSON;
-import org.bson.Transformer;
-
-import com.mongodb.BasicDBObject;
-import com.mongodb.DB;
-import com.mongodb.DBCollection;
-import com.mongodb.MongoException;
-import com.mongodb.WriteConcern;
-
-/**
- * The MongoDB implementation of {@link NoSqlConnection}.
- */
-public final class MongoDbConnection extends 
AbstractNoSqlConnection<BasicDBObject, MongoDbObject> {
-
-    private static final Logger LOGGER = StatusLogger.getLogger();
-
-    static {
-        BSON.addEncodingHook(Level.class, new Transformer() {
-            @Override
-            public Object transform(final Object o) {
-                if (o instanceof Level) {
-                    return ((Level) o).name();
-                }
-                return o;
-            }
-        });
-    }
-
-    private final DBCollection collection;
-    private final WriteConcern writeConcern;
-
-    public MongoDbConnection(final DB database, final WriteConcern 
writeConcern, final String collectionName,
-            final Boolean isCapped, final Integer collectionSize) {
-        if (database.collectionExists(collectionName)) {
-            collection = database.getCollection(collectionName);
-        } else {
-            final BasicDBObject options = new BasicDBObject();
-            options.put("capped", isCapped);
-            options.put("size", collectionSize);
-            this.collection = database.createCollection(collectionName, 
options);
-        }
-        this.writeConcern = writeConcern;
-    }
-
-    @Override
-    public MongoDbObject createObject() {
-        return new MongoDbObject();
-    }
-
-    @Override
-    public MongoDbObject[] createList(final int length) {
-        return new MongoDbObject[length];
-    }
-
-    @Override
-    public void insertObject(final NoSqlObject<BasicDBObject> object) {
-        try {
-            this.collection.insert(object.unwrap(), this.writeConcern);
-        } catch (final MongoException e) {
-            throw new AppenderLoggingException("Failed to write log event to 
MongoDB due to error: " + e.getMessage(),
-                    e);
-        }
-    }
-
-    @Override
-    public void closeImpl() {
-        // LOG4J2-1196
-        this.collection.getDB().getMongo().close();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbObject.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbObject.java
 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbObject.java
deleted file mode 100644
index 8eb6e46..0000000
--- 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbObject.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.nosql.appender.mongodb;
-
-import java.util.Collections;
-
-import org.apache.logging.log4j.core.appender.nosql.NoSqlObject;
-
-import com.mongodb.BasicDBList;
-import com.mongodb.BasicDBObject;
-
-/**
- * The MongoDB implementation of {@link NoSqlObject}.
- */
-public final class MongoDbObject implements NoSqlObject<BasicDBObject> {
-    private final BasicDBObject mongoObject;
-
-    public MongoDbObject() {
-        this.mongoObject = new BasicDBObject();
-    }
-
-    @Override
-    public void set(final String field, final Object value) {
-        this.mongoObject.append(field, value);
-    }
-
-    @Override
-    public void set(final String field, final NoSqlObject<BasicDBObject> 
value) {
-        this.mongoObject.append(field, value.unwrap());
-    }
-
-    @Override
-    public void set(final String field, final Object[] values) {
-        final BasicDBList list = new BasicDBList();
-        Collections.addAll(list, values);
-        this.mongoObject.append(field, list);
-    }
-
-    @Override
-    public void set(final String field, final NoSqlObject<BasicDBObject>[] 
values) {
-        final BasicDBList list = new BasicDBList();
-        for (final NoSqlObject<BasicDBObject> value : values) {
-            list.add(value.unwrap());
-        }
-        this.mongoObject.append(field, list);
-    }
-
-    @Override
-    public BasicDBObject unwrap() {
-        return this.mongoObject;
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbProvider.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbProvider.java
 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbProvider.java
deleted file mode 100644
index 5167c3e..0000000
--- 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbProvider.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * 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.nosql.appender.mongodb;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
-import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
-import org.apache.logging.log4j.core.filter.AbstractFilterable;
-import org.apache.logging.log4j.core.util.NameUtil;
-import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.Strings;
-
-import com.mongodb.DB;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoCredential;
-import com.mongodb.ServerAddress;
-import com.mongodb.WriteConcern;
-
-/**
- * The MongoDB implementation of {@link NoSqlProvider}.
- */
-@Plugin(name = "MongoDb", category = Core.CATEGORY_NAME, printObject = true)
-public final class MongoDbProvider implements NoSqlProvider<MongoDbConnection> 
{
-
-    private static final WriteConcern DEFAULT_WRITE_CONCERN = 
WriteConcern.ACKNOWLEDGED;
-    private static final Logger LOGGER = StatusLogger.getLogger();
-    private static final int DEFAULT_PORT = 27017;
-    private static final int DEFAULT_COLLECTION_SIZE = 536870912;
-
-    private final String collectionName;
-    private final DB database;
-    private final String description;
-    private final WriteConcern writeConcern;
-    private final boolean isCapped;
-    private final Integer collectionSize;
-
-    private MongoDbProvider(final DB database, final WriteConcern 
writeConcern, final String collectionName,
-            final boolean isCapped, final Integer collectionSize, final String 
description) {
-        this.database = database;
-        this.writeConcern = writeConcern;
-        this.collectionName = collectionName;
-        this.isCapped = isCapped;
-        this.collectionSize = collectionSize;
-        this.description = "mongoDb{ " + description + " }";
-    }
-
-    @Override
-    public MongoDbConnection getConnection() {
-        return new MongoDbConnection(this.database, this.writeConcern, 
this.collectionName, this.isCapped, this.collectionSize);
-    }
-
-    @Override
-    public String toString() {
-        return this.description;
-    }
-
-    /**
-     * Factory method for creating a MongoDB provider within the plugin 
manager.
-     *
-     * @param collectionName The name of the MongoDB collection to which log 
events should be written.
-     * @param writeConcernConstant The {@link WriteConcern} constant to 
control writing details, defaults to
-     *                             {@link WriteConcern#ACKNOWLEDGED}.
-     * @param writeConcernConstantClassName The name of a class containing the 
aforementioned static WriteConcern
-     *                                      constant. Defaults to {@link 
WriteConcern}.
-     * @param databaseName The name of the MongoDB database containing the 
collection to which log events should be
-     *                     written. Mutually exclusive with {@code 
factoryClassName&factoryMethodName!=null}.
-     * @param server The host name of the MongoDB server, defaults to 
localhost and mutually exclusive with
-     *               {@code factoryClassName&factoryMethodName!=null}.
-     * @param port The port the MongoDB server is listening on, defaults to 
the default MongoDB port and mutually
-     *             exclusive with {@code 
factoryClassName&factoryMethodName!=null}.
-     * @param userName The username to authenticate against the MongoDB server 
with.
-     * @param password The password to authenticate against the MongoDB server 
with.
-     * @param factoryClassName A fully qualified class name containing a 
static factory method capable of returning a
-     *                         {@link DB} or a {@link MongoClient}.
-     * @param factoryMethodName The name of the public static factory method 
belonging to the aforementioned factory
-     *                          class.
-     * @return a new MongoDB provider.
-     * @deprecated in 2.8; use {@link #newBuilder()} instead.
-     */
-    @PluginFactory
-    public static MongoDbProvider createNoSqlProvider(
-            final String collectionName,
-            final String writeConcernConstant,
-            final String writeConcernConstantClassName,
-            final String databaseName,
-            final String server,
-            final String port,
-            final String userName,
-            final String password,
-            final String factoryClassName,
-                       final String factoryMethodName) {
-       LOGGER.info("createNoSqlProvider");
-               return 
newBuilder().setCollectionName(collectionName).setWriteConcernConstant(writeConcernConstantClassName)
-                               
.setWriteConcernConstant(writeConcernConstant).setDatabaseName(databaseName).setServer(server)
-                               
.setPort(port).setUserName(userName).setPassword(password).setFactoryClassName(factoryClassName)
-                               
.setFactoryMethodName(factoryMethodName).build();
-       }
-
-       @PluginBuilderFactory
-       public static <B extends Builder<B>> B newBuilder() {
-               return new Builder<B>().asBuilder();
-       }
-
-       public static class Builder<B extends Builder<B>> extends 
AbstractFilterable.Builder<B>
-                       implements 
org.apache.logging.log4j.core.util.Builder<MongoDbProvider> {
-
-               @PluginBuilderAttribute
-               @ValidHost
-               private String server = "localhost";
-
-               @PluginBuilderAttribute
-               @ValidPort
-               private String port = "" + DEFAULT_PORT;
-
-               @PluginBuilderAttribute
-               @Required(message = "No database name provided")
-               private String databaseName;
-
-               @PluginBuilderAttribute
-               @Required(message = "No collection name provided")
-               private String collectionName;
-
-               @PluginBuilderAttribute
-               private String userName;
-
-               @PluginBuilderAttribute(sensitive = true)
-               private String password;
-
-               @PluginBuilderAttribute("capped")
-               private boolean isCapped = false;
-
-               @PluginBuilderAttribute
-               private int collectionSize = DEFAULT_COLLECTION_SIZE;
-
-               @PluginBuilderAttribute
-               private String factoryClassName;
-
-               @PluginBuilderAttribute
-               private String factoryMethodName;
-
-               @PluginBuilderAttribute
-               private String writeConcernConstantClassName;
-
-               @PluginBuilderAttribute
-               private String writeConcernConstant;
-
-               public B setServer(final String server) {
-                       this.server = server;
-                       return asBuilder();
-               }
-
-               public B setPort(final String port) {
-                       this.port = port;
-                       return asBuilder();
-               }
-
-               public B setDatabaseName(final String databaseName) {
-                       this.databaseName = databaseName;
-                       return asBuilder();
-               }
-
-               public B setCollectionName(final String collectionName) {
-                       this.collectionName = collectionName;
-                       return asBuilder();
-               }
-
-               public B setUserName(final String userName) {
-                       this.userName = userName;
-                       return asBuilder();
-               }
-
-               public B setPassword(final String password) {
-                       this.password = password;
-                       return asBuilder();
-               }
-
-               public B setCapped(final boolean isCapped) {
-                       this.isCapped = isCapped;
-                       return asBuilder();
-               }
-
-               public B setCollectionSize(final int collectionSize) {
-                       this.collectionSize = collectionSize;
-                       return asBuilder();
-               }
-
-               public B setFactoryClassName(final String factoryClassName) {
-                       this.factoryClassName = factoryClassName;
-                       return asBuilder();
-               }
-
-               public B setFactoryMethodName(final String factoryMethodName) {
-                       this.factoryMethodName = factoryMethodName;
-                       return asBuilder();
-               }
-
-               public B setWriteConcernConstantClassName(final String 
writeConcernConstantClassName) {
-                       this.writeConcernConstantClassName = 
writeConcernConstantClassName;
-                       return asBuilder();
-               }
-
-               public B setWriteConcernConstant(final String 
writeConcernConstant) {
-                       this.writeConcernConstant = writeConcernConstant;
-                       return asBuilder();
-               }
-        
-               @Override
-               public MongoDbProvider build() {
-               DB database;
-               String description;
-               if (Strings.isNotEmpty(factoryClassName) && 
Strings.isNotEmpty(factoryMethodName)) {
-                   try {
-                       final Class<?> factoryClass = 
LoaderUtil.loadClass(factoryClassName);
-                       final Method method = 
factoryClass.getMethod(factoryMethodName);
-                       final Object object = method.invoke(null);
-
-                       if (object instanceof DB) {
-                           database = (DB) object;
-                       } else if (object instanceof MongoClient) {
-                           if (Strings.isNotEmpty(databaseName)) {
-                               database = ((MongoClient) 
object).getDB(databaseName);
-                           } else {
-                               LOGGER.error("The factory method [{}.{}()] 
returned a MongoClient so the database name is "
-                                       + "required.", factoryClassName, 
factoryMethodName);
-                               return null;
-                           }
-                       } else if (object == null) {
-                           LOGGER.error("The factory method [{}.{}()] returned 
null.", factoryClassName, factoryMethodName);
-                           return null;
-                       } else {
-                           LOGGER.error("The factory method [{}.{}()] returned 
an unsupported type [{}].", factoryClassName,
-                                   factoryMethodName, 
object.getClass().getName());
-                           return null;
-                       }
-
-                       description = "database=" + database.getName();
-                       final List<ServerAddress> addresses = 
database.getMongo().getAllAddress();
-                       if (addresses.size() == 1) {
-                           description += ", server=" + 
addresses.get(0).getHost() + ", port=" + addresses.get(0).getPort();
-                       } else {
-                           description += ", servers=[";
-                           for (final ServerAddress address : addresses) {
-                               description += " { " + address.getHost() + ", " 
+ address.getPort() + " } ";
-                           }
-                           description += "]";
-                       }
-                   } catch (final ClassNotFoundException e) {
-                       LOGGER.error("The factory class [{}] could not be 
loaded.", factoryClassName, e);
-                       return null;
-                   } catch (final NoSuchMethodException e) {
-                       LOGGER.error("The factory class [{}] does not have a 
no-arg method named [{}].", factoryClassName,
-                               factoryMethodName, e);
-                       return null;
-                   } catch (final Exception e) {
-                       LOGGER.error("The factory method [{}.{}()] could not be 
invoked.", factoryClassName, factoryMethodName,
-                               e);
-                       return null;
-                   }
-               } else if (Strings.isNotEmpty(databaseName)) {
-                   final List<MongoCredential> credentials = new ArrayList<>();
-                   description = "database=" + databaseName;
-                   if (Strings.isNotEmpty(userName) && 
Strings.isNotEmpty(password)) {
-                       description += ", username=" + userName + ", 
passwordHash="
-                               + NameUtil.md5(password + 
MongoDbProvider.class.getName());
-                       
credentials.add(MongoCredential.createCredential(userName, databaseName, 
password.toCharArray()));
-                   }
-                   try {
-                       final int portInt = TypeConverters.convert(port, 
int.class, DEFAULT_PORT);
-                       description += ", server=" + server + ", port=" + 
portInt;
-                       database = new MongoClient(new ServerAddress(server, 
portInt), credentials).getDB(databaseName);
-                   } catch (final Exception e) {
-                       LOGGER.error(
-                               "Failed to obtain a database instance from the 
MongoClient at server [{}] and " + "port [{}].",
-                               server, port);
-                       return null;
-                   }
-               } else {
-                   LOGGER.error("No factory method was provided so the 
database name is required.");
-                   return null;
-               }
-
-               try {
-                   database.getCollectionNames(); // Check if the database 
actually requires authentication
-               } catch (final Exception e) {
-                   LOGGER.error(
-                           "The database is not up, or you are not 
authenticated, try supplying a username and password to the MongoDB provider.",
-                           e);
-                   return null;
-               }
-
-               final WriteConcern writeConcern = 
toWriteConcern(writeConcernConstant, writeConcernConstantClassName);
-
-               return new MongoDbProvider(database, writeConcern, 
collectionName, isCapped, collectionSize, description);
-               }
-
-           private static WriteConcern toWriteConcern(final String 
writeConcernConstant,
-                   final String writeConcernConstantClassName) {
-               WriteConcern writeConcern;
-               if (Strings.isNotEmpty(writeConcernConstant)) {
-                   if (Strings.isNotEmpty(writeConcernConstantClassName)) {
-                       try {
-                           final Class<?> writeConcernConstantClass = 
LoaderUtil.loadClass(writeConcernConstantClassName);
-                           final Field field = 
writeConcernConstantClass.getField(writeConcernConstant);
-                           writeConcern = (WriteConcern) field.get(null);
-                       } catch (final Exception e) {
-                           LOGGER.error("Write concern constant [{}.{}] not 
found, using default.",
-                                   writeConcernConstantClassName, 
writeConcernConstant);
-                           writeConcern = DEFAULT_WRITE_CONCERN;
-                       }
-                   } else {
-                       writeConcern = 
WriteConcern.valueOf(writeConcernConstant);
-                       if (writeConcern == null) {
-                           LOGGER.warn("Write concern constant [{}] not found, 
using default.", writeConcernConstant);
-                           writeConcern = DEFAULT_WRITE_CONCERN;
-                       }
-                   }
-               } else {
-                   writeConcern = DEFAULT_WRITE_CONCERN;
-               }
-               return writeConcern;
-           }
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/package-info.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/package-info.java
 
b/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/package-info.java
deleted file mode 100644
index 54a2878..0000000
--- 
a/log4j-mongodb/src/main/java/org/apache/logging/log4j/nosql/appender/mongodb/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.
- */
-/**
- * The classes in this package contain the MongoDB provider for the NoSQL 
Appender.
- */
-package org.apache.logging.log4j.nosql.appender.mongodb;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbAuthTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbAuthTest.java
 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbAuthTest.java
new file mode 100644
index 0000000..142a470
--- /dev/null
+++ 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbAuthTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Ignore("Requires a running MongoDB server")
+@Category(Appenders.MongoDb.class)
+public class MongoDbAuthTest {
+
+    @ClassRule
+    public static LoggerContextRule context = new 
LoggerContextRule("log4j2-mongodb-auth.xml");
+
+    @Test
+    public void test() {
+        final Logger logger = LogManager.getLogger();
+        logger.info("Hello log");
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCappedTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCappedTest.java
 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCappedTest.java
new file mode 100644
index 0000000..d5aa5a9
--- /dev/null
+++ 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbCappedTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Ignore("Requires a running MongoDB server")
+@Category(Appenders.MongoDb.class)
+public class MongoDbCappedTest {
+
+    @ClassRule
+    public static LoggerContextRule context = new 
LoggerContextRule("log4j2-mongodb-capped.xml");
+
+    @Test
+    public void test() {
+        final Logger logger = LogManager.getLogger();
+        logger.info("Hello log");
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbTest.java 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbTest.java
new file mode 100644
index 0000000..eab3c1c
--- /dev/null
+++ 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/mongodb/MongoDbTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Ignore("Requires a running MongoDB server")
+@Category(Appenders.MongoDb.class)
+public class MongoDbTest {
+
+    @ClassRule
+    public static LoggerContextRule context = new 
LoggerContextRule("log4j2-mongodb.xml");
+
+    @Test
+    public void test() {
+        final Logger logger = LogManager.getLogger();
+        logger.info("Hello log");
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbAuthTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbAuthTest.java
 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbAuthTest.java
deleted file mode 100644
index 3641a75..0000000
--- 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbAuthTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.nosql.appender.mongodb;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.categories.Appenders;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-@Ignore("Requires a running MongoDB server")
-@Category(Appenders.MongoDb.class)
-public class MongoDbAuthTest {
-
-    @ClassRule
-    public static LoggerContextRule context = new 
LoggerContextRule("log4j2-mongodb-auth.xml");
-
-    @Test
-    public void test() {
-        final Logger logger = LogManager.getLogger();
-        logger.info("Hello log");
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbCappedTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbCappedTest.java
 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbCappedTest.java
deleted file mode 100644
index a001b4b..0000000
--- 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbCappedTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.nosql.appender.mongodb;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.categories.Appenders;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-@Ignore("Requires a running MongoDB server")
-@Category(Appenders.MongoDb.class)
-public class MongoDbCappedTest {
-
-    @ClassRule
-    public static LoggerContextRule context = new 
LoggerContextRule("log4j2-mongodb-capped.xml");
-
-    @Test
-    public void test() {
-        final Logger logger = LogManager.getLogger();
-        logger.info("Hello log");
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbTest.java
 
b/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbTest.java
deleted file mode 100644
index 59ef951..0000000
--- 
a/log4j-mongodb/src/test/java/org/apache/logging/log4j/nosql/appender/mongodb/MongoDbTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.nosql.appender.mongodb;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.categories.Appenders;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.junit.ClassRule;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-@Ignore("Requires a running MongoDB server")
-@Category(Appenders.MongoDb.class)
-public class MongoDbTest {
-
-    @ClassRule
-    public static LoggerContextRule context = new 
LoggerContextRule("log4j2-mongodb.xml");
-
-    @Test
-    public void test() {
-        final Logger logger = LogManager.getLogger();
-        logger.info("Hello log");
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/44db87d0/src/site/xdoc/manual/appenders.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/appenders.xml 
b/src/site/xdoc/manual/appenders.xml
index ae86b54..bdfeddd 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -380,7 +380,7 @@
     </Cassandra>
   </Appenders>
   <Loggers>
-    <Logger name="org.apache.logging.log4j.nosql.appender.cassandra" 
level="DEBUG">
+    <Logger name="org.apache.logging.log4j.cassandra" level="DEBUG">
       <AppenderRef ref="Cassandra"/>
     </Logger>
     <Root level="ERROR"/>

Reply via email to