diff --git a/Chapter4-2-4/pom.xml b/Chapter4-2-4/pom.xml
new file mode 100644
index 0000000..c84fa80
--- /dev/null
+++ b/Chapter4-2-4/pom.xml
@@ -0,0 +1,72 @@
+
+
+ 4.0.0
+
+ com.didispace
+ Chapter4-2-4
+ 1.0.0
+ jar
+
+ Chapter4-2-4
+ 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.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/Chapter4-2-4/src/main/java/com/didispace/Application.java b/Chapter4-2-4/src/main/java/com/didispace/Application.java
new file mode 100644
index 0000000..2a14b75
--- /dev/null
+++ b/Chapter4-2-4/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-4/src/main/java/com/didispace/aspect/WebLogAspect.java b/Chapter4-2-4/src/main/java/com/didispace/aspect/WebLogAspect.java
new file mode 100644
index 0000000..b4c3666
--- /dev/null
+++ b/Chapter4-2-4/src/main/java/com/didispace/aspect/WebLogAspect.java
@@ -0,0 +1,63 @@
+package com.didispace.aspect;
+
+import org.apache.log4j.Logger;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+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;
+
+/**
+ * Web层日志切面
+ *
+ * @author 程序猿DD
+ * @version 1.0.0
+ * @date 16/5/17 上午10:42.
+ * @blog http://blog.didispace.com
+ */
+@Aspect
+@Order(5)
+@Component
+public class WebLogAspect {
+
+ private Logger logger = Logger.getLogger(getClass());
+
+ ThreadLocal startTime = new ThreadLocal<>();
+
+ @Pointcut("execution(public * com.didispace.web..*.*(..))")
+ public void webLog(){}
+
+ @Before("webLog()")
+ public void doBefore(JoinPoint joinPoint) throws Throwable {
+ startTime.set(System.currentTimeMillis());
+
+ // 接收到请求,记录请求内容
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ HttpServletRequest request = attributes.getRequest();
+
+ // 记录下请求内容
+ logger.info("URL : " + request.getRequestURL().toString());
+ logger.info("HTTP_METHOD : " + request.getMethod());
+ logger.info("IP : " + request.getRemoteAddr());
+ logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
+ logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
+
+ }
+
+ @AfterReturning(returning = "ret", pointcut = "webLog()")
+ public void doAfterReturning(Object ret) throws Throwable {
+ // 处理完请求,返回内容
+ logger.info("RESPONSE : " + ret);
+ logger.info("SPEND TIME : " + (System.currentTimeMillis() - startTime.get()));
+ }
+
+
+}
+
diff --git a/Chapter4-2-4/src/main/java/com/didispace/web/HelloController.java b/Chapter4-2-4/src/main/java/com/didispace/web/HelloController.java
new file mode 100644
index 0000000..e53c5db
--- /dev/null
+++ b/Chapter4-2-4/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-4/src/main/resources/application.properties b/Chapter4-2-4/src/main/resources/application.properties
new file mode 100644
index 0000000..e69de29
diff --git a/Chapter4-2-4/src/main/resources/log4j.properties b/Chapter4-2-4/src/main/resources/log4j.properties
new file mode 100755
index 0000000..38aca2b
--- /dev/null
+++ b/Chapter4-2-4/src/main/resources/log4j.properties
@@ -0,0 +1,36 @@
+# LOG4J配置
+log4j.rootCategory=INFO, stdout, file, errorfile
+log4j.category.com.didispace=DEBUG, didifile
+log4j.logger.error=errorfile
+
+# 控制台输出
+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
+
+# root日志输出
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.file=logs/all.log
+log4j.appender.file.DatePattern='.'yyyy-MM-dd
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
+
+# error日志输出
+log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.errorfile.file=logs/error.log
+log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
+log4j.appender.errorfile.Threshold = ERROR
+log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
+log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
+
+# com.didispace下的日志输出
+log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.didifile.file=logs/my.log
+log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
+log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
+log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n
+
+
+
+
+
diff --git a/Chapter4-2-4/src/test/java/com/didispace/ApplicationTests.java b/Chapter4-2-4/src/test/java/com/didispace/ApplicationTests.java
new file mode 100644
index 0000000..5fafc6d
--- /dev/null
+++ b/Chapter4-2-4/src/test/java/com/didispace/ApplicationTests.java
@@ -0,0 +1,23 @@
+package com.didispace;
+
+import org.apache.log4j.Logger;
+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 {
+
+ private Logger logger = Logger.getLogger(getClass());
+
+ @Test
+ public void test() throws Exception {
+ logger.info("输出info");
+ logger.debug("输出debug");
+ logger.error("输出error");
+ }
+
+}