springboot利用aop日志记录
本文是使用mongoDB储存日志数据
添加依赖jar包
<!--aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
创建aspectj包
包下新建 LogAspectj类
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
@Aspect
@Component
public class LogAspectj {
@Autowired
private MongoTemplate mongoTemplate;
/**
* <pre>logCut(日志切点的未位置)
* 创建人:王琦
* 创建时间:2020年4月3日 下午1:18:30
* 修改人:王琦
* 修改时间:2020年4月3日 下午1:18:30</pre>
*/
@Pointcut("execution(* com.jk.controller..*.*(..))")
public void logCut(){
}
@AfterReturning(value="logCut()",argNames= "jionpoint,obj",returning="obj")
public void saveLog(JoinPoint jionpoint, Object obj){
LogBo logBo = new LogBo();
logBo.setCreateTime(new Date());
//获取类名
String className = jionpoint.getTarget().getClass().getSimpleName();
logBo.setClassName(className);
//获取方法名
String methodName = jionpoint.getSignature().getName();
logBo.setMethodName(methodName);
if ("findLogPageList".equals(methodName)) {
return;
}
//获取请求的参数
Object[] args = jionpoint.getArgs();
StringBuffer requestParams = new StringBuffer();
for (int i = 0; i < args.length; i++) {
requestParams.append("第【"+(i+1)+"】个参数=").append(args[i]).append(",");
}
logBo.setRequestParams(requestParams.toString());
//获取返回参数
String responseParams = obj == null ? "" : obj.toString();
logBo.setResponsParams(responseParams);
//获取request对象
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) requestAttributes;
if (sra != null) {
HttpServletRequest request = sra.getRequest();
//获取ip
String ip = getIp(request);
logBo.setIp(ip);
//获取请求的url
String requestURL = request.getRequestURL().toString();
logBo.setRequestUrl(requestURL);
HttpSession session = request.getSession();
if (session != null && session.getAttribute(session.getId()) != null) {
UserDto userDto = (UserDto) session.getAttribute("loginUser");
userDto.setUserId(userDto.getUserId());
}
}
//存到mongodb中
mongoTemplate.save(logBo);
System.out.println(logBo);
}
//获取客户端ip
public static String getIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(",");
if(index != -1){
return ip.substring(0,index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
return ip;
}
return request.getRemoteAddr();
}
}