提示: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地方全部注释,其实也就几个类文件中的几行代码。