栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringAOP+注解实现简单的日志管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringAOP+注解实现简单的日志管理

一、写一个自定义注解

 注解中包括配置方法所在模块名称,以及功能名称,当然我们在注解里可以自定义。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.PARAMETER})
public @interface LogInfoAnnotation {
    //模块名
    String moduleName();
    //操作内容
    String desc();
}
二、建切面类

       切面类里面定义好切点配置,以及所有的需要实现的通知方法。

@Aspect
@Component
public class LogAfterOperationAdvice {
    private static Logger logger = LoggerFactory.getLogger(LogAfterOperationAdvice.class);

    @Autowired
    private SysLogService sysLogService;


    @Pointcut("@annotation(com.xuebei.tec.common.annotation.LogInfoAnnotation)")
    private void loginfoAnnotation() {
    }//定义一个切入点

    @Pointcut("execution(* com.xuebei.tec.controller.admin.*.*(..))")
    private void controller() {
    }//定义一个切入点
    
//	 @Before(value = "loginfoAnnotation()" )
//	public void doBefore(JoinPoint jp) {
//		String strLog = " "
//				+ jp.getTarget().getClass().getName() + "."
//				+ jp.getSignature().getName();
//	    System.out.print(strLog);
//	}

    
    @Around(value = "loginfoAnnotation()&&controller()&& @annotation(annotation) &&args(object,..) ")
    public Object doAround(ProceedingJoinPoint pjp, LogInfoAnnotation annotation, Object object) throws Throwable {
        SysLogPojo sysLog = new SysLogPojo();
        sysLog.setModuleName(annotation.moduleName());
        sysLog.setModuleDesc(annotation.desc());
        //构造登陆用户的信息
        buildSysLog(sysLog);
        Object[] args = pjp.getArgs();
        StringBuffer param = new StringBuffer();
        //获取参数详细信息
        for (Object temp : args) {
            if (null == temp) {
                continue;
            }
            if (!temp.getClass().isArray()) {
                Class tempClass = temp.getClass();
                String packageName = tempClass.getPackage().getName();
                if (temp != null && isRecordPackage(packageName)) {
                    param.append(temp.toString()).append("|");
                }
            }

        }
        sysLog.setParams(param.toString());
        sysLog.setOperateMethod(pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName());
        Object retVal = pjp.proceed();
        if (retVal != null) {
            String result = retVal.toString();
            sysLog.setResult(result);
        }
        try {
            sysLogService.insertSysLogPojo(sysLog);
        } catch (Exception e) {
            logger.error("插入日志异常", e);
        }
        return retVal;
    }

    private boolean isRecordPackage(String p) {
        String[] pack = {"java.lang", "java.util", "com.xuebei.tec"};
        for (String s : pack) {
            if (p.startsWith(s)) {
                return true;
            }
        }
        return false;
    }

    
    private void buildSysLog(SysLogPojo sysLog) {
        Subject subject = SecurityUtils.getSubject();
        sysLog.setRemoteAddr(IpUtils.getIpAddr(WebUtils.getCurrentRequest()));
        sysLog.setRequestUrl(WebUtils.getCurrentRequest().getRequestURI());
        SysUserPojo sysUser = null;
        if (subject != null && subject.isAuthenticated()) {
            sysUser = WebUtils.getCurrentSysUser();
            sysLog.setOperateName(sysUser.getName());
            sysLog.setOperateId(sysUser.getId());
            sysLog.setOperateTime(DateTools.getCurrentDateTime());
        }
    }

}
三、测试Controller
public class CmsBannerController  {


    @Autowired
    private CmsBannerService cmsBannerService;

    @ApiOperation(value = "新增活动", notes = "对应权限:cmsBanner:new ")
    @RequestMapping(value = "/create", method = RequestMethod.POST)
    @RequiresPermissions("cmsBanner:new")
    @ResponseBody
    @LogInfoAnnotation(moduleName = "活动管理", desc = "新增活动")
    public ResultDo create(
            @Valid @RequestBody CmsBannerPojo cmsBannerPojo) throws ParseException {
        ResultDo resultDo = ResultDo.build();
        if (null == cmsBannerPojo.getPcView()) {
            cmsBannerPojo.setPcView(false);
        }
        if (cmsBannerPojo.getHref() == null) {
            cmsBannerPojo.setHref("");
        }
        if (cmsBannerPojo.getBannerType() == null) {
            cmsBannerPojo.setBannerType(false);
        }
        if (cmsBannerPojo.getShareFlag() == null) {
            cmsBannerPojo.setShareFlag(false);
        }
        if (cmsBannerPojo.getSpecial() == null) {
            cmsBannerPojo.setSpecial(false);
        }
        if (cmsBannerPojo.getSpecial()) {
           
            Timestamp ts = new Timestamp(System.currentTimeMillis());
            cmsBannerPojo.setStartTime(ts);
            cmsBannerPojo.setEndTime(null);
        }
        cmsBannerPojo.setStatus(CmsBannerStatus.saved);
        cmsBannerService.insertCmsBannerPojo(cmsBannerPojo);
        return resultDo;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490495.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号