SSH操作日志技术预研Word下载.docx
- 文档编号:22560226
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:12
- 大小:19.34KB
SSH操作日志技术预研Word下载.docx
《SSH操作日志技术预研Word下载.docx》由会员分享,可在线阅读,更多相关《SSH操作日志技术预研Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
目前已知针对网站的登录操作和订单变化进行进行记录。
登录:
记录每次登录和退出的名称、时间等字段级业务信息
订单:
记录订单从开始到结束的每个状态,记录这些状态变化时的订单字段级别的业务变化信息。
日志查询:
日志数据需要保存3个月供网站进行查询,3个月以外的数据,不允许网站查询,需要通知产品经理,由产品经理决定。
3个月以内的日志数据,允许网站在线查询。
日志查询按照日期、模块名称、操作人和关键业务字段进行查询。
3月以外数据的查询方式不确定,保证在需要的情况下,能够给网站提供其所需结果即可。
在线日志展示
网站在线查询日志时,根据业务情况,关联业务信息,进行展示。
日志业务数量
每个网站预估数量如下:
基准值
最大值
商品数(个)
200
20000
订单数(个/日)
12.5
6000
数据库空间
可以不考虑数据库空间是否足够的问题
3方案
对于上面描述的需求,涉及到的技术点分为数据收集的方式、数据存储的方式和数据展现三个方面,下面分别对这三个方面进行说明:
3.1数据收集
数据收集的方案有两种,定义一个操作记录接口或者使用AOP的方式进行数据收集,下面表格对这两种方式的特点进行了对比:
特点
操作记录接口
AOP
技术复杂度
技术简单、易于理解
技术相对复杂,多数情况下开发人员不需要关心
耦合程度
操作接口与组件紧密耦合
操作记录与应用解耦
对现有组件的影响
组件需要增加日志接口业务逻辑
除特殊需求以外,组件不需要修改
业务灵活性
能够以比较明确的方式满足业务需求
多数操作采用统一的逻辑,个别业务可独立编码,但编码相对复杂
综上所述,建议采用AOP的方式进行操作记录的数据收集,能够满足业务的需求且对开发人员透明,具有较低的耦合程度。
3.1.1接口方式
给开发人员一个ILogger接口,由开发人员根据具体的需求在必要的时候调用此接口记录操作日志。
1.定义接口
//日志元数据
publicclassLogMeta{
privateDatelogDate=null;
privateStringmodelName=null;
privateStringuserName=null;
privateStringmemo;
publicLogMeta(StringuserName,StringmodelName,DatelogDate){
userName=userName;
logDate=logDate;
modelName=modelName;
}
publicDategetLogDate(){
returnlogDate;
publicvoidsetLogDate(DatelogDate){
this.logDate=logDate;
publicStringgetModelName(){
returnmodelName;
publicvoidsetModelName(StringmodelName){
this.modelName=modelName;
publicStringgetUserName(){
returnuserName;
publicvoidsetUserName(StringuserName){
this.userName=userName;
publicStringgetMemo(){
returnmemo;
publicvoidsetMemo(Stringmemo){
this.memo=memo;
}
//记录日志接口
publicinterfaceILogger{
/**
*记录日志
*@parammemo
*/
publicvoidaddLog(LogMetalog);
2.接口实现
publicclassDBLoggerImplimplementsILogger{
@Override
publicvoidaddLog(LogMetalog){
//插入日志
3.接口调用
开发人员直接使用提供的接口记录日志
LogMetalog=newLogMeta("
username"
"
modelName"
newDate());
log.setMemo("
日志信息"
);
ILogFactoryfactory=newLogFactoryImpl();
ILoggerlogger=factory.getLogger();
logger.addLog(log);
3.1.2AOP方式
实现Logging拦截器,利用SpringAOP记录操作记录,允许在需要的时候自定义日志信息。
1)在拦截器中实现记录日志
publicclassMyAdviceimplementsMethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{
publicvoidafterReturning(
ObjectreturnValue,Methodmethod,Object[]arg2,
Objecttarget)throwsThrowable{
ClassPathResourceresource=
newClassPathResource("
spring.aop.xml"
XmlBeanFactorybeanFactory=newXmlBeanFactory(resource);
LogMetalog=null;
//判断是否自定义Log逻辑
BizLogListitcptList=
(BizLogList)beanFactory.getBean("
myLogList"
StringbizLogName=
itcptList.getHmItcptMap()
.get(target.getClass().getName());
if(bizLogName!
=null){
//自定义log逻辑,取自定义log类
LogTemplateaopMeta=
(LogTemplate)beanFactory.getBean(bizLogName);
aopMeta.setReturnValue(returnValue);
aopMeta.setParams(arg2);
aopMeta.setMethod(method);
aopMeta.setTarget(target);
log=aopMeta.getLogMeta();
}else{
//无自定义log逻辑,默认逻辑生成log类
StringBuffermemo=newStringBuffer();
memo.append("
target=\"
"
).append(
target.getClass().getName()).append("
\"
method=\"
)
.append(method.getName()).append("
for(inti=0;
i<
arg2.length;
i++){
param"
).append(i).append("
="
.append(arg2[i]);
}
returnValue=\"
).append(returnValue)
.append("
\r\n"
log=newLogMeta("
wjx"
target.getClass().getName(),newDate());
log.setMemo(memo.toString());
log.setLogDate(newDate());
log.setModelName(target.getClass().getName());
log.setUserName("
system"
}
//添加日志
LogOperlogOper=newLogOperImpl();
logOper.addLog(log);
publicvoidbefore(Methodmethod,Object[]arg1,Objecttarget)
throwsThrowable{
//业务逻辑与afterReturning类似
publicvoidafterThrowing(Methodmethod,Object[]args,Objecttarget,Throwableex){
2)针对需要记录操作日志的服务配置AOP拦截
<
beanid="
businessTarget"
class="
MyTarget"
/>
myAdvice"
MyAdvice"
/>
myLogTemp"
LogTempImpl"
!
--自定义日志实现类列表-->
BizLogList"
>
<
propertyname="
hmItcptMap"
<
map>
<
entrykey="
BizOper"
<
value>
myLogTemp<
/value>
/entry>
/map>
/property>
/bean>
businessBean"
class="
org.springframework.aop.framework.ProxyFactoryBean"
proxyInterfaces"
IBizOper<
interceptorNames"
list>
myAdvice<
/list>
target"
refbean="
/ref>
3)自定义日志时需要实现的模板类
publicabstractclassLogTemplate{
//抽象方法,实现类实现自定义日志
publicabstractLogMetagetLogMeta();
protectedObjectreturnValue;
protectedObject[]params;
protectedMethodmethod;
protectedObjecttarget;
publicvoidsetReturnValue(ObjectreturnValue){
this.returnValue=returnValue;
publicvoidsetParams(Object[]params){
this.params=params;
publicvoidsetMethod(Methodmethod){
this.method=method;
publicvoidsetTarget(Objecttarget){
this.target=target;
配置中也可实现对服务中指定方法的拦截,配置方法可以参考Spring文档。
4)多个拦截间传递参数
实际业务中可能存在一次请求的多个拦截器间传递参数的需求,由于一个请求在同一个线程内完成,我们可以利用线程局部变量进行参数传递。
声明线程局部变量类:
publicclassThreadParam{
publicstaticfinalThreadLocallocalParam;
static{
localParam=newThreadLocal();
publicstaticThreadLocalgetThreadParam(){
returnlocalParam;
在拦截器中设置参数
ThreadParam.getThreadParam().set(newDate());
在拦截器中取参数
DatedtParam=(Date)ThreadParam.getThreadParam().get();
3.2数据存储
针对如上需求,数据被收集后,需要存储到服务器上。
无论操作记录接口方式还是AOP的方式,其存储的过程是一致的。
3.2.1存储机制
存储机制主要分为存入文件或者存入数据库。
3.2.1.1文件存储
根据需求,网站有针对多个内容进行复杂查询的需求,从效率上考虑,文件存储的查询会比较慢,可使用内存缓冲文件的内容,但内存占用较大,算法也比较复杂,与数据库存储方式比起来,很不划算,不建议使用。
3.2.1.2数据库存储
数据库存储可以将每个操作记录存入各自的数据库中,不同网站,数据库不同;
也可以将所有网站的操作记录存入同一数据库中;
同一数据库又可有所有网站同一数据表和每个网站独立数据表的差别。
针对这几种方案进行对比:
独立数据库
统一数据库
独立数据表
单一数据表
数据集中性
日志数据分散,独立于不同数据库
数据集中于一个数据库,但数据表数量大。
数据集中于一个数据库,数据表记录多
性能
数据最分散,效率最好
单个数据库压力大,单个表查询效率与独立数据库近似
数据库、数据表压力大,性能最差
需求
关联业务查询方便,跨网站查询不便
关联业务查询不便,跨网站查询方便
3.2.1.3数据库备份
对于数据备份,目前需求中,要求能够在线查看3个月以内的数据,对于超过时间的数据,能够通过任何技术手段查看到即可,并无明确需求。
针对现在的订单和登录业务,查看3个月以外的日志数据的需求可能性很小。
现在,我们的数据库已经由操作系统的定时任务完成数据库定时备份的功能。
基于如上需求和现状,建议建立系统任务定时由日志数据表中备份数据到独立文件中便于查看,清理日志数据表规定时间以外的数据记录。
4总结
综上所述,AOP方式对操作人员更加透明,且在需要的时候能够满足组件定制日志内容的需求,所以建议采用AOP的方式进行数据收集;
日志的查询与业务紧密关联,将日志表放在网站数据库中,方便业务查询的需要;
定期将日志数据备份到一个文件中,并清理日志数据表,可以保持日志数据表的查询性能同时满足日志查询的需要。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SSH 操作 日志 技术
![提示](https://static.bdocx.com/images/bang_tan.gif)