前端时间公司要求将日志写入到mongodb数据库中,日志使用的是Logback,在网上学习了一下,发现很多实例都是用的mongodb-2.5.3版本的驱动,我这里使用的是3.2.2最新的驱动,有一些改变,实例如下:
Logback拓展文件:
import org.bson.Document;
import ch.qos.logback.classic.spi.ILoggingEvent;
public class MongoDBAppender extends MongoDBAppenderBase<ILoggingEvent> {
public MongoDBAppender() {
super("logback");
}
@Override
protected Document toMongoDocument(ILoggingEvent eventObject) {
final Document doc = new Document();
doc.append("date", DateUtil.formatDate(eventObject.getTimeStamp(),"yyyy-MM-dd HH:mm:ss"));
doc.append("level", eventObject.getLevel().toString());
doc.append("logger", eventObject.getLoggerName());
doc.append("thread", eventObject.getThreadName());
doc.append("message", eventObject.getFormattedMessage());
if (eventObject.getMDCPropertyMap() != null && !eventObject.getMDCPropertyMap().isEmpty()) {
doc.append("mdc", eventObject.getMDCPropertyMap());
}
return doc;
}
}
拓展文件<pre name="code" class="java">import java.net.UnknownHostException;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
public abstract class MongoDBAppenderBase<E> extends UnsynchronizedAppenderBase<E>{
private MongoClient mongoClient;
private MongoCollection<Document> eventsCollection;
private String host;
private int port;
private String dbName;
private String collectionName;
private String username;
private String password;
protected String source;
private int connectionsPerHost = 10;
private int threadsAllowedToBlockForConnectionMultiplier = 5;
private int maxWaitTime = 1000 * 60 * 2;
private int connectTimeout;
private int socketTimeout;
protected MongoDBAppenderBase(String collectionName) {
this.collectionName = collectionName;
}
private void connectToMongoDB() throws UnknownHostException {
//用户名密码验证方式,暂时不用
//List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>();
//mongoCredentialList.add(MongoCredential.createMongoCRCredential(username, dbName, password.toCharArray()));
//mongoClient = new MongoClient(new ServerAddress(host, port), mongoCredentialList, buildOptions());
mongoClient = new MongoClient(new ServerAddress(host, port), buildOptions());
mongoClient.setWriteConcern(new WriteConcern(0));//写策略不需要确认,效率更高
MongoDatabase database = mongoClient.getDatabase(this.dbName);
eventsCollection = database.getCollection(collectionName);
}
private MongoClientOptions buildOptions() {
final MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.connectionsPerHost(connectionsPerHost);
builder.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);
builder.maxWaitTime(maxWaitTime);
builder.connectTimeout(connectTimeout);
builder.socketTimeout(socketTimeout);
final MongoClientOptions options = builder.build();
return options;
}
@Override
public void start() {
try {
connectToMongoDB();
super.start();
} catch (UnknownHostException e) {
addError("Error connecting to MongoDB server: " + host + ":" + port, e);
}
}
protected abstract Document toMongoDocument(E event);
@Override
protected void append(E eventObject) {
eventsCollection.insertOne(toMongoDocument(eventObject));
}
@Override
public void stop() {
if (mongoClient != null) {
mongoClient.close();
}
super.stop();
}
public void setHost(String host) {
this.host = host;
}
public void setPort(int port) {
this.port = port;
}
public void setDbName(String dbName) {
this.dbName = dbName;
}
public void setCollectionName(String collectionName) {
this.collectionName = collectionName;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setConnectionsPerHost(int connectionsPerHost) {
this.connectionsPerHost = connectionsPerHost;
}
public void setThreadsAllowedToBlockForConnectionMultiplier(
int threadsAllowedToBlockForConnectionMultiplier) {
this.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;
}
public void setMaxWaitTime(int maxWaitTime) {
this.maxWaitTime = maxWaitTime;
}
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public void setSocketTimeout(int socketTimeout) {
this.socketTimeout = socketTimeout;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
}
maven的jar包:
<!-- mongodb的驱动 -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
<!-- log -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.3</version>
</dependency>
logback.xml的配置
<!-- mongo 日志 -->
<appender name="MONGO" class="com.test.logback.MongoDBAppender">
<host>127.0.0.1</host>
<port>27017</port>
<dbName>test</dbName>
<collectionName>logback</collectionName>
</appender>