如果你想用mongoDB做全局日志记录,比如记录controller方法执行相关数据,比如像这样。
整个流程:先写自定义注解。定义一个日志对象,字段属性设置好。 写aop 规范自定义注解如何使用,在其中通过切点和反射把相关参数存到日志对象,然后再用MongoTemplate的自带方法,保存到MongoDB数据库。
1.下载安装mongodb、设置全局变量、开机自启动.
1.1 参考这篇,写得非常详细了。
MongoDB的安装配置教程(很详细,你想要的都在这里)【我直接把图像软件Compass一并下载安装了,方便查看数据】
2.SpringBoot整合MongoDB,可参考这篇。
SpringBoot整合MongoDB
2.1 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.2 yml文件配置
spring:
data:
mongodb:
host: 127.0.0.1 #指定MongoDB服务地址
port: 27017 #指定端口,默认就为27017
database: systemLog #指定使用的数据库(集合)
authentication-database: admin # 登录认证的逻辑库名
# username: admin #用户名
# password: abc123456 #密码
2.3 创建日志实体类(你想保存哪些信息)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "systemLogger")
public class SystemLogger {
//用户名
private String username;
//TODO 请求方式
private String requestMethod;
//controller方法
private String controllerLink;
//模块名称(写在注解上的value)
private String mode;
//TODO 请求人ip地址
private String ip;
//操作时间
// @JSONField(format = "yyyy-MM-dd mm:HH:ss")
private String operationTime;
//耗时
private Long time;
}
2.4 创建自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SystemLog {
String value() default "";//当前模块描述
String requestMethod()default "";//请求方法
}
2.5 创建 aop 写自定义注解执行逻辑
aop:面向切面编程。将于业务无关,却对多个对象产生影响的的公共行为和逻辑。常用来保存系统日志。
package com.woniu.sys.aop; //根据你的包来
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.woniu.sys.mapper.UserMapper;
import com.woniu.sys.pojo.SystemLogger;
import com.woniu.sys.annotation.SystemLog;
import com.woniu.sys.pojo.User;//根据你的包来
import com.woniu.sys.utils.Application;//这个是我的工具类,解析请求里的token拿userId的
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
@Aspect
@Component
public class SystemLogAOP {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private UserMapper userMapper;
//切点表达式 拿执行方法的相关参数
@Around("@annotation(com.woniu.sys.annotation.SystemLog)")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
//拿方法上的注解
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SystemLog annotation = method.getAnnotation(SystemLog.class);
//注解上的value
String mode = annotation.value();
//当前操作时间
long startTime = System.currentTimeMillis();
Date date = new Date(startTime);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String operationTime = simpleDateFormat.format(date);
//执行方法
Object proceed = joinPoint.proceed();
//结束时间
long endTime = System.currentTimeMillis();
//耗时
long time = endTime - startTime;
//当前操作人用户名
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(User::getId, Application.getUserId());
User user = userMapper.selectOne(queryWrapper);
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 获取控制器路径
String path = request.getRequestURI();
// 获取控制器方法的请求方式
String requestMethod = annotation.requestMethod();
//请求人Ip
String ip = request.getRemoteAddr();
//组装日志对象
SystemLogger systemLogger = SystemLogger.builder().ip(ip).username(user.getUsername()).time(time).operationTime(operationTime).mode(mode).controllerLink(path).requestMethod(requestMethod).build();
//持久化保存
mongoTemplate.save(systemLogger);
return proceed;
}
}
2.6 把注解贴在需要的方法上
我这里是贴在controller里的某个方法上。
//找所有角色分类
@SystemLog(value = "找所有角色分类",requestMethod = "Get")
@GetMapping("/roleType")
public ResData getRoleType(){
LambdaQueryWrapper queryWrapper2 = new LambdaQueryWrapper();
List<Role> allRoleList = roleMapper.selectList(queryWrapper2);
return ResData.ok(allRoleList);
}
2.7 apifox 测试
2.8 MongoDB里查看document数据