前言
日志功能应该是每一个系统的刚需,所有今天这里写一个非常简单的日志监控,监控controller的请求方法
一、创建一个接口
import java.lang.annotation.*;
/**
* @Description 日志记录用户访问
* @Author Lxj
* @Date 2020/2/23 19:50
* */
@Target( ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAspect {
String module() default "";
}
二、创建方法
可以把注释的地方放开就可以在控制台看到输出,我这里new了一个自己创建的实体类用于数据库存储数据的,这个可以去掉,后续大家需要存储数据的话自己创建一个即可。
import cn.dev33.satoken.stp.StpUtil;
import com.example.dpi.aop.LogAspect;
import com.example.dpi.dao.Journal.JournalService;
import com.example.dpi.dao.User.UserService;
import com.example.dpi.pojo.Journal.Journal;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Locale;
/**
* @Description 打印日志切面
* @Author Lxj
* @Date 2020/2/23 19:50
* */
@Aspect
@Component//被spring接管
@Slf4j
@RestController
public class LogAspectAop {
// final static Logger LOG= (Logger) LoggerFactory.getLogger(LogAspectAop.class);
@Resource
private JournalService journalService;
@Resource
private UserService userService;
//定义切入点
@Pointcut("@annotation(com.example.dpi.aop.LogAspect)")
public void costTimePointct(){
}
//环绕执行
@Around("costTimePointct()")
public Object aroud(ProceedingJoinPoint point) throws Throwable {
//记录开始时间
long startTime=System.currentTimeMillis();
//执行方法
Object result=point.proceed();
//执行时常
long time=System.currentTimeMillis()-startTime;
LogAspect(point,time);
return result;
}
private void LogAspect(ProceedingJoinPoint joinPoint,long time){
MethodSignature signature= (MethodSignature) joinPoint.getSignature();
Method method=signature.getMethod();
LogAspect logAspect=method.getAnnotation(LogAspect.class);
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//浏览器网址
String url= request.getRequestURL().toString();
//方法名
String className=joinPoint.getTarget().getClass().getName();
//请求的参数
Object[] args=joinPoint.getArgs();
String params= Arrays.toString(args);
// SecurityContext context= SecurityContextHolder.getContext();//从上下文中获取登录的用户
// Object user = context.getAuthentication().getPrincipal();
//ip
String ip= request.getRemoteAddr();
//当前时间
long nowtime=System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("", Locale.SIMPLIFIED_CHINESE);
sdf.applyPattern("yyyy年MM月dd日 HH时mm分");
String timm= sdf.format(nowtime);
//存储日志
Journal journal=new Journal();
journal.setUsename(userService.selectname((String) StpUtil.getTokenInfo().getLoginId()));
journal.setAccessmethod("【类】"+className+"【方法】"+signature.getName());
journal.setIp(ip);
journal.setUrl(url);
journal.setVisittime(time);
journal.setExecutiontime(timm);
journal.setRequest(logAspect.module());
journal.setPackagename(params);
journalService.save(journal);
// log.info("======================日志===============");
// log.info("=====请求:{}",logAspect.module());
// log.info("=====用户:{}",userService.selectname((String) StpUtil.getTokenInfo().getLoginId()));
// log.info("=====url:{}",url);
// log.info("=====参数:{}",params);
// log.info("=====ip:{}",ip);
// log.info("=====执行的类:{}",className);
// log.info("=====执行方法:{}",signature.getName());
// log.info("=====执行时间:{}",time);
// log.info("=====当前时间:{}",timm);
// log.info("======================日志===============");
}
}
如果报错了看看是不是没有引入包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
三、怎么用,差点忘了
@LogAspect(module = “XXX”),直接在你需要监控的方法体上加上这个注释,然后中文自己定义就可以了