From b46a27d8e6cc190b04e70665ce9ad0e391e990c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Wed, 25 May 2016 14:02:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8log4j=E5=AE=9E=E7=8E=B0http?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=97=A5=E5=BF=97=E5=85=A5mongodb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chapter4-2-5/pom.xml | 77 +++++++++++++++++ .../main/java/com/didispace/Application.java | 13 +++ .../com/didispace/aspect/WebLogAspect.java | 86 +++++++++++++++++++ .../java/com/didispace/log/MongoAppender.java | 84 ++++++++++++++++++ .../com/didispace/web/HelloController.java | 20 +++++ .../src/main/resources/application.properties | 0 .../src/main/resources/log4j.properties | 14 +++ .../java/com/didispace/ApplicationTests.java | 25 ++++++ 8 files changed, 319 insertions(+) create mode 100644 Chapter4-2-5/pom.xml create mode 100644 Chapter4-2-5/src/main/java/com/didispace/Application.java create mode 100644 Chapter4-2-5/src/main/java/com/didispace/aspect/WebLogAspect.java create mode 100644 Chapter4-2-5/src/main/java/com/didispace/log/MongoAppender.java create mode 100644 Chapter4-2-5/src/main/java/com/didispace/web/HelloController.java create mode 100644 Chapter4-2-5/src/main/resources/application.properties create mode 100755 Chapter4-2-5/src/main/resources/log4j.properties create mode 100644 Chapter4-2-5/src/test/java/com/didispace/ApplicationTests.java 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 { + + } + +}