SpringBoot使用自定义注解完成日志记录
实现系统所有操作有记录可查,可以避免很多不必要的麻烦或纠纷,比如特别敏感的删除操作。将这些操作日志存储到数据库中可以很方便的查询谁操作了数据库哪一条数据,也可以很方便的对日志进行分类查询。让数据从生成到移除中途所有的改变都记录在库,对数据还原或其他数据问题解决都能提供极大的帮助。
日志表结构:
新建自定义注解类:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAlias {
String value();
}
拦截器:使用SpringBoot拦截器获取请求controller中对应的方法
@Component
public class LogRecordInterceptor extends HandlerInterceptorAdapter {
@Autowired
private LogMapper logMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try{
HandlerMethod method = (HandlerMethod) handler;
LogAlias annotation = method.getMethodAnnotation(LogAlias.class); //获取方法上的注解
if(annotation != null){
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user"); //从session获取用户名
Map<String, String[]> parameterMap = request.getParameterMap(); //获取方法参数
Set<String> keys = parameterMap.keySet(); //遍历参数并拼接
StringBuilder sb = new StringBuilder();
for(String key : keys){
sb.append(key).append("=").append(Arrays.toString(parameterMap.get(key))).append(";");
}
Log log = new Log(user.getUsername(),annotation.value(),sb.toString());
logMapper.insert(log); //插入数据库
}
}catch (Exception e){
System.out.println(e.toString());
return super.preHandle(request, response, handler);
}
return super.preHandle(request, response, handler);
}
}
拦截器配置:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private LogRecordInterceptor logRecordInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logRecordInterceptor);
}
}
使用:在controller中对需要镜像进行日志记录的地方打上对应的注解
效果: