jfinal有没有操作日志的模块,自动捕获每一个action,自动存到到日志中?

@jfinal  @杜福忠
老大哥,各位小伙们:

请问一下,jfinal有没有操作日志的框架,实现目标:

直接自动捕获每一个action,自动存到到日志中。

现在我能实现,但是感觉很不科学,移植性也很差。

请问有类似的模块?类似的项目参考吗?
我现在的做法:

每个方法写:

CommonService.me.log(this, "xxx", "xxx", context);
//    导出单月公司统计表 : 公司、年、月
public void getStatisticalTableExcelCYM() throws IOException {
    String companyId = getPara("companyId");
    int year = Integer.parseInt(getPara("year"));
    int month = Integer.parseInt(getPara("month"));
    String context = "年限:" + year + "月份:" + year + ";公司:" + Company.dao.findFirst("SELECT * FROM `bidb1`.`company` WHERE `id` = ?", companyId).getCompanyname();
    Ret result = monthlyReportADDService.StatisticalTableExcelCYM(companyId, year, month);
    CommonService.me.log(this, "集团报表/集团职能部门报表/单月报表", "导出", context);
    renderJson(result);
}


log公工类的方法: 

public void log(Controller controller,String viewPage,String action) {
   Account loginAccount = controller.getAttr(LoginService.loginAccountCacheName);
   String loginIp = IpKit.getRealIp(controller.getRequest());
   loggerSrv.addLog(loginIp,viewPage,loginAccount,action);
}

public void log(Controller controller,String viewPage,String action,String context,String jsonBefor,String jsonNow) {
   Account loginAccount = controller.getAttr(LoginService.loginAccountCacheName);
   String loginIp = IpKit.getRealIp(controller.getRequest());
   loggerSrv.addLog(loginIp,viewPage,loginAccount,action,context,jsonBefor,jsonNow);
}

/**
 * 获取两个对象之间的变化(仅对比当前对象写的属性,不会对比父类写的属性)
 * @param oldBean
 * @param newBean
 * @return
 */
public String getObjectDifferent(Object oldBean, Object newBean) {
   if (oldBean != null && newBean!= null) {
      String modifyValue = "";
      try {
         Class clazz = oldBean.getClass();
         List<Field> fields = new ArrayList<>();
         fields.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
         //如果父类属性变化也记录
         fields.addAll(new ArrayList<>(Arrays.asList(clazz.getSuperclass().getDeclaredFields())));
         for (Field field : fields) {
            if ("serialVersionUID".equals(field.getName())) {
               continue;
            }
            PropertyDescriptor pd = new PropertyDescriptor(field.getName(), oldBean.getClass());
            Method getMethod = pd.getReadMethod();
            Object o1 = getMethod.invoke(oldBean);
            Object o2 = getMethod.invoke(newBean);
            if (o1 == null || o2 == null) {
               continue;
            }
            if (!o1.toString().equals(o2.toString())) {
               modifyValue += field.getName() + ":" + o1 + "->" + o2 + "; ";
            }
         }
         return modifyValue;
      } catch (Exception e) {
         e.printStackTrace();
         return e.toString();
      }
   } else {
      //log.info("传入对象为空,保存 “修改操作” 系统敏感操作记录失败");
      return "保存 “修改操作” 传入对象为空";
   }
}

public void log(Controller controller,String viewPage,String action,String context) {
   Account loginAccount = controller.getAttr(LoginService.loginAccountCacheName);
   String loginIp = IpKit.getRealIp(controller.getRequest());
   loggerSrv.addLog(loginIp,viewPage,loginAccount,action,context);
}


评论区

rancedxk

2021-04-20 14:12

像这种通用性的操作,我觉得用拦截器应该更方便点,至于要记录的日志内容,可以通过ThreadLocal传递

杜福忠

2021-04-20 15:21

我们现有的方案是 复制JF的 Log4jLog,在中间复写自己的业务日志,代码里面都是全局位置Log log = Log.getLog(XXX.class)。
全局变量共享在拦截器configHandler配置的,里面也是通过ThreadLocal存放的。比如登录用户,请求路径target,参数,返回结果等等信息。

lcmkc

2021-04-21 13:24

Interceptor

fmpoffice

2021-06-03 09:12

@杜福忠 哥,您的方案写法,有空分享下吗?

杜福忠

2021-06-03 09:42

@fmpoffice 2333 例子代码都写好长时间了 https://jfinal.com/share/2404