简单日志监控

本文介绍了如何使用AOP注解(如LogInfo)在SpringAOP中实现方法拦截,记录操作日志,包括操作人、时间、模块、级别和参数等内容,并将数据存储到数据库表中.
摘要由CSDN通过智能技术生成

整体是使用aop +注解的方式实现

注解类

package cn.@@.project.handler.annotation;

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 LogInfo {
    //模块名称
    String model();
    //日志等级
    String level();
    //操作内容
    String msg();
}

解析实现类

package cn.@@.project.handler.aspect;


import cn.hongt.project.handler.annotation.LogInfo;
import cn.hongt.project.handler.common.utils.RedisUtil;
import cn.hongt.project.handler.domain.entity.Loginfo;
import cn.hongt.project.handler.domain.entity.admin.SysUser;
import cn.hongt.project.handler.repository.LogInfoMapper;
import cn.hongt.util.common.utils.DateUtils;
import cn.hongt.util.common.utils.IdGenerator;
import cn.hongt.util.common.utils.StringUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
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.util.Date;

@Aspect
@Component
@Slf4j
public class LogInfoAspect {

    @Autowired
    private LogInfoMapper logInfoMapper;

    @Autowired
    private RedisUtil redisUtil;

    @AfterReturning(value = "@annotation(cn.hongt.project.handler.annotation.LogInfo)", returning = "returnValue")
    public void afterHandler(JoinPoint pjp, Object returnValue) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        String username = "未知用户";
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            String token = request.getHeader("token");
            if (StringUtil.isNotBlank(token)) {
                String UserString = (String) redisUtil.get(token);
                JSONObject userJson = JSONObject.parseObject(UserString);
                SysUser sysUser = JSON.toJavaObject(userJson, SysUser.class);
                username = sysUser.getUsername();
            }
        }
        Method method = ((MethodSignature) pjp.getSignature()).getMethod();
        method.setAccessible(true);
        LogInfo logInfo = method.getAnnotation(LogInfo.class);
        Object[] args = pjp.getArgs();
        StringBuffer sbf = new StringBuffer(" ");
        for (Object obs : args) {
            try {
                sbf.append(JSON.toJSONString(obs)).append(",");
            }catch (Exception e){
                continue;
            }
        }
        String content = username +"在【"+ DateUtils.dateToString(new Date(), DateUtils.dateType5)+"】调用接口【" + method.getName() +"】传入参数为 【" + sbf.substring(0, sbf.toString().length() - 1) + "】。";
        Loginfo loginfo = Loginfo.builder()
                .id(IdGenerator.generateId())
                .model(logInfo.model())
                .level(logInfo.level())
                .msg(logInfo.msg())
                .username(username)
                .resultMsg(content)
                .optTime(new Date())
                .build();
        logInfoMapper.insert(loginfo);

    }

}

代码注解使用样例

  @ApiOperation(value = "用户管理-刪除用户", httpMethod = "POST")
    @ApiOperationSupport(order = 6)
    @PostMapping("/userremove")
    @LogInfo(level = "1", model = "系统管理", msg = "删除用户")
    public Result userremove(@Valid @RequestBody SysUserInput sysUserInput) {
        boolean result = sysUserService.remove(sysUserInput);
        return ResultUtil.success(result);
    }

数据库

-- public.log_info definition

-- Drop table

-- DROP TABLE public.log_info;

CREATE TABLE public.log_info (
    id varchar NOT NULL, -- id
    username varchar NULL, -- 操作人
    opt_time timestamp(0) NULL, -- 操作时间
    model varchar NULL, -- 归属模块
    msg varchar NULL, -- 操作内容
    resultmsg varchar NULL, -- 操作信息
    "level" varchar NULL, -- 日志等级
    CONSTRAINT log_info_pk PRIMARY KEY (id)
);
COMMENT ON TABLE public.log_info IS '日志记录';

-- Column comments

COMMENT ON COLUMN public.log_info.id IS 'id';
COMMENT ON COLUMN public.log_info.username IS '操作人';
COMMENT ON COLUMN public.log_info.opt_time IS '操作时间';
COMMENT ON COLUMN public.log_info.model IS '归属模块';
COMMENT ON COLUMN public.log_info.msg IS '操作内容';
COMMENT ON COLUMN public.log_info.resultmsg IS '操作信息';
COMMENT ON COLUMN public.log_info."level" IS '日志等级';
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值