您的位置:首页 > 产品设计 > UI/UE

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

2016-03-16 09:48 453 查看
提示: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地方全部注释,其实也就几个类文件中的几行代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: