分享
 
 
 

日志的处理器

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

日志组件的编写

主要实现的几个功能:

1 操作的记录的处理理.

2 处理的灵活多样化.

3 使用的主便性.

首先,定义了一个接口Log,功能为:

addLog添加一条日志记录.

addLogFactory removeLogFactory getFactory添加/移除/获取日志处理工厂

setFinalFactory getFinalFactory 设置/获取最终日志处理工厂.

下面看一下LogFactory接口功能

isAccept某条记录是否由日志处理工厂的处理.

processLog处理日志记录

LogItem(日志项目)的功能如下.

getInput获取取操作时送过来的参数

getOldData获取旧数据(在更新数据时有用)

getStaticItem获取静态的数据(比如,用户名,IP等,比较固定的信息)

LogItem的实现如LogItemImpl所示.可以根据自己的实际需要重新继承LogItem.

LogFactory的实现如DBLogFactory所示.DBLogFactory实现的功能是把日志记录写到数据库中去.使用时LogFactory是要重新继承的部分,参照DBLogFactory即可.

Log的实现现AbstractLog实现了Log的大部分方法(除了addLog以外),基本上可以不用再继承Log,只要继承AbstractLog即可.

SwanLog是Log的一个具体实现一般情况下已经够用.不够的话可以自己承继AbstractLog类即可.

以上的类实现以后剩下的就是使用的问题了.

先来测试运行的情况,我是使用postgresql作为测试的,大家可以把DBLogFactory里的getConnection改成自己的连接.因为写到数据库的表名为tbllog我把tbllog的建表SQL放到附件最后,可以用该语句建立表先.

然后运行SwanLog可以看到数据表中插入了一条记录.

到此为止该日志已经可以用了,剩下的就是使用中的问题了.

相信大家都想在编写程序时不用管Log的问题,只要把程序写好就可以自动建立Log了.下面是该日志添加到代码中的方法.

对WEB程序,直接用我已经写好的类RequestInput,直接从Request里获得Input,然后从session里获取得静态的属性(当然初始化时要先设置好).至于OldData就没什么好办法了.

然后在程序进行Post(或Get)方法之前把代码addLog.如果你的Servlet没继承类或者没有使工作流的话那么就麻烦了,要一个一个的加,如果已经有了那就很简单了直接加就行了.就改一个地方即可.

有的库的日志可能是存在多个表里面的,可以建立多个LogFactory就可以了,只要写一下isAccept方法即可.

对客户端程序或者是RMI…..的程序,最主要的任务就是实现Input方法,相信大家都有自己的数据封装方法,实现起来应该很方便的.

以下是代码供大家浏览,剩余的类如Input….大家可以在我的权限组件的附加代码里找到(最后一篇).如果有什么好建议请与我联系.

========================Log.java===============================

package org.fswan.log;

/**

* @author Swan Fong (方志文)

* E-mail: fswan@yeah.net

* Site: http://blog.csdn.net/fswan

* 2004-11-19 10:37:44

* 日志接口

*/

public interface Log

{

/**

* 添加日志记录

* @param item 日志项目

* @return 添加结果

*/

public int addLog(LogItem item);

/**

* 添加日志处理工厂

* @param fac 日志处理工厂

*/

public void addFactory(LogFactory fac);

/**

* 移除日志处理工厂

* @param fac 日志处理工厂

*/

public void removeFactory(LogFactory fac);

/**

* 获取所有的日志处理工厂

* @return 日志处理工厂

*/

public LogFactory[] getFactory();

/**

* 设置最终日志处理工厂

* @param fac 日志处理工厂

*/

public void setFinalFactory(LogFactory fac);

/**

* 获取最终数据处理工厂

* @return 日志处理工厂

*/

public LogFactory getFinalFactory();

}

============================LogItem.java==================

package org.fswan.log;

import org.fswan.Input;

/**

* @author Swan Fong (方志文)

* E-mail: fswan@yeah.net

* Site: http://blog.csdn.net/fswan

* 2004-11-19 11:17:26

* 日志项目

*/

public interface LogItem

{

/**

* 获取操作信息

* @return 操作信息

*/

public Input getInput();

/**

* 获取原始数据

* @param prop 数据标识

* @return 数据

*/

public String getOldData(String prop);

/**

* 获取静态数据

* @param prop 数据标识

* @return 数据

*/

public String getStaticItem(String prop);

}

==============================LogFactory.java==========================

package org.fswan.log;

/**

* @author Swan Fong (方志文)

* E-mail: fswan@yeah.net

* Site: http://blog.csdn.net/fswan

* 2004-11-19 11:15:00

* 日志处理工厂

*/

public interface LogFactory

{

/**

* 该工厂是否能处理某一日志

* @param item 日志项目

* @return 能否处理

*/

public boolean isAccept(LogItem item);

/**

* 处理日志,处理结果为有理数,不能为负数和0

* @param item 日志项目

* @return 处理结果

*/

public int processLog(LogItem item);

}

=======================DBLogFactory.java ==========================

package org.fswan.log;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Timestamp;

import java.util.Date;

/**

* @author Swan Fong (方志文)

* E-mail: fswan@yeah.net

* Site: http://blog.csdn.net/fswan

* 2004-11-19 14:25:14

* 这个日志工厂把数据存到数据库中,如果成功返回SUCCESS失败返回FAILURE

* 包含字段 IP,用户名,描述,时间,是否成功

* 表名为tbllog,对应的字段为 ip,user,description,date,returnvalue

*

*/

public class DBLogFactory implements LogFactory

{

/**

* 操作成功

*/

public static final int SUCCESS = 1;

/**

* 操作失败

*/

public static final int FAILURE = 2;

/* (non-Javadoc)

* @see org.fswan.log.LogFactory#doneLog(org.fswan.log.LogItem)

*/

public int processLog(LogItem item)

{

Connection conn = getConnection();

try

{

PreparedStatement pst = conn.prepareStatement("insert into tbllog (ip,\"user\",description,processdate,retvalue) values(?,?,?,?,?)");

pst.setInt(1,ipToInt(item.getStaticItem("IP")));

pst.setString(2,item.getStaticItem("user"));

pst.setString(3,"It's Operate");

pst.setTimestamp(4,new Timestamp(new Date().getTime()));

pst.setInt(5,1);

pst.executeUpdate();

conn.close();

return 1;

}catch (SQLException e)

{

e.printStackTrace();

}

return 2;

}

/* (non-Javadoc)

* @see org.fswan.log.LogFactory#isAccept(org.fswan.log.LogItem)

*/

public boolean isAccept(LogItem item)

{

return true;

}

/**

* 获取数据库连接

* @return 数据库联接

*/

public Connection getConnection()

{

try

{

Class.forName("org.postgresql.Driver");

return DriverManager.getConnection("jdbc:postgresql://localhost:5432/hrms","fswan","314843");

} catch (ClassNotFoundException e)

{

e.printStackTrace();

} catch (SQLException e)

{

e.printStackTrace();

}

return null;

}

/**

* 把IP的字符串转成数字型

* @param ip IP的字符串表示

* @return IP对应的数字

*/

public int ipToInt(String ip)

{

String[] ips = ip.split("\\.");

if(ips.length != 4)return -1;

int[] iip = new int[ips.length];

for (int i = 0; i < iip.length; i++)

{

iip[i] = Integer.parseInt(ips[i]);

}

return (iip[0]<<24) | (iip[1] << 16) | (iip[2] << 8) | iip[3];

}

}

========================LogItemImpl.java=====================

package org.fswan.log;

import java.util.HashMap;

import java.util.Properties;

import org.fswan.Input;

/**

* @author Swan Fong (方志文)

* E-mail: fswan@yeah.net

* Site: http://blog.csdn.net/fswan

* 2004-11-19 14:17:04

*

*/

public class LogItemImpl implements LogItem

{

Input input;

HashMap map;

Properties staticItem;

public LogItemImpl(Input input,HashMap map,Properties staticItem)

{

this.input = input;

this.map = map;

this.staticItem = staticItem;

}

/* (non-Javadoc)

* @see org.fswan.log.LogItem#getInput()

*/

public Input getInput()

{

return input;

}

/* (non-Javadoc)

* @see org.fswan.log.LogItem#getOldData(java.lang.String)

*/

public String getOldData(String prop)

{

return ""+map.get(prop);

}

/* (non-Javadoc)

* @see org.fswan.log.LogItem#getStaticItem(java.lang.String)

*/

public String getStaticItem(String prop)

{

return staticItem.getProperty(prop);

}

}

============================AbstractLog.java========================

package org.fswan.log;

/**

* @author Swan Fong (方志文)

* E-mail: fswan@yeah.net

* Site: http://blog.csdn.net/fswan

* 2004-11-19 11:37:24

*

*/

public abstract class AbstractLog implements Log

{

private LogFactory[] facs;

private LogFactory finalFactory;

/* (non-Javadoc)

* @see org.fswan.log.Log#addFactory(org.fswan.log.LogFactory)

*/

public void addFactory(LogFactory fac)

{

if(fac == null) return;

if(facs == null)

{

facs = new LogFactory[1];

facs[0] = fac;

}

else

{

LogFactory[] fs = new LogFactory[facs.length+1];

System.arraycopy(facs,0,fs,0,facs.length);

fs[fs.length-1] = fac;

facs = fs;

}

}

/* (non-Javadoc)

* @see org.fswan.log.Log#getFactory()

*/

public LogFactory[] getFactory()

{

return facs;

}

/* (non-Javadoc)

* @see org.fswan.log.Log#getFinalFactory()

*/

public LogFactory getFinalFactory()

{

return finalFactory;

}

/* (non-Javadoc)

* @see org.fswan.log.Log#removeFactory(org.fswan.log.LogFactory)

*/

public void removeFactory(LogFactory fac)

{

if(fac == null) return;

if(facs == null) return;

for (int i = 0; i < facs.length; i++)

{

if(facs[i] == fac)

{

LogFactory[] fs = new LogFactory[facs.length-1];

System.arraycopy(facs,0,fs,0,i);

System.arraycopy(facs,i+1,fs,i,fs.length-i);

facs = fs;

return;

}

}

}

/* (non-Javadoc)

* @see org.fswan.log.Log#setFinalFactory(org.fswan.log.LogFactory)

*/

public void setFinalFactory(LogFactory fac)

{

finalFactory = fac;

}

}

==========================SwanLog.java============================

package org.fswan.log;

import java.util.Properties;

/**

* @author Swan Fong (方志文)

* E-mail: fswan@yeah.net

* Site: http://blog.csdn.net/fswan

* 2004-11-19 11:49:27

* 实现的日志处理器,先在LogFactory里找到合适的处理器并进行处理,如果处理不了再在最终处理器处理,处理后的返回值是false

*

*/

public class SwanLog extends AbstractLog

{

public static final int HAVENTPROCESS = 0;

public SwanLog()

{

addFactory(new DBLogFactory());

}

/* 如果是factory进行处理的返回值为处理返回的值,如果是最终处理器处理返回值为处理返回值的负数

* (non-Javadoc)

* @see org.fswan.log.Log#addLog(org.fswan.log.LogItem)

*/

public int addLog(LogItem item)

{

LogFactory[] fs = getFactory();

if(fs != null)

{

for (int i = 0; i < fs.length; i++)

{

if(fs[i].isAccept(item))

{

return fs[i].processLog(item);

}

}

}

LogFactory f = getFinalFactory();

if(f!=null)

if(f.isAccept(item))

{

return -f.processLog(item);

}

return HAVENTPROCESS;

}

public static void main(String[] args)

{

Properties p = new Properties();

p.setProperty("user","Swan");

p.setProperty("IP","202.192.133.145");

new SwanLog().addLog(new LogItemImpl(null,null,p));

}

}

==========================tbllog.script=========================

CREATE TABLE tbllog

(

ip int8,

"user" varchar(40),

description varchar(4000),

processdate timestamp,

retvalue int2

)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有