自定义注解@SysLog作用于方法
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
实体类:
import com.fasterxml.jackson.annotation.JsonFormat;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
@Entity
@Table(name = "log_opt")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class SysLog implements Serializable {
@Id
@GeneratedValue(generator = "jpa-uuid")
private String id ;
//操作用户id
private String userid ;
//操作用户名称
private String username ;
//@ApiOperation注解的value值
private String operatio ;
//操作方法
private String method ;
//传入参数
private String params ;
private String ipurl ;
//方法执行时长
private Long usetime ;
//访问时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createtime ;
}
service接口:
public interface SysLogService {
int insert(SysLog sysLog);
}
@Service
public class SysLogServiceImpl implements SysLogService {
@Resource
private SysLogMapper sysLogMapper;
@Override
public int insert(SysLog sysLog) {
return sysLogMapper.insert(sysLog);
}
mapper:
public interface SysLogMapper {
int insert(SysLog sysLog);
}
xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=" ">
<resultMap id="BaseResultMap" type=" .SysLog">
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="userid" property="userid" jdbcType="VARCHAR" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="operatio" property="operatio" jdbcType="VARCHAR" />
<result column="method" property="method" jdbcType="VARCHAR" />
<result column="ipurl" property="ipurl" jdbcType="VARCHAR" />
<result column="usetime" property="usetime" jdbcType="BIGINT" />
<result column="createtime" property="createtime" jdbcType="TIMESTAMP" />
</resultMap>
<insert id="insert">
insert into log_opt(id,userid,username,operatio,method,params,ipurl,usetime,createtime)
values(#{id},#{userid},#{username},#{operatio},#{method},#{params},#{ipurl},#{usetime},#{createtime})
</insert>
</mapper>
编写切面类
@Aspect
@Component
public class LogRecordAspect {
@Autowired
private SysLogService sysLogService;
@Pointcut("@annotation(com.hanmo.xf.common.annotation.SysLog)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
//执行方法
Object result = point.proceed();
//执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
//保存日志
saveSysLog(point, time);
return result;
}
private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLog sysLog = new SysLog();
ApiOperation annotation = method.getAnnotation(ApiOperation.class);
if(annotation != null){
//注解上的描述
sysLog.setOperatio(annotation.value());
}
//请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLog.setMethod(className + "." + methodName + "()");
//请求的参数
Object[] args = joinPoint.getArgs();
try{
String params = new Gson().toJson(getParameter(method, joinPoint.getArgs()));
sysLog.setParams(params);
}catch (Exception e){
}
//获取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//设置IP地址
sysLog.setIpurl(IPUtils.getIpAddr(request));
//用户名与密码通过按自己方法从request中获取
//String userid = getUserId(request);
//用户名
//String username = getUserName(request);
sysLog.setUsername(username);
sysLog.setUserid(userid);
sysLog.setUsetime(time);
sysLog.setCreatetime(new Date());
//保存系统日志
sysLogService.insert(sysLog);
}
public String getUserId(HttpServletRequest request){
String userId = "-1";
String token = request.getHeader("token");
Map<String,Object> map = JwtUtils.getClaimsFromToken(token);
if(map != null){
if(map.containsKey("userid")){
userId = map.get("userid").toString();
}
}
return userId;
}
}
ipUtils
public class IPUtils {
private static Logger logger = LoggerFactory.getLogger(com.hanmo.xf.utill.IPUtils.class);
/**
* 获取IP地址
*
* 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
* 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = "";
try {
ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader( " x-forwarded-for " );
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_FORWARDED");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_VIA");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("REMOTE_ADDR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (ip.equals("127.0.0.1") || ip.equals("0:0:0:0:0:0:0:1")) {
//根据网卡取本机配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ip = inet.getHostAddress();
}
}
} catch (Exception e) {
logger.error("IPUtils ERROR ", e);
}
if(ip == null){
ip = "-1";
}
return ip;
}
}