一,日志整合
SpringBoot对log4j日志和spring-aop进行了内置整合处理,通过maven坐标引入及切点配置,实现日志处理及AOP整合
二,Maven坐标依赖
<!-- log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- fastJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
三,log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=E:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=info, error, stdout
四,业务方法
package com.gupao.springboot.test.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author pj_zhang
* @create 2018-12-23 23:06
**/
@RestController
public class ErrorController {
private Logger logger = LoggerFactory.getLogger(ErrorController.class);
@RequestMapping("/calculate")
public String calculate(int i) {
int j = 6 / i;
logger.info(String.valueOf(j));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return String.valueOf(j);
}
}
五,拦截器
package com.gupao.springboot.test.aspect;
import com.alibaba.fastjson.JSONObject;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.Enumeration;
/**
* @author pj_zhang
* @create 2018-12-24 19:49
**/
// 声明一个切面
@Aspect
// 被Spring进行管理
@Component
public class WebLogAspect {
private Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
private ThreadLocal<Long> time = new ThreadLocal<>();
// 声明一个切点, value为拦截表达式, 表示拦截controller包下所有方法
@Pointcut("execution(public * com.gupao.springboot.*.controller.*.*(..))")
public void webLog() {
}
// 前置拦截器
// value表示切点, 值为声明切点的方法名称
@Before("webLog()")
public void webLogBefore(JoinPoint joinPoint) {
time.set(System.currentTimeMillis());
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
logger.info("request url : " + request.getRequestURL().toString());
logger.info("request host : " + request.getRemoteHost());
logger.info("request address : " + request.getRemoteAddr());
logger.info("request methods : " + joinPoint.getSignature());
Enumeration<String> parameters = request.getParameterNames();
while (parameters.hasMoreElements()) {
String name = parameters.nextElement();
logger.info("request param : {}, value : {}", name, request.getParameter(name));
}
}
// 后置拦截器
// returning表示返回对象
// pointcut表示定义切点的方法名
@AfterReturning(returning = "obj", pointcut = "webLog()")
public void webLogReturning(Object obj) {
// 通过fastJson转换返回的数据
logger.info("return object : " + JSONObject.toJSONString(obj));
logger.info("cost time : " + (System.currentTimeMillis() - time.get()));
}
}
* 切点定义方式可以通过引用来进行定义,如下;多个引用可以用“||”进行隔开引用
@Pointcut("execution(public * com.gupao.springboot.*.controller.*.*(..))")
public void webLog() {
}
@Pointcut("webLog()")
public void reference() {
}
六,执行结果