从今天开始记录每一天工作过程中学习的新知识吧!
代码也是参考的别人写的,侵删哦
spring aop
@Aspect
@Component
public class WebRequestLogAspect {
private static Logger logger = Logger.getLogger(WebRequestLogAspect.class);
private static SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Autowired
private OperatorLogService operatorLogService;
@Autowired
private UserService userService;
@Pointcut("execution(* com.xxx.xxxxx.xxxxx.xxxx.xxxxx..*.*(..))") //切点
public void webRequestLog(){}
@Before("webRequestLog()")
public void doBefore(JoinPoint joinPoint){
try {
OperatorLog operatorLog = new OperatorLog();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String method = request.getMethod();
//判断是否是post方法,如果是,则记录到日志表中
if("POST".equals(method)){
long beginTime = System.currentTimeMillis();
String beanName = joinPoint.getSignature().getDeclaringTypeName(); //方法所在的类名
String methodName = joinPoint.getSignature().getName();//方法名
String uri = request.getRequestURI(); //接口名
String url = request.getRequestURL().toString(); //url
String remoteAddr = getIpAddr(request); //ip地址
String sessionId = request.getSession().getId();
Integer uid = (Integer) request.getSession().getAttribute("uid"); //用户id
if(uid != null){
User user = userService.getById(uid);
if(user !=null){
operatorLog.setUser_account(user.getAccount());
operatorLog.setUserId(user.getId());
}
}
operatorLog.setBeanName(beanName);
operatorLog.setMethodName(methodName);
operatorLog.setRemoteAddr(remoteAddr);
operatorLog.setSessionId(sessionId);
operatorLog.setUri(uri);
operatorLog.setUrl(url);
Date date = new Date(beginTime);
String requestTime = sdf1.format(date);
operatorLog.setRequestTime(requestTime);
operatorLog.setStatus(CommonStatus.IS_ACTIVE.getStatus());
operatorLog = operatorLogService.save(operatorLog);
//tlocal.set(operatorLog);
}
} catch (Exception e) {
logger.info("操作请求日志记录失败");
}
}
/*@AfterReturning(returning="result",pointcut = "webRequestLog()")
public void doAfterReturning(Object result){
}
*/
private String getIpAddr(HttpServletRequest request){
String ip = request.getHeader("x-forwarded-for");
if(ip==null || ip.length()==0 || "unknowm".equalsIgnoreCase(ip)){
ip = request.getHeader("Proxy-Client-IP");
}
if(ip==null || ip.length()==0 || "unknowm".equalsIgnoreCase(ip)){
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip==null || ip.length()==0 || "unknowm".equalsIgnoreCase(ip)){
ip = request.getRemoteAddr();
}
return ip;
}
}
spring boot 配置方法:
在application文件中添加:
spring.aop.auto=true
spring.aop.proxy-target-class=false
在pom.xml文件中添加:
org.springframework.boot
spring-boot-starter-aop
这个方法记录操作日志还是很方便的,操作人在什么时间进行了什么操作一目了然,定位问题很方便,便于找到BUG,还是挺有意思的