能夠先拿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