使用切面编程原理来实现
参考
https://blog.csdn.net/justlpf/article/details/103400452
1、导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、创建自定义日志注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyLog {
String value() default "";
}
3、创建日志处理类
@Aspect
@Component //一定要交给spring管理,要不然不生效
public class MyLogAspect {
@Pointcut("@annotation(com.example.annotation.MyLog)")
public void logCut(){
}
@Before("logCut()")
public void logHandler(JoinPoint joinPoint){
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
MyLog myLog = method.getAnnotation(MyLog.class);
String value = myLog.value();
System.out.println("操作:"+value);
System.out.println("方法:"+joinPoint.getSignature().getDeclaringTypeName()+"."+method.getName()+"()");
System.out.println("IP:"+getIp());
}
private String getIp(){
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
// 从获取RequestAttributes中获取HttpServletRequest的信息
HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
String 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_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.getRemoteAddr();
}
return ip;
}
}
4、Controller
@GetMapping("/{id}")
@MyLog("获取用户")
public R user(@PathVariable("id")Integer id){
if (id == null){
return null;
}
User user = userService.getById(id);
return R.ok().put("data",user);
}
5、sout
操作:获取用户
方法:com.example.controller.UserController.user()
IP:127.0.0.1
可以直接输出,但是介意输出到数据库,后期可以做操作日志查看