首页 > 编程语言 >java使用注解实现系统日志记录

java使用注解实现系统日志记录

时间:2024-03-30 14:55:21浏览次数:25  
标签:java com org import operateLog 注解 cms annotation 系统日志

不论在神魔类型的项目中,日志系统绝对是一个不可少的存在,那么,怎末用一个最简便的方式来实现日志在数据库中的存储呢??最近在项目中正好负责了日志模块的实现,就简单记录一下。

我在这个项目中使用的是aop自定义注解的方式,大致步骤如下:

1.第一步,首先需要先定义一个注解类,来实现部分方法介绍信息的传递和切入点的切入时机。

package com.cms.common.annotation;
 
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * 操作日志注解类
 * 请填上日志描述:desc
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface ControllerOptLog {
    /**
     * 日志描述
     * @return
     */
    String desc() default "";
}

spring自定义注解,不多解释,其中属性desc是为切面传输必要参数的。

2.第二步,需要定义一个切面类,并在切面类中编写aop切入的前后通知等方法。

package com.cms.common.annotation;
 
import com.cms.common.utils.IPUtil;
import com.cms.common.utils.security.AccountShiroUtil;
import com.cms.common.utils.security.UserShiroUtil;
import com.cms.entity.company.Account;
import com.cms.entity.system.log.ErrorLog;
import com.cms.entity.system.log.OperateLog;
import com.cms.entity.system.users.Users;
import com.cms.service.system.log.ErrorLogService;
import com.cms.service.system.log.OptLogService;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
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
@Order(1)// Order值越小优先被加载
public class OperateAspect {
 
    private final Log logger = LogFactory.getLog(OperateAspect.class);
 
    private Boolean recordOptLog = true;
 
 
    private OperateLog operateLog;
 
 
    @Autowired
    OptLogService operateLogService;
 
    @Autowired
    ErrorLogService errorLogService;
 
    @Before(value = "@annotation(com.cms.common.annotation.ControllerOptLog)")
    public void beforeAdvice(JoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        if (recordOptLog) {
            try {
                operateLog = new OperateLog();
                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                        .getRequest();
                String ip = IPUtil.getIpAddr(request);
                MethodSignature signature = (MethodSignature) joinPoint.getSignature();
                Method method = signature.getMethod();
                Users currentUser= UserShiroUtil.getCurrentUser();
                ControllerOptLog controllerOptLog = method.getAnnotation(ControllerOptLog.class);
                String desc = controllerOptLog.desc();
                RequestMapping requestMappingAnnotation = joinPoint.getTarget().getClass().getAnnotation(RequestMapping.class);
                String url = request.getRequestURI();
                //添加记录内容
                operateLog.setIp(ip);
                operateLog.setUserName(currentUser.getName());
                operateLog.setParams(method.getParameters().toString());
                operateLog.setUserCode(currentUser.getCode());
                operateLog.setUrl(url);
                operateLog.setDesc(desc);
                operateLog.setBeginTime(new Date().toLocaleString());
 
            } catch (Throwable e) {
                logger.error("记录操作日志错误", e);
            }
        }
    }
 
 
    @AfterReturning(value = "@annotation(com.cms.common.annotation.ControllerOptLog)")
    public void afterAdvice(JoinPoint joinPoint) throws Throwable {
        if (recordOptLog) {
            try {
                operateLog.setEndTime(new Date().toLocaleString());
                operateLogService.log(operateLog);
            } catch (Throwable e) {
                logger.error("记录操作日志错误", e);
            }
        }
    }
 
    @AfterThrowing(value = "@annotation(com.cms.common.annotation.ControllerOptLog)",throwing = "e")
    public void erroeAdvice(JoinPoint joinPoint,Throwable e){
 
        Object[] args = joinPoint.getArgs();
        ErrorLog errorLog = new ErrorLog();
        if (recordOptLog) {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                    .getRequest();
            String ip = IPUtil.getIpAddr(request);
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            Users currentUser = UserShiroUtil.getCurrentUser();
            ControllerOptLog controllerOptLog = method.getAnnotation(ControllerOptLog.class);
            String desc = controllerOptLog.desc();
            RequestMapping requestMappingAnnotation = joinPoint.getTarget().getClass().getAnnotation(RequestMapping.class);
            String url = request.getRequestURI();
 
            errorLog.setUserCode(currentUser.getCode());
            errorLog.setUserName(currentUser.getName());
            errorLog.setParams(method.getParameters().toString());
            errorLog.setIp(ip);
            errorLog.setDesc(desc);
            errorLog.setContent(e.toString());
            errorLog.setUrl(url);
            errorLog.setCurrTime(new Date().toLocaleString());
 
            errorLogService.saveErrorAndOpt(errorLog);
        }
    }
}

需要注意的是,在这个切面类中所有的通知方法切入的位置都是指定为执行自定义注解时

value = "@annotation(com.cms.common.annotation.ControllerOptLog)"

在执行到切面方法 的时候可以通过 JoinPoint 对象获取一些请求上的参数,比如request,parms等等,同时因为使用的是自定义注解,所以可以通过

method.getAnnotation();

方法获取到标注注解的时候存入的操作介绍,最后把这些需要的参数封装到日志对象中,存入数据库或者指定位置中。

在需要切入的地方需要标上自己定义的注解,我的如下:

/**
     * 跳转到发件箱
     * @return
     */
    @ControllerOptLog(desc = "发件箱跳转")
    @RequestMapping("tohairlist")
    public String tolist(Model model) {
        model.addAttribute("permitBtn", getPermitBtn(Const.RESOURCES_TYPE_BUTTON));
        model.addAttribute("tableBtn", getPermitBtn(Const.RESOURCES_TYPE_FUNCTION));
        return "/system/message/Hairbox/tolist";
    }。

例子很好,有很多可以学习的地方哦~
原文链接:https://blog.csdn.net/W_DongQiang/article/details/80158382

标签:java,com,org,import,operateLog,注解,cms,annotation,系统日志
From: https://www.cnblogs.com/isme-zjh/p/18105492

相关文章

  • 【Java系列】-- 双亲委派机制
    原创:mikechen双亲委派机制......
  • java 咖啡工厂;
    父类:Coffeepackagecom.lxk.factory;publicabstractclassCoffee{publicabstractStringgetName();publicvoidaddMilk(){System.out.println("addmilk");}}子类1:BlackCoffeepackagecom.lxk.factory;publicclassBlack......
  • 羡青山有思,Java有接口
    本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • JavaWeb学习笔记——第九天
    Mybatis(二)Mybatis基础操作删除根据主键删除SQL语句:deletefromempwhereid=17;接口方法:@Delete("deletefromempwhereid=#{id}")publicvoiddelete(Integerid);注意事项如果mapper接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,如:#......
  • 快递员的烦恼【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-快递员的烦恼快递公司每日早晨,给每位快递员推送需要送到客户手中的快递以及路线信息,快递员自己又查找了一些客户与客户之间的路线距离信息,请你依据这些信息,给快递员设计一条最短路径,告诉他最短路径的距离。注意:不限制快递包裹送到客户手中的顺序,但必须保证都送......
  • 园区参观路径【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-园区参观路径园区某部门举办了FamilyDay,邀请员工及其家属参加;将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;家属参观园区时,只能向右和向下园区前进;求从起始园区到终点园区会有多少条不同的参观路径;输入描述:第一行为园区长和宽;后面每一行表示......
  • 1.java openCV4.x 入门-环境搭建
    专栏简介......
  • Go 开发踩过的那些坑(适合Java转Go)
    做完事情就总结,是个好习惯。花了一个多月,将写了一年半多的Java工程迁移到Go上。来小结下学到的东西吧!一些基础map访问Javamap.get(key)ormap.getOrDefault(key,defaultValue)Goifvalue,ok:=map[key];ok{//...code}强制类型转换注意,转换为*......
  • [Java]23种设计模式
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18031969出自【进步*于辰的博客】启发博文:《一次性讲清Java23种设计模式》(转发)。目录1、设计模式是什么?2、23种设计模式2.1创建型模式2.1.1单例模式最后1、设计模式是......
  • 毕业设计课题:机房预约系统,基于java+SSM+mysql
          一、前言介绍          网络的快速发展从根本上更改了世界各组织的管理方式,自二十世纪九十年代开始,我国的政府、企事业等单位就设想可以通过互联网系统来进行管理信息。由于以前存在各方面的原因,比如网络普及度低、用户不接受、互联网的相关法律法规也......