能够先拿Chapter4-2-4工程为基础,进行后续的实验改造。该工程实现了一个简单的REST接口,一个对web层的切面,并在web层切面先后记录http请求的日志内容。html
思路:log4j提供的输出器实现自Appender接口,要自定义appender输出到MongoDB,只须要继承AppenderSkeleton类,并实现几个方法便可完成。git
在pom.xml中引入下面依赖web
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.2.2</version> </dependency>
编写MongoAppender类继承AppenderSkeleton,实现以下:mongodb
public class MongoAppender extends AppenderSkeleton { private MongoClient mongoClient; private MongoDatabase mongoDatabase; private MongoCollection<BasicDBObject> logsCollection; private String connectionUrl; private String databaseName; private String collectionName; @Override protected void append(LoggingEvent loggingEvent) { if(mongoDatabase == null) { MongoClientURI connectionString = new MongoClientURI(connectionUrl); mongoClient = new MongoClient(connectionString); mongoDatabase = mongoClient.getDatabase(databaseName); logsCollection = mongoDatabase.getCollection(collectionName, BasicDBObject.class); } logsCollection.insertOne((BasicDBObject) loggingEvent.getMessage()); } @Override public void close() { if(mongoClient != null) { mongoClient.close(); } } @Override public boolean requiresLayout() { return false; } // 省略getter和setter }
定义MongoDB的配置参数,可经过log4j.properties配置:数据库
定义MongoDB的链接和操做对象,根据log4j.properties配置的参数初始化:app
重写append函数:ide
重写close函数:关闭mongodb的函数
源码来源ui