JFinal教程JfinalUIB 代码笔记 (6)--- 日志入库

提示:JFinalUIB的全局通用功能封装几乎都在GlobalHandler、AuthInterceptor、ParamPkgInterceptor,当然其他的几个Base开头的类也算,不过这些Base开头的类更像工具类

1.日志model是Syslog,对应的表名是pt_syslog,日志的处理就是Syslog对象从创建到入库的过程

2.在接收到url请求时,首先经过GlobalHandler全局处理器,在这里创建日志对象,并保存到request

  log.info("初始化访问系统功能日志");
  Syslog reqSysLog = getSysLog(request);
  long starttime = ToolDateTime.getDateByTime();
  reqSysLog.set(Syslog.column_startdate, ToolDateTime.getSqlTimestamp(starttime));//开始时间
  request.setAttribute(ConstantWebContext.reqSysLogKey, reqSysLog);

3.紧接着进入AuthInterceptor全局拦截器,在这里会填充一些日志信息,比如操作用户id、操作状态成功还是失败、失败的原因、记录全局操作的异常堆栈信息等待

  reqSysLog.set(Syslog.column_userids, user.getPKValue()); 
 reqSysLog.set(Syslog.column_status, "0");// 失败
  reqSysLog.set(Syslog.column_description, "URL不存在");
  reqSysLog.set(Syslog.column_cause, "1");// URL不存在

4.进入具体的Controller处理Action,在这里还可以继续写入一些更加详细的业务日志信息,在BaseController中提供了日志描述的设置方法

  protected void setLogDesc(String description){
    log.debug("设置日志描述:" + description);
    reqSysLog.set(Syslog.column_description, description);
  }

5.需要注意的是从GlobalHandler到AuthInterceptor,再到Action,是一个先进后出的过程,action处理完后继续执行AuthInterceptor和GlobalHandler的invoke方法后面的代码

AuthInterceptor在此时会捕获action抛出的异常信息记录日志,最后在GlobalHandler中的involve方法之后拿到完整的日志对象,此时已经记录了所有的日志信息

6.日志对象的入库,考虑到日志入库的效率问题,GlobalHandler中的involve方法之后直接把日志丢进了队列

  log.info("日志添加到入库队列");
  ThreadSysLog.add(reqSysLog);

7.队列详情请看ThreadSysLog

 private static Queue<Syslog> queue = new ConcurrentLinkedQueue<Syslog>();

8.读取队列的日志对象入库,在JfinalConfig中的afterJFinalStart方法中启动了读取日志信息入库的线程

 log.info("afterJFinalStart 启动操作日志入库线程");
 ThreadSysLog.startSaveDBThread();

总结:

如果你需要暂停记录日志的功能,首先在GlobalHandler中注释掉日志对象进入队列的代码,立马就能达到效果。

考虑到入库线程占用资源,还可以注释掉读取日志信息入库的线程。

更彻底的清理就是把前面说到的所有有关SysLog地方全部注释,其实也就几个类文件中的几行代码。

你可能感兴趣的:(JFinal教程JfinalUIB 代码笔记 (6)--- 日志入库)