所需额外依赖
org.springframework.boot
spring-boot-starter-aop
com.alibaba
fastjson
1.2.62
切面类
package com.zy.admin.aspect;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.zy.admin.domain.ExceptionLog;
import com.zy.admin.domain.Syslog;
import com.zy.admin.mapper.ILogMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
@Aspect
@Component
public class LogAspect {
private Date visitTime; //访问时间
private String username; //操作者用户名
private String url; //访问ip
private String ip; //访问资源url
private String classMethod; //访问方法
private String args; //访问参数
@Autowired
private HttpServletRequest request;
@Autowired
private ILogMapper logMapper;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Pointcut("execution(* com.zy.admin.web.*.*(..))")
public void log(){}
@Pointcut("execution(* com.zy.admin.web.admin.*.*(..))")
public void log1(){}
@Before("log() || log1()")
public void doBefore(JoinPoint joinPoint){
visitTime = new Date();
url = request.getRequestURL().toString(); //获取url
//获取ip
ip = "";
String ip1 = request.getHeader("X-Forwarded-For");
if(ip1 != null && !"unKnown".equals(ip1)){
int index = ip1.indexOf(",");
if(index != -1){
ip = ip1.substring(0,index);
}else{
ip = ip1;
}
}else{
ip1 = request.getHeader("X-Real-IP");
if(ip1 != null && !"unKnown".equals(ip1)){
ip = ip1;
}else{
ip = request.getRemoteAddr();
}
}
//获取执行方法
classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
//获取传入参数
Object[] argsValue = joinPoint.getArgs();
args = Arrays.toString(argsValue);
//获取当前操作的用户
SecurityContext context = SecurityContextHolder.getContext(); //从上下文中获取当前登录的用户
Object principal = context.getAuthentication().getPrincipal();
if("anonymousUser".equals(principal)){
username = null;
}else{
User user = (User) principal;
username = user.getUsername();
}
logger.info("--------------------------------BeforeStart-----------------------------------------");
logger.info("url : {}", url);
logger.info("ip : {}", ip);
logger.info("classMethod : {}", classMethod);
logger.info("args : {}", args);
logger.info("username : {}", username);
logger.info("visitTime : {}", visitTime);
logger.info("--------------------------------BeforeEnd-----------------------------------------");
}
@AfterReturning(returning = "resultValue",pointcut = "log() || log1()")
public void doAfterReturn(Object resultValue) throws Exception {
//获取返回值
String result = JSON.toJSONString(resultValue, SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteMapNullValue);
//获取执行时间
Long executionTime = new Date().getTime() - visitTime.getTime();
logger.info("--------------------------------doAfterReturnStart-----------------------------------------");
logger.info("Result : {}", resultValue);
logger.info("executionTime : {}", executionTime);
logger.info("--------------------------------doAfterReturnEnd-----------------------------------------");
//构建日志类
Syslog syslog = new Syslog(null, visitTime, username, url, ip, executionTime, classMethod, args, result);
//存入数据库
// logMapper.saveSyslog(syslog);
}
@AfterThrowing(throwing = "e",pointcut = "log() || log1()")
public void doAfterThrowing(Throwable e) throws Exception {
//获取异常出现时间
Date happenTime = new Date();
//获取异常详细信息
String exceptionJson = JSON.toJSONString(e, SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteMapNullValue);
//获取异常简单信息
String exceptionMessage = e.getMessage();
//获取执行时间
Long executionTime = new Date().getTime() - visitTime.getTime();
logger.info("--------------------------------doAfterThrowingStart-----------------------------------------");
logger.info("exceptionJson : {}", exceptionJson);
logger.info("exceptionMessage : {}", exceptionMessage);
logger.info("happenTime : {}", happenTime);
logger.info("executionTime : {}", executionTime);
logger.info("--------------------------------doAfterThrowingEnd-----------------------------------------");
//构建错误日志类
ExceptionLog exceptionLog = new ExceptionLog(null, exceptionMessage, happenTime,url,executionTime,classMethod,args);
//存入数据库
// logMapper.saveExceptionLog(exceptionLog);
}
@After("log() || log1()")
public void After(){
logger.info("--------------------------------doAfter----------------------------------------");
}
}
日志类
package com.zy.admin.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Syslog {
private Long id;
private Date visitTime; //访问时间
private String username; //操作者用户名
private String url; //访问ip
private String ip; //访问资源url
private Long executionTime; //执行时长
private String classMethod; //访问方法
private String args; //访问参数
private String result; //返回数据
}
package com.zy.admin.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ExceptionLog {
private Long id;
private String exceptionMessage; //异常简单信息
private Date happenTime; //异常发生时间
private String url; //访问资源url
private Long executionTime; //执行时长
private String classMethod; //访问方法
private String args; //访问参数
}
Mapper
package com.zy.admin.mapper;
import com.zy.admin.domain.ExceptionLog;
import com.zy.admin.domain.Syslog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ILogMapper {
void saveSyslog(Syslog syslog) throws Exception;
void saveExceptionLog(ExceptionLog exceptionLog) throws Exception;
}
sql
insert into syslog (id,visit_time,username,ip,url,execution_time,class_method,args,result) values
(UUID_SHORT(),#{visitTime},#{username},#{ip},#{url},#{executionTime},#{classMethod},#{args},#{result})
insert into exception_log (id,happen_time,exceptionMessage,url,execution_time,class_method,args) values
(UUID_SHORT(),#{happenTime},#{exceptionMessage},#{url},#{executionTime},#{classMethod},#{args})
数据库表
-- 日志表
create table syslog(
id bigint not null primary key,
visit_time timestamp, -- 访问时间
username varchar(50), -- 操作者用户名
ip varchar(30), -- 访问ip
url varchar(50), -- 访问资源url
execution_time bigint, -- 执行时长
class_method varchar(200), -- 访问方法
args text, -- 传入参数
result text -- 返回数据
);
-- 错误日志表
create table exception_log(
id bigint not null primary key,
happen_time timestamp, -- 异常发生时间
exceptionMessage varchar(100), -- 异常简单信息
url varchar(100), -- 访问资源url
execution_time bigint, -- 执行时长
class_method varchar(200), -- 访问方法
args text -- 传入参数
);