diff --git a/Chapter4-2-5/pom.xml b/Chapter4-2-5/pom.xml
new file mode 100644
index 0000000..fec3b79
--- /dev/null
+++ b/Chapter4-2-5/pom.xml
@@ -0,0 +1,77 @@
+
+
+ 4.0.0
+
+ com.didispace
+ Chapter4-2-5
+ 1.0.0
+ jar
+
+ Chapter4-2-5
+ Spring Boot project
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.3.2.RELEASE
+
+
+
+
+ UTF-8
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-log4j
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.mongodb
+ mongodb-driver
+ 3.2.2
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/Chapter4-2-5/src/main/java/com/didispace/Application.java b/Chapter4-2-5/src/main/java/com/didispace/Application.java
new file mode 100644
index 0000000..2a14b75
--- /dev/null
+++ b/Chapter4-2-5/src/main/java/com/didispace/Application.java
@@ -0,0 +1,13 @@
+package com.didispace;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/Chapter4-2-5/src/main/java/com/didispace/aspect/WebLogAspect.java b/Chapter4-2-5/src/main/java/com/didispace/aspect/WebLogAspect.java
new file mode 100644
index 0000000..d5ea75a
--- /dev/null
+++ b/Chapter4-2-5/src/main/java/com/didispace/aspect/WebLogAspect.java
@@ -0,0 +1,86 @@
+package com.didispace.aspect;
+
+import com.mongodb.BasicDBObject;
+import org.apache.log4j.Logger;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Web层日志切面
+ *
+ * @author 程序猿DD
+ * @version 1.0.0
+ * @date 16/5/17 上午10:42.
+ * @blog http://blog.didispace.com
+ */
+@Aspect
+@Order(1)
+@Component
+public class WebLogAspect {
+
+ private Logger logger = Logger.getLogger("mongodb");
+
+ @Pointcut("execution(public * com.didispace.web..*.*(..))")
+ public void webLog(){}
+
+ @Before("webLog()")
+ public void doBefore(JoinPoint joinPoint) throws Throwable {
+ // 获取HttpServletRequest
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ HttpServletRequest request = attributes.getRequest();
+ // 获取要记录的日志内容
+ BasicDBObject logInfo = getBasicDBObject(request, joinPoint);
+ logger.info(logInfo);
+ }
+
+
+ private BasicDBObject getBasicDBObject(HttpServletRequest request, JoinPoint joinPoint) {
+ // 基本信息
+ BasicDBObject r = new BasicDBObject();
+ r.append("requestURL", request.getRequestURL().toString());
+ r.append("requestURI", request.getRequestURI());
+ r.append("queryString", request.getQueryString());
+ r.append("remoteAddr", request.getRemoteAddr());
+ r.append("remoteHost", request.getRemoteHost());
+ r.append("remotePort", request.getRemotePort());
+ r.append("localAddr", request.getLocalAddr());
+ r.append("localName", request.getLocalName());
+ r.append("method", request.getMethod());
+ r.append("headers", getHeadersInfo(request));
+ r.append("parameters", request.getParameterMap());
+ r.append("classMethod", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
+ r.append("args", Arrays.toString(joinPoint.getArgs()));
+ return r;
+ }
+
+ /**
+ * 获取头信息
+ *
+ * @param request
+ * @return
+ */
+ private Map getHeadersInfo(HttpServletRequest request) {
+ Map map = new HashMap<>();
+ Enumeration headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String key = (String) headerNames.nextElement();
+ String value = request.getHeader(key);
+ map.put(key, value);
+ }
+ return map;
+ }
+
+}
+
diff --git a/Chapter4-2-5/src/main/java/com/didispace/log/MongoAppender.java b/Chapter4-2-5/src/main/java/com/didispace/log/MongoAppender.java
new file mode 100644
index 0000000..5380d12
--- /dev/null
+++ b/Chapter4-2-5/src/main/java/com/didispace/log/MongoAppender.java
@@ -0,0 +1,84 @@
+package com.didispace.log;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoClientURI;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.spi.LoggingEvent;
+import org.bson.Document;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+
+/**
+ * 日志插入MongoDB
+ *
+ * @author 程序猿DD
+ * @version 1.0.0
+ * @date 16/5/23 下午4:53.
+ * @blog http://blog.didispace.com
+ */
+public class MongoAppender extends AppenderSkeleton {
+
+ private MongoClient mongoClient;
+ private MongoDatabase mongoDatabase;
+ private MongoCollection 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;
+ }
+
+ public String getConnectionUrl() {
+ return connectionUrl;
+ }
+
+ public void setConnectionUrl(String connectionUrl) {
+ this.connectionUrl = connectionUrl;
+ }
+
+ public String getDatabaseName() {
+ return databaseName;
+ }
+
+ public void setDatabaseName(String databaseName) {
+ this.databaseName = databaseName;
+ }
+
+ public String getCollectionName() {
+ return collectionName;
+ }
+
+ public void setCollectionName(String collectionName) {
+ this.collectionName = collectionName;
+ }
+
+}
diff --git a/Chapter4-2-5/src/main/java/com/didispace/web/HelloController.java b/Chapter4-2-5/src/main/java/com/didispace/web/HelloController.java
new file mode 100644
index 0000000..e53c5db
--- /dev/null
+++ b/Chapter4-2-5/src/main/java/com/didispace/web/HelloController.java
@@ -0,0 +1,20 @@
+package com.didispace.web;
+
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author 程序猿DD
+ * @version 1.0.0
+ * @date 16/5/19 下午1:27.
+ * @blog http://blog.didispace.com
+ */
+@RestController
+public class HelloController {
+
+ @RequestMapping(value = "/hello", method = RequestMethod.GET)
+ @ResponseBody
+ public String hello(@RequestParam String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/Chapter4-2-5/src/main/resources/application.properties b/Chapter4-2-5/src/main/resources/application.properties
new file mode 100644
index 0000000..e69de29
diff --git a/Chapter4-2-5/src/main/resources/log4j.properties b/Chapter4-2-5/src/main/resources/log4j.properties
new file mode 100755
index 0000000..36b92b5
--- /dev/null
+++ b/Chapter4-2-5/src/main/resources/log4j.properties
@@ -0,0 +1,14 @@
+# LOG4J配置
+log4j.rootCategory=INFO, stdout
+log4j.logger.mongodb=INFO, mongodb
+
+# 控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
+
+# mongodb输出
+log4j.appender.mongodb=com.didispace.log.MongoAppender
+log4j.appender.mongodb.connectionUrl=mongodb://localhost:27017
+log4j.appender.mongodb.databaseName=logs
+log4j.appender.mongodb.collectionName=logs_request
diff --git a/Chapter4-2-5/src/test/java/com/didispace/ApplicationTests.java b/Chapter4-2-5/src/test/java/com/didispace/ApplicationTests.java
new file mode 100644
index 0000000..168dfe7
--- /dev/null
+++ b/Chapter4-2-5/src/test/java/com/didispace/ApplicationTests.java
@@ -0,0 +1,25 @@
+package com.didispace;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringApplicationConfiguration(classes = Application.class)
+public class ApplicationTests {
+
+ @Before
+ public void setUp() throws Exception {
+
+
+ }
+
+ @Test
+ public void getHello() throws Exception {
+
+ }
+
+}