??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成人网毛片在线播放,亚洲精品无码aⅴ中文字幕蜜桃,亚洲一区二区三区成人网站http://www.tkk7.com/kit-soft/zh-cnSat, 10 May 2025 19:06:53 GMTSat, 10 May 2025 19:06:53 GMT60tomcat 三种集群方式http://www.tkk7.com/kit-soft/archive/2009/08/28/292983.htmlkit_lokit_loFri, 28 Aug 2009 07:08:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/28/292983.htmlhttp://www.tkk7.com/kit-soft/comments/292983.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292983.html#Feedback5http://www.tkk7.com/kit-soft/comments/commentRss/292983.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292983.html 2.使用Apache R-proxy方式?br style="font-family: " /> 3.使用Apache mod_jk方式.
 
DNS轮询的缺ҎQ当集群中某台服务器停止之后Q用L于dns~存的缘故,便无法访问服务,
必须{到dns解析更新Q或者这台服务器重新启动?br style="font-family: " /> q有是必须把集中的所有服务端口暴露给外界Q没有用apache做前|代理的方式安全Q?br style="font-family: " /> q且占用大量公网IP地址Q而且tomcatq要负责处理静态网资源,影响效率?br style="font-family: " /> 优点是集配|最单,dns讄也非常简单?br style="font-family: " />  
R-proxy的缺ҎQ当其中一台tomcat停止q行的时候,apache仍然会{发请求过去,D502|关错误?br style="font-family: " /> 但是只要服务器再启动׃存在q个问题?br style="font-family: " />  
mod_jk方式的优ҎQApache 会自动检到停止掉的tomcatQ然后不再发hq去?br style="font-family: " /> ~点是Q当停止掉的tomcat服务器再ơ启动的时候,Apache不刎ͼ仍然不会转发hq去?br style="font-family: " />  
R-proxy和mod_jk的共同优Ҏ.可以只将Apache|于公网Q节省公|IP地址资源?br style="font-family: " /> 可以通过讄来实现Apache专门负责处理静态网,让Tomcat专门负责处理jsp和servlet{动态请求?br style="font-family: " /> 共同~点是:如果前置Apache代理服务器停止运行,所有集服务将无法对外提供?br style="font-family: " /> R-proxy和mod_jk寚w态页面请求的处理Q都可以通设|来选取一个尽可能优化的效果?br style="font-family: " /> q三U方式对实现最佌载均衡都有一定不Imod_jk相对好些Q可以通过讄lbfactor参数来分配请求Q务,但又因ؓmod_jk2方式不被推荐Qmod_jk2已经不再被更C。郁闷中……
  哈哈Q发现apache2.2以后与tomcat做负载均衡不需要用mod_jk2,在配|文件中E做修改OK



kit_lo 2009-08-28 15:08 发表评论
]]>
JavaEE应用E序在Glassfish上的性能调优案例分析http://www.tkk7.com/kit-soft/archive/2009/08/28/292982.htmlkit_lokit_loFri, 28 Aug 2009 07:07:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/28/292982.htmlhttp://www.tkk7.com/kit-soft/comments/292982.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292982.html#Feedback1http://www.tkk7.com/kit-soft/comments/commentRss/292982.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292982.html

Java EE应用的性能问题对严肃的目和品来说是一个非帔R要的问题。特别是企业U的应用Qƈ发用户多Q数据传输量大,业务逻辑复杂Q占用系l资源多Q因此性能问题在企业应用变得臛_重要Q它和系l的E_性有着直接的联pR更加重要的是,性能好的应用在完成相同Q务的条g下,能够占用更少的资源,获得更好的用户体验,换句话说Q就是能够节省费用和消耗,获得更高的利润?/span>

要获得更好的性能Q就需要对原来的系l进行性能调优。对q行在Glassfish上的JavaEE应用Q调优是一件相对复杂的事情。在调优以前必须要认识到Q对JavaEE的系l,调优是多层次的。一个JavaEE的应用其实是整个pȝ中很的一部分。开发h员所开发的JavaEEE序Q无论是JSPq是 EJBQ都是运行在JavaEE应用服务器(GlassfishQ之上。而应用服务器本n也是Java语言~写的,需要运行在Java虚拟Z上?Java虚拟Z只不q是操作pȝ的一个应用而已Q和其他的应用(如ApacheQ对于操作系l来说没有本质的区别。而操作系l却q行在一定的g环境中,包括CPUQ内存,|卡和硬盘等{。在q么多的层次中,每一个层ơ的因素都会影响整个pȝ的性能。因此,对一个系l的调优Q事实上需要同时对每个层次都要调优。JavaEE应用性能调优不仅仅和Glassfish有关QJava语言有关Q还要和操作pȝ以及g都有关系Q需要调优者有l合的知识和技能。这些不同层面的Ҏ需要综合纵效,l合在一LzM用,才能快速有效的定位性能瓉。下面是一些具体的案例分析:

 

内存泄漏问题

        某个JavaEE应用q行?颗CPU的服务器上。上U运行发现性能不稳定。性能随着旉的增加而越来越慢。通过操作pȝ的工PmpstatQ,发现在系l很慢的时候,只有一颗CPU很忙Q其他的CPU都很I闲。因此怀疑是Java虚拟机经常进行内存回Ӟ因ؓ虚拟机在内存回收的时候,有的回收法通常只能q行在一个CPU上。通过Java虚拟机的工具“jstat”可以清楚的看刎ͼJava虚拟行内存回收的频率非常高,几乎?U中有一ơ,每次回收的时间ؓ2U钟。另外,通过“jstat”的输发现每次回收释放的内存非常有限,大多数对象都无法回收。这U现象很大程度上暗示着内存泄漏。?Java虚拟机的工具“jmap”来获得当前的一个内存映象。发现有很多Q超q?0000Q个的session对象。这是不正常的一个现象。一般来_ session对应于一个用L多次讉KQ当用户退出的时候,session应该失效,对象应该被回收。当我们和这个系l的开发工E师了解有关 session的设|,发现当他们部|应用的时候,竟然session的timeout旉讄?0分钟Qƈ且没有提供logout的接口。这L讄下,每个session的数据都会保?0分钟才会被回收。根据我们的Q系l提供了logout的链接,q且告诉用户如果退出应用,应该点击q个 logout的链接;q且session的timeout旉修改?分钟。通过几天的测试,证明泄漏的问题得到解冟?/p>

 

数据库连接池问题

        某胦务应用运行在JavaEE服务器上Q后台连接Oracle数据库。ƈ发用h量超q?00人左右的时候系l停止响应。通过操作pȝ层面的进E监控工具发现进Eƈ没有被杀L挂vQ而CPU使用率几乎ؓ零。那么是什么原因导致系l停止响应用戯求呢Q我们利用Java虚拟机的工具Qkill -3 pidQ将当前的所有线E状态DUMP出来Q发现JavaEE服务器的大部分处理线E都在等待数据库q接池的q接Q而那些已l获得数据库q接的线E却处于d状态。数据库理员应要求查了数据库的状态,发现所有的q接的session都处于死锁状态。显Ӟq是因ؓ数据库端出现了死锁的操作Q阻塞了那些有数据库操作的请求,占用了所有数据库q接池中的连接。后l的h如果q要从连接池中获取连接,׃d在连接池上。当解决数据库死锁的问题之后Q性能问题q刃而解?/p>

 

大对象缓存问?/h3>

        电信应用q行?4位Java虚拟ZQ系l运行得很不E_Q系l经常停止响应。用进E工h看,发现q程q没有被杀L挂v。利用Java虚拟机的工具发现pȝ在长旉的进行内存回Ӟ内存回收的时间长?5分钟Q整个系l在内存回收的时候就像挂起一栗另外还观察到系l用了12G的内存(因ؓ?64位虚拟机所以突破了4G内存的限Ӟ。从开发h员那里了解到Q这个应用ؓ了提高性能Q大量用了对象~存Q但是事与愿q,在Java中用过多的内存Q虽然在正常q行的时候能够获得很好的性能Q但是会大大增加内存回收的时间。特别是对象~存Q本pȝ使用?G的缓存空_q存了6000多万个对象,对这些对象的遍历D了长旉的内存回收。根据我们的Q将~存I间减少?GQƈ调整回收法Q用增量回收的法Q,使得pȝ׃内存回收而造成的最大停时间减到4U,基本满用户的需求?/p>


外部命o问题

        数字校园应用q行?CPU的Solaris10服务器上Q中间g为JavaEE服务器。系l在做大q发压力试的时候,h响应旉比较慢,通过操作pȝ的工PmpstatQ发现CPU使用率比较高。ƈ且系l占用绝大多数的CPU资源而不是应用本w。这是个不正常的现象Q通常情况下用户应用的CPU占用率应该占主要CQ才能说明系l是正常工作。通过Solaris 10的Dtrace脚本Q我们查看当前情况下哪些pȝ调用p了最多的CPU资源Q竟然发现最pCPU的系l调用是“fork”。众所周知Q?“fork”pȝ调用是用来生新的进E,在Java虚拟Z只有U程的概念,l不会有q程的生。这是个非常异常的现象。通过本系l的开发h员,我们扑ֈ了答案:每个用户h的处理都包含执行一个外部shell脚本Q来获得pȝ的一些信息。这是通过Java?#8220;Runtime.getRuntime ().exec”来完成的Q但是这U方法在Java中非常消耗资源。Java虚拟机执行这个命令的方式是:首先克隆一个和当前虚拟ZLq程Q再用这个新的进E去执行外部命oQ最后再退个进E。如果频J执行这个操作,pȝ的消耗会很大Q不仅在CPUQ内存操作也很重。用h据徏议去掉这个shell 脚本执行的语句,pȝ立刻回复了正常?/p>


文g操作问题

        内容理QCMSQ系l运行在JavaEE服务器上Q当pȝ长时间运行以后,性能非常差,用户h的g时比pȝ刚上U的时候要大很多,q且用户的ƈ发量很小Q甚x单个用户也很慢。通过操作pȝ的工兯察,一切都很正常,CPU利用率不高,IO也不是很大,内存很富余,|络几乎没有压力Q因为ƈ发用户少Q。先不考虑U程互锁的问题,因ؓ单个用户性能也不好。通过Java虚拟察也没有发现什么问题(内存回收很少发生Q。这使得我们不得不用代码跟t器来全E跟t代码。我们采用了Netbeans的ProfilerQ跟t的l果非常意外Q用戯求的90Q的旉在创建新文g。从pȝ设计人员了解刎ͼ此系l用了一个目录用于保存所有上传和׃n的文Ӟ文g用其命名方式来唯一区别于其他文件。我们查看了那个文g目录Q发现该目录下已l拥?0万个文g了。这时候我们才定位到问题了Q在同个目录下放|太多的文gQ在创徏新文件的时候,pȝ的开销是比较大的,例如Z防止重名Q文件系l会遍历当前目录下所有的文g名等{。根据我们的Q将文g分类保存在不同的目录下,性能有了大幅度的提高?/p>


高速缓存命中率问题

        q行在JavaEE服务器上的ERPpȝQ在CPU充分利用的情况下性能仍然不太好。从操作pȝ层面上观察不C么大问题Q而且ERPpȝq于复杂Q代码跟t比较困难。于是进行了CPU状态的q一步检查,发现CPU的TLB命中率不是很高,于是对Java虚拟机的启动参数q行了修改,虚拟Z用大寸的内存页面,提高TLB的命中率。下面的参数是在Sun的HOTSPOT中调整大寸Q?MQ页面的讄Q?br /> -XX:+AggressiveHeap
-XX:LargePageSizeInBytes=256m
通过调整QTLB命中明显提高Q性能也得到近40Q的提升?/p>


转蝲之:http://developers.sun.com.cn/blog/yutoujava/entry/8



kit_lo 2009-08-28 15:07 发表评论
]]>
F5负蝲均衡配置手册http://www.tkk7.com/kit-soft/archive/2009/08/28/292981.htmlkit_lokit_loFri, 28 Aug 2009 07:06:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/28/292981.htmlhttp://www.tkk7.com/kit-soft/comments/292981.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292981.html#Feedback0http://www.tkk7.com/kit-soft/comments/commentRss/292981.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292981.html

负蝲均衡器通常UCؓ四层交换机或七层交换机。四层交换机主要分析IP层及TCP/UDP层,实现四层量负蝲均衡。七层交换机除了支持四层负蝲均衡以外Q还有分析应用层的信息,如HTTP协议URI或Cookie信息?/p>

一、F5配置步骤Q?br /> 1、F5l网规划
(1)l网拓朴图(具体到网l设备物理端口的分配和连接,服务器网卡的分配与连接)
(2)IP地址的分配(具体到网l设备和服务器网卡的IP地址的分配)
(3)F5上业务的VIP、成员池、节炏V负载均衡算法、策略保持方法的定

2、F5配置前的准备工作
(1)版本?br /> f5-portal-1:~# b version
Kernel:
BIG-IP Kernel 4.5PTF-07 Build18
(2)旉查-Q如不正,请到单用h式下q行修改
f5-portal-1:~# date
Thu May 20 15:05:10 CST 2004
(3)甌licenseQ-现场用的F5都需要自己到F5|站上申请license

3、F5 的通用配置
(1)在安全要求允许的情况下,在setup菜单中可以打开telnet及ftp功能Q便于以后方便维?br /> (2)配置vlan unique_mac选项Q此选项是保证F5上不同的vlan 的MAC地址不一栗在~省情况下,F5的各个vlan的MAC地址是一LQ徏议在配置Ӟ把此统一选择上。可用命令ifconfig –a来较?
具体是system/Advanced Properties/vlan unique_mac
(3)配置snat any_ip选项选项Q此选项Z保证内网的机器做了snat后,可以对ping的数据流作{换。Ping是第三层的数据包Q缺省情况下F5是不对ping的数据包作{换,也就是internal vlan的主机无法ping external vlan的机器。(注意Q还可以采用telnet来验证。)
具体是system/Advanced Properties/snat any_ip

4、F5 的初始化配置
在对F5q行初始旉用命令行方式来进行初始化Q用Web面初始化的方式有时会有问题Q。登录到命o行上Q运行config或setup命o可以q行初始化配|。初ơ运行时会提CZ些license的信息?br /> default:~# config

5、F5双机切换监控配置Q有F5双机旉要)
(1)在web面中选择相应的vlanQ在arm failsafe选择则可。TimeoutZF5收不到包的时间vQ经q多长时间就发生切换。此配置不能同步Q需要在F5的主备机上同旉|。每个vlan都可以配|vlan arm failsafe?br /> 具体在Network?br /> (2)在web面中选择systemQ在redundant properties中把gateway failsafe选择则可。Router是需要监控的地址。此配置不能同步Q需要在F5的主备机上同旉|。一套F5上只能配|一个gateway failsafe
具体在system/redundant properties/gateway failsafe

6、F5 MAC masquerade配置
Mac Masquerading是F5的Shared IP Address (Floating)的MAC地址QF5如果不配|此,则shared IP Address的MAC地址与每台F5的vlan self IP Address的MAC地址是一L?br /> 一般服务器是以shared IP Address为网养I在两台F5上都配置了Mac MasqueradeQ相同的MAC地址Q,q样当F5发生切换后,服务器上shared IP address的MAC不变Q保证了业务的不中断
具体在Network?/p>

7、F5的pool配置
(1)在配|工具Web面的导航面板中选择“Pools”中的“Pools”标签Q点?#8220;ADD”按钮d服务器池(Pool)?br /> (2)在池属性(Pool PropertiesQ中?#8220;Load Balancing Method”表格中选择负蝲均衡{略Q通常采用默认{略Q?#8220;Round Robin”
(3)?#8220;Resouces”表格中的“Member Address”文本框输入成员IP地址Q在“Service”文本框中输入服务端口Q点?#8220;>>”d?#8220;Current Members”当前成员列表中?br /> (4)d所有组成员Q点?#8220;Done”完成配置?
(5)?#8220;Pools”中的“Pool Name”列选中特定池,然后池属性页面中选择“Persistence”标签?
(6)?#8220;Persistence Type”表格中选定会话保持cd。点?#8220;Apply”应用配置?

8、F5的virtual server配置
(1)在配|工具Web面的导航面板中选择“Virtual Servers”中的“Virtual Servers”标签Q点?#8220;ADD”按钮d虚拟服务器?
(2)?#8220;Add Virtual Server”H口?#8220;Address”文本框中输入虚拟服务器IP地址Qƈ?#8220;Service”文本框中输入服务端口h在下拉框中选择现有的服务名Uͼ点击“Next”执行下一步?
(3)?#8220;Add Virtual Server”H口?#8220;Configure Basic Properties”面中点?#8220;Next”执行下一步??#8220;Add Virtual Server”H口?#8220;Select Physical Resources”面中点d选按?#8220;Pool”Qƈ在下拉框中选择虚拟服务器对应的负蝲均衡池?
(4)?#8220;Done”完成创徏虚拟服务器?

9、F5的monitor的配|?br /> (1)在配|工具Web面的导航面板中选择“Monitor”中的“Monitors”标签Q点?#8220;ADD”按钮d监控
(2)Ҏ需要选择相关兌cdQ?#8220;Node Associations”标签、Node Address Associations”标签、Service Associations”标签?br /> (3)被选关联标{中Q在“Choose Monitor”表格中选择监控名称Q点?#8220;>>”按钮d?#8220;Monitor Rule”监控规格文本框中。监控规则可以ؓ一条或多条?br /> (4)选择监控规则后,在对应节点的“Associate Current Monitor Rule”复选框中选中。如果欲删除监控兌Q则选中对应节点?#8220;Delete Existing Assocation”复选框?br /> (5)点击“Apply”兌监控

10、F5的SNAT配置
(1)在配|工具Web面的导航面板中选择“NATs”中的“SNATs”标签Q点?#8220;ADD”按钮dSNAT地址?
(2)?#8220;Add SNAT”H口?#8220;Translation Address”?#8220;IP”文本框中输入SNAT IP地址Qƈ?#8220;Origin List”?#8220;Origin Address”文本框中输入节点IP地址或在“Origin VLAN”下拉框中选择VLAN名称Q点?#8220;>>”加入“Current List”列表?
(3)?#8220;Done”完成dSNAT IP地址?

11、F5d机同步及切换校验
具体在system/Redundant Properties/synchonize Config...

12、业务的校验
F5d机切换的校验
F5dZ务运行的校验

其中1~6是基本配|,7~10业务配置Q?1~12校验

二、F5负蝲均衡器的l护

1、F5节点及应用的?br /> 通过“System -> Network Map”面查看节点及应用状?br /> l色:节点或虚拟服务器?#8220;UP”
U色:节点或虚拟服务器状态ؓ“Down”
灰色:节点或虚拟服务器被禁?/p>

2、日志的?br /> (1)当天日志Q从web上查看logs中的system log、bigip log、monitor logQ看日志中是否有异常?
(2)7天内的日?br /> pȝ日志文g - /var/log/messages消息, pȝ消息
BIG-IP 日志文g - /var/log/bigip
“External” BIG-IP events
Monitor 日志文g - /var/log/bigd
“Internal” BIG-IP Events
3DNS 日志文g - /var/log/3dns
3DNS Information
用gzcat、more、vi命o打开

3、F5量的检?br /> (1)业务上的基本l护主要是在F5上查看F5分发到各节点的connect是否负蝲均衡Q一般不应有数量U的差别
(2)通过WEB->pool-> pool statistics中查看connection中的total和current,不应有明昄数量U的差别
(3)F5 qkview命o
执行qkviewQ执行完成后输Z息保存在文g“/var/tmp/-tech.out”中,供高U技术支持用
(4)F5 tcpdump命o
TCPDUMP是Unixpȝ常用的报文分析工PTCPDUMPl常用于故障定位Q如会话保持失效、SNAT通信问题{?br /> tcpdump [ -adeflnNOpqRStvxX ] [ -c count ] [ -F file ]
[ -i interface ] [ -m module ] [ -r file ]
[ -s snaplen ] [ -T type ] [ -w file ]
[ -E algo:secret ] [ expression ]



kit_lo 2009-08-28 15:06 发表评论
]]>
web 容器比较 tomcat jboss resin weblogic websphere glassfishhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292980.htmlkit_lokit_loFri, 28 Aug 2009 07:05:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/28/292980.htmlhttp://www.tkk7.com/kit-soft/comments/292980.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292980.html#Feedback0http://www.tkk7.com/kit-soft/comments/commentRss/292980.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292980.html

1. Tomcat是Apache鼎力支持的Java Web应用服务器,׃它优U的稳定性以及丰富的文档资料Q广泛的使用人群Q从而在开源领域受到最q泛的青睐?shy;

2. Jboss作ؓJava EE应用服务器,它不但是Servlet容器Q而且是EJB容器Q从而受C业开发h员的Ƣ迎Q从而I补了Tomcat只是一个Servlet容器的缺憾?shy;

3. Resin也仅仅是一个Servlet容器Q然而由于它优秀的运行速度Q得它在轻量Java Web领域备受喜爱Q特别是在互联网Web服务领域Q众多知名公叔R采用其作Z们的Java Web应用服务器,譬如163、ku6{?shy;

在商用应用服务器里主要有QWeblogic、WebsphereQ其中Weblogic我也使用q很长一D|_当时也只用其当Servlet容器Q然而就在同{条件下Q在性能及易用性等斚wQ要比Tomcat优秀很多?shy;

4.glassfish是Sun公司推出的Java EE服务器,一个比较活跃的开源社?不断的通过C֌的反馈来提高其的可用?l过glassfish v1 glassfish v2 C天的glassfish v3 ,它已l走向成?Glassfish是一个免贏V开放源代码的应用服务,它实CJava EE 5QJava EE 5 q_包括了以下最新技术:EJB 3.0、JSF 1.2、Servlet 2.5、JSP 2.1、JAX-WS 2.0、JAXB 2.0?Java Persistence 1.0、Common Annonations 1.0、StAX 1.0{?­

     支持集群,通过内存中会话状态复?增强了部|体pȝ构的可用性与可׾~?它对集群有着很好的支?可以单到通过d机器,可L的提高网站的带负载能?在解析能力方?它对html的吞吐能力与apache服务器不分上?是tomcat所不能比的,支持目录部v,热部|?解决了tomcat对热部v能力的缺?在版本方面做的更加h性化,有开发时用的化版,专门用于部vweb目的版?q要完全W合j2ee标准的版?­



kit_lo 2009-08-28 15:05 发表评论
]]>
使用 Java 开源工具徏立一个灵zȝ搜烦引擎(? http://www.tkk7.com/kit-soft/archive/2009/08/28/292978.htmlkit_lokit_loFri, 28 Aug 2009 07:03:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/28/292978.htmlhttp://www.tkk7.com/kit-soft/comments/292978.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292978.html#Feedback0http://www.tkk7.com/kit-soft/comments/commentRss/292978.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292978.html
为应用程序添加搜索能力经常是一个常见的需求。本文介l了一个框Ӟ开发者可以用它以最的付出实现搜烦引擎功能Q理x况下只需要一个配|文件。该框架Z若干开源的库和工具Q如 Apache LuceneQSpring 框架Qcpdetector {。它支持多种资源。其中两个典型的例子是数据库资源和文件系l资源。Indexer 寚w|的资源q行索引q传输到中央服务器,之后q些索引可以通过 API q行搜烦。Spring 风格的配|文件允许清晰灵zȝ自定义和调整。核?API 也提供了可扩展的接口?
引言

为应用程序添加搜索能力经常是一个常见的需求。尽已l有若干E序库提供了Ҏ索基设施的支持,然而对于很多h而言Q用它们从头开始徏立一个搜索引擎将是一个付Z而且可能乏味的过E。另一斚wQ很多的型应用对于搜烦功能的需求和应用场景h很大的相似性。本文试图以对多数小型应用的适用性ؓ出发点,?Java 语言构徏一个灵zȝ搜烦引擎框架。用这个框Ӟ多数情Ş下可以以最的付出建立起一个搜索引擎。最理想的情况下Q甚臛_需要一个配|文件。特D的情Ş下,可以通过灉|地对框架q行扩展满需求。当Ӟ如题所qͼq都是借助开源工L力量?


基础知识

Apache Lucene 是开发搜索类应用E序时最常用?Java cdQ我们的框架也将Z它。ؓ了下文更好的描述Q我们需要先了解一些有?Lucene 和搜索的基础知识。注意,本文不关注烦引的文g格式、分词技术等话题?

什么是搜烦和烦?/span>

从用L角度来看Q搜索的q程是通过关键字在某种资源中寻扄定的内容的过E。而从计算机的角度来看Q实现这个过E可以有两种办法。一是对所有资源逐个与关键字匚wQ返回所有满_配的内容Q二是如同字怸样事先徏立一个对应表Q把关键字与资源的内容对应v来,搜烦时直接查找这个表卛_。显而易见,W二个办法效率要高得多。徏立这个对应表事实上就是徏立逆向索引Qinverted indexQ的q程?
Lucene 基本概念

Lucene ?Doug Cutting ?Java 开发的用于全文搜烦的工具库。在q里Q我假设读者对其已有基本的了解Q我们只对一些重要的概念要介l。要深入了解可以参?参考资?中列出的相关文章和图书。下面这些是 Lucene 里比较重要的cR?
DocumentQ烦引包含多?Document。而每?Document 则包含多?Field 对象。Document 可以是从数据库表里取出的一堆数据,可以是一个文Ӟ也可以是一个网늭。注意,它不{同于文件系l中的文件?
FieldQ一?Field 有一个名Uͼ它对?Document的一部分数据Q表C文档的内容或者文档的元数据(与下文中提到的资源元数据不是一个概念)。一?Field 对象有两个重要属性:Store ( 可以?YES, NO, COMPACT 三种取?) ?Index ( 可以?TOKENIZED, UN_TOKENIZED, NO, NO_NORMS 四种取?)
QueryQ抽象了搜烦时用的语句?
IndexSearcherQ提供Query对象l它Q它利用已有的烦引进行搜索ƈq回搜烦l果?
HitsQ一个容器,包含了指向一部分搜烦l果的指针?
使用 Lucene 来进行编制烦引的q程大致为:输入的数据源统一为字W串或者文本流的Ş式,然后从数据源提取数据Q创建合适的 Field d到对应该数据源的 Document 对象之中?


pȝ概览

要徏立一个通用的框Ӟ必须对不同情늚共性进行抽象。反映到设计需要注意两炏V一是要提供扩展接口Q二是要量降低模块之间的耦合E度。我们的框架很简单地分ؓ两个模块Q烦引模块和搜烦模块。烦引模块在不同的机器上各自q行对资源的索引Qƈ把烦引文Ӟ事实上,下面我们会说刎ͼq有元数据)l一传输到同一个地方(可以是在q程服务器上Q也可以是在本地Q。搜索模块则利用q些从多个烦引模块收集到的数据完成用L搜烦h?/span>

?1 展现了整体的框架。可以看刎ͼ两个模块之间相对是独立的Q它们之间的兌不是通过代码Q而是通过索引和元数据。在下文中,我们会详细介绍如何Z开源工兯计和实现q两个模块?/span>


?1. pȝ架构?/span>


建立索引

可以q行索引的对象有很多Q如文g、网cRSS Feed {。在我们的框架中Q我们定义可以进行烦引的一cd象ؓ资源。从实现l节上来_从一个资源中可以提取出多?Document 对象。文件系l资源和数据库结果集资源都是资源的代表性例子?/span>

前面提到Q从资源中收集到的烦引被l一传送到同一个地方,以被搜烦模块所用。显焉了烦引之外,搜烦模块需要有对资源更多的了解Q如资源的名U、搜索该资源后搜索结果的呈现格式{。这些额外的附加信息UCؓ资源的元数据。元数据和烦引数据一同被攉hQ放|到某个特定的位|?/span>

要地介绍q资源的概念之后Q我们首先ؓ其定义一?Resource 接口。这个接口的声明如下?/span>


清单 1. Resource 接口
public interface Resource {
// RequestProcessor 对象被动C资源中提?DocumentQƈq回提取的数?/span>
public int extractDocuments(ResourceProcessor processor);

// d?DocumentListener 在每一?Document 对象被提取出时被调用
public void addDocumentListener(DocumentListener l);

// q回资源的元数据
public ResourceMetaData getMetaData();
}


其中元数据包含的字段见下表。在下文中,我们q会对元数据的用途做更多的介l?/span>


?1. 资源元数据包含的字段
属?cd 含义
resourceName String 资源的唯一名称
resourceDescription String 资源的介l性文?
hitTextPattern String 当文档被搜烦到时Q这?pattern 规定了结果显C的格式
searchableFields String[] 可以被搜索的字段名称

?DocumentListener 的代码如下?/span>


清单 2. DocumentListener 接口
public interface DocumentListener extends EventListener {
public void documentExtracted(Document doc);
}



Z让烦引模块能够知道所有需要被索引的资源,我们在这里?Spring 风格?XML 文g配置索引模块中的所有组Ӟ其是所有资源。您可以?下蝲部分 查看一个示例配|文件?/span>

Z么选择使用 Spring 风格的配|文Ӟ

q主要有两个好处Q?

仅依赖于 Spring Core ?Spring Beans 便免M定义配置机制和解析配|文件的负担Q?
Spring ?IoC 机制降低了框架的耦合性,q扩展框架变得单;



Z以上内容Q我们可以大致描q出索引模块工作的过E:

首先?XML 配置?bean 中找出所?Resource 对象Q?
Ҏ一个调用其 extractDocuments() ҎQ这一步除了完成对资源的烦引外Q还会在每次提取Z?Document 对象之后Q通知注册在该资源上的所?DocumentListenerQ?
接着处理资源的元数据QgetMetaData() 的返回|Q?
缓存里的数据写入到本地盘或者传送给q程服务器;

在这个过E中Q有两个地方值得注意?/span>

W一Q对资源可以注册 DocumentListener 使得我们可以在运行时d索引q程有更为动态的控制。D一个简单例子,Ҏ个文章发布站点的文章q行索引Ӟ一个很正常的要求便是发布时间更靠近当前旉的文章需要在搜烦l果中排在靠前的位置。每文章显然对应一?Document 对象Q在 Lucene 中我们可以通过讄 Document ?boost 值来对其q行加权。假讑օ中文章发布时间的 Field 的名UCؓ PUB_TIMEQ那么我们可以ؓ资源注册一?DocumentListenerQ当它被通知Ӟ则检?PUB_TIME 的|Ҏ距离当前旉的远q进行加权?/span>

W二点很昄Q在q个q程中,extractDocuments() Ҏ的实C不同cd的资源而各异。下面我们主要讨ZU类型的资源Q文件系l资源和数据库结果集资源。这两个c都实现了上面的 接口?/span>

文gpȝ资源

Ҏ件系l资源的索引通常从一个基目录开始,递归处理每个需要进行烦引的文g。该资源有一个字W串数组cd?excludedFiles 属性,表示在处理文件时需要排除的文gl对路径的正则表辑ּ。在递归遍历文gpȝ树的同时Q绝对\径匹?excludedFiles 中Q意一的文g不会被处理。这主要是考虑C般我们只需要对一部分文g夹(比如排除可能存在的备份目录)中的一部分文gQ如 doc, ppt 文g{)q行索引?/span>

除了所有文件共有的文g名、文件\径、文件大和修改旉{?FieldQ不同类型的文g需要有不同的处理方法。ؓ了保留灵zL,我们使用 Strategy 模式装对不同类型文件的处理方式。ؓ此我们抽象出一?DocumentBuilder 的接口,该接口仅定义了一个方法如下:


清单 3. DocumentBuilder 接口
public interface DocumentBuilder {
Document buildDocument(InputStream is);
}

什么是 Strategy 模式Q?/span>

Ҏ Design patterns: Elements of reusable object orientated software 一书:Strategy 模式“定义一pd的算法,把它们分别封装v来,q且使它们相互可以替换。这个模式得算法可以独立于使用它的客户而变化?#8221;


不同?DocumentBuilderQStrategyQ?用于从一个输入流中读取数据,处理不同cd的文件。对于常见的文g格式来说Q都有合适的开源工具帮助进行解析。在下表中我们列举一些常见文件类型的解析办法?/span>

文gcd 常用扩展?可以使用的解析办?
U文本文?txt 无需cd解析
RTF 文档 rtf 使用 javax.swing.text.rtf.RTFEditorKit c?
Word 文档Q非 OOXML 格式Q?doc Apache POI Q可配合使用 POI ScratchpadQ?
PowerPoint 演示文稿Q非 OOXML 格式Q?xls Apache POI Q可配合使用 POI ScratchpadQ?
PDF 文档 pdf PDFBoxQ可能中文支持欠佻I
HTML 文档 htm, html JTidy, Cobra

q里?Word 文gZQ给Z个简单的参考实现?/span>


清单 4. 解析U文本内容的实现
// WordDocument ?Apache POI Scratchpad 中的一个类
Document buildDocument(InputStream is) {
String bodyText = null;
try {
WordDocument wordDoc = new WordDocument(is);
StringWriter sw = new StringWriter();
wordDoc.writeAllText(sw);
sw.close();
bodyText = sw.toString();
} catch (Exception e) {
throw new DocumentHandlerException("Cannot extract text from a Word document", e);
}
if ((bodyText != null) && (bodyText.trim().length() > 0)) {
Document doc = new Document();
doc.add(new Field("body", bodyText, Field.Store.YES, Field.Index.TOKENIZED));
return doc;
}
return null;
}



那么如何选择合适的 Strategy 来处理文件呢QUNIX pȝ下的 file(1) 工具提供了从 magicnumber 获取文gcd的功能,我们可以使用 Runtime.exec() Ҏ调用q一命o。但q需要在?file(1) 命o的情况下Q而且q不能识别出所有文件类型。在一般的情况下我们可以简单地Ҏ扩展名来使用合适的cd理文件。扩展名和类的映关pd?properties 文g中。当需要添加对新的文gcd的支持时Q我们只需d一个新的实?DocumentBuilder 接口的类Qƈ在映文件中d一个映关pd可?/span>

数据库结果集资源

大多数应用用数据库作ؓ怹存储Q对数据库查询结果集索引是一个常见需求?/span>

生成一个数据库l果集资源的实例需要先提供一个查询语句,然后执行查询Q得C个结果集。这个结果集中的内容便是我们需要进行烦引的对象。extractDocuments 的实C是ؓl果集中的每一行创Z?Document 对象。和文gpȝ资源不同的是Q数据库资源需要放?Document 中的 Field 一般都存在在查询结果集之中。比如一个简单的文章发布站点Q对其后台数据库执行查询 SELECT ID, TITLE, CONTENT FROM ARTICLE q回一个有三列的结果集。对l果集的每一行都会被提取Z?Document 对象Q其中包含三?FieldQ分别对应这三列?/span>

然而不?Field 的类型是不同的。比?ID 字段一般对?Store.YES ?Index.NO ?FieldQ?TITLE 字段则一般对?Store.YES ?Index.TOKENIZED ?Field。ؓ了解册个问题,我们在数据库l果集资源的实现中提供一个类型ؓ Properties ?fieldTypeMappings 属性,用于讄数据库字D|对应?Field 的类型。对于前面的情况来说Q这个属性可能会被配|成cMq样的Ş式:

ID = YES, NO
TITLE = YES, TOKENIZED
CONTENT = NO, TOKENIZED


配合q个映射Q我们便可以生成合适类型的 FieldQ完成对l果集烦引的工作?/span>


攉索引

完成对资源的索引之后Q还需要让索引为搜索模块所用。前面我们已l说q这里介l的框架主要用于型应用Q考虑到复杂性,我们采取单地分布在各个机器上的索引汇d一个地方的{略?/span>

汇ȝ引的传输方式可以有很多方案,比如使用 FTP、HTTP、rsync {。甚至烦引模块和搜烦模块可以位于同一台机器上Q这U情况下只需要将索引q行本地拯卛_。同前面cMQ我们定义一?Transporter 接口?/span>


清单 5. Transporter 接口
public interface Transporter {
public void transport(File file);
}


?FTP 方式传输ZQ我们?Commons Net 完成传输的操作?/span>

public void transport(File file) throws TransportException {
FTPClient client = new FTPClient();
client.connect(host);
client.login(username, password);
client.changeWorkingDirectory(remotePath);
transportRecursive(client, file);
client.disconnect();
}

public void transportRecursive(FTPClient client, File file) {
if (file.isFile() && file.canRead()) {
client.storeFile(file.getName(), new FileInputStream(file));
} else if (file.isDirectory()) {
client.makeDirectory(file.getName());
client.changeWorkingDirectory(file.getName());
File[] fileList = file.listFiles();
for (File f : fileList) {
transportRecursive(client, f);
}
}
}



对其他传输方案也有各自的Ҏq行处理Q具体用哪?Transporter 的实现被配置?Spring 风格的烦引模块配|文件中。传输的方式是灵zȝ。比如当需要强调安全性时Q我们可以换用基?SSL ?FTP q行传输。所需要做的只是开发一个?FTP over SSL ?Transporter 实现Qƈ在配|文件中更改 Transporter 的实现即可?/span>

q行搜烦

在做了这么多之后Q我们开始接触和用户兌最为紧密的搜烦模块。注意,我们的框架不包括一个基于已l收集好的烦引进行搜索是个很单的q程。Lucene 已经提供了功能强大的 IndexSearcher 及其子类。在q个部分Q我们不会再介绍如何使用q些c,而是x在前文提到过的资源元数据上。元数据从各个资源所在的文g夹中d得到Q它在搜索模块中扮演重要的角艌Ӏ?/span>

构徏一个查?/span>

对不同资源进行搜索的查询Ҏq不一栗例如搜索一个论坛里的所有留aӞ我们x的一般是留言的标题、作者和内容Q而当搜烦一?FTP 站点Ӟ我们更多x的是文g名和文g内容。另一斚wQ我们有时可能会使用一个查询去搜烦多个资源的结果。这正是之前我们在前面所提到的元数据?searchableFields ?resourceName 属性的作用。前者指Z个资源中哪些字段是参与搜索的Q后者则用于在搜索时定使用哪个或者哪些烦引。从技术细节来_只有有了q些信息Q我们才可以构造出可用?Query 对象?/span>

呈现搜烦l果

当从 IndexSearcher 对象得到搜烦l果QHitsQ之后,当然我们可以直接从中获取需要的|再格式化予以输出。但一来格式化输出搜烦l果Q尤其在 Web 应用中)是个很常见的需求,可能会经常变_二来l果的呈现格式应该是由分散的资源各自定义Q而不是交由搜索模块来定义。基于上面两个原因,我们的框架将使用在资源收集端配置l果输出格式的方式。这个格式由资源元数据中?hitTextPattern 属性定义。该属性是一个字W串cd的|支持两种语法

形如 ${field_name} 的子字符串都会被动态替换成查询l果中各?Document ?Field 的倹{?
形如 $function(...) 的被解释为函敎ͼ括号内以逗号隔开的符号都被解释成参数Q函数可以嵌套?
例如搜烦“具体”q回的搜索结果中包含一?Document 对象Q其 Field 如下表:

Field 名称 Field 内容
url http://example.org/article/1.html
title CZ标题
content q里是具体的内容?

那么如果 hitTextPatten 被设|ؓ“${title}
$highlight(${content}, 5, "", "")”Q返回的l果l浏览器解释后可能的昄l果如下Q这只是个演C链接,请不要点击)Q?/span>

CZ标题
q里是具?..

上面提到?$highlight() 函数用于在搜索结果中取得最匚w的一D|本,q亮显C搜索时使用的短语,其第一个参数是高亮昄的文本,W二个参数是昄的文本长度,W三和第四个参数是高亮文本时使用的前~和后~?/span>

可以使用正则表达式和文本解析来实现前面所提到的语法。我们也可以使用 JavaCC 定义 hitTextPattern 的文法,q而生成词法分析器和语法解析器。这是更为系lƈ且相对而言不易出错的方法。对 JavaCC 的介l不是本文的重点Q您可以在下面的 阅读资源 中找到学习资料?/span>

下面列出的是一些与我们所提出的框架所相关或者类似的产品Q您可以?学习资料 中更多地了解他们?/span>

IBM?OmniFind?Family

OmniFind ?IBM 公司推出的企业搜烦解决Ҏ。基?UIMA (Unstructured Information Management Architecture) 技术,它提供了强大的烦引和获取信息功能Q支持巨大数量、多U类型的文档资源Q无论是l构化还是非l构化)Qƈ?Lotus?Domino??WebSphere?Portal 专门q行了优化?/span>

Apache Solr

Solr ?Apache 的一个企业的全文检索项目,实现了一个基?HTTP 的搜索服务器Q支持多U资源和 Web 界面理Q它同样建立?Lucene 之上Qƈ?Lucene 做了很多扩展Q例如支持动态字D及唯一键,Ҏ询结果进行动态分l和qo{?/span>

Google SiteSearch

使用 Google 的站Ҏ索功能可以方便而快捷地建立一个站内搜索引擎。但?Google 的站Ҏ索基?Google 的网l爬虫,所以无法访问受保护的站点内Ҏ?Intranet 上的资源。另外,Google 所支持的资源类型也是有限的Q我们无法对其进行扩展?/span>

SearchBlox?

SearchBlox 是一个商业的搜烦引擎构徏框架。它本n是一?J2EE lgQ和我们的框架类|也支持对|页和文件系l等资源q行索引Q进而进行搜索?/span>


q需考虑的问?/span>

本文介绍的思想试图利用开源的工具解决中小型应用中的常见问题。当Ӟ作ؓ一个框Ӟ它还有很多不I下面列DZ些可以进行改q的地方?/span>

性能考虑

当需要进行烦引的资源数目不多Ӟ隔一定的旉q行一ơ完全烦引不会占用很长时间。用一?2G 内存QXeon 2.66G 处理器的服务器进行实际测试,发现Ҏ据库资源的烦引占用的旉很少Q一千多条记录花费的旉?1 U到 2 U之内。而对 1400 多个文gq行索引耗时大约十几U。但在大型应用中Q资源的定w是巨大的Q如果每ơ都q行完整的烦引,耗费的时间会很惊人。我们可以通过跌已经索引的资源内容,删除已不存在的资源内容的索引Qƈq行增量索引来解册个问题。这可能会涉及文件校验和索引删除{?/span>

另一斚wQ框架可以提供查询缓存来提高查询效率。框架可以在内存中徏立一U缓存,q用如 OSCache ?EHCache 实现盘上的二~存。当索引的内容变化不频繁Ӟ使用查询~存更会明显地提高查询速度、降低资源消耗?/span>

分布式烦?/span>

我们的框架可以将索引分布在多台机器上。搜索资源时Q查询被 flood 到各个机器上从而获得搜索结果。这样可以免M输烦引到某一C央服务器的过E。当然也可以在非l构化的 P2P |络上实现分布式哈希?(DHT)Q配合烦引复?(Replication)Q得应用程序更为安全,可靠Q有伸羃性。在阅读资料中给Z 一关于构建分布式环境下全文搜索的可行性的论文?

安全?/span>

目前我们的框架ƈ没有涉及到安全性。除了依赖资源本w的讉K控制Q如受保护的|页和文件系l等Q之外,我们q可以从两方面增强框架本w的安全性:

考虑C个组l的搜烦功能对不同用L权限讄不一定一P可以支持对用戯色的定义Q实行对搜烦模块的访问控制?
在资源烦引模块中实现一U机Ӟ让资源可以限制自己暴露的内容Q从而羃烦引模块的索引范围。这可以cL robots 文g可以规定搜烦引擎爬虫的行为?


通过上文的介l,我们认识了一个可扩展的框Ӟq引模块和搜烦模块两部分组成。它可以灉|地适应不同的应用场景。如果需要更独特的需求,框架本n预留了可以扩展的接口Q我们可以通过实现q些接口完成功能的定制。更重要的是q一切都是徏立在开源Y件的基础之上。希望本文能为您揭示开源的力量Q体验用开源工L装您自己的解x案所带来的莫大快乐?/span>


kit_lo 2009-08-28 15:03 发表评论
]]>
log4j配置解http://www.tkk7.com/kit-soft/archive/2009/08/28/292977.htmlkit_lokit_loFri, 28 Aug 2009 07:00:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/28/292977.htmlhttp://www.tkk7.com/kit-soft/comments/292977.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292977.html#Feedback29http://www.tkk7.com/kit-soft/comments/commentRss/292977.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292977.htmlW一步:加入log4j-1.2.8.jar到lib下?/span>

W二步:在CLASSPATH下徏立log4j.properties。内容如下:

1 log4j.rootCategory=INFO, stdout , R

2

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

6

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

11

12 log4j.logger.com.neusoft=DEBUG

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

17 log4j.logger.org.displaytag=ERROR

18 log4j.logger.org.springframework=DEBUG

19 log4j.logger.com.ibatis.db=WARN

20 log4j.logger.org.apache.velocity=FATAL

21

22 log4j.logger.com.canoo.webtest=WARN

23

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

26 log4j.logger.org.logicalcobwebs=WARN

W三步:相应的修改其中属性,修改之前必ȝ道这些都是干什么的Q在W二部分讲解?/span>

W四步:在要输出日志的类中加入相兌句:

定义属性:protected final Log log = LogFactory.getLog(getClass());

在相应的Ҏ中:

if (log.isDebugEnabled())

{

log.debug(“System …..”);

}

二、Log4j说明

1 log4j.rootCategory=INFO, stdout , R

此句为将{为INFO的日志信息输出到stdout和Rq两个目的地Qstdout和R的定义在下面的代码,可以L起名。等U可分ؓOFF?FATAL、ERROR、WARN、INFO、DEBUG、ALLQ如果配|OFF则不打出M信息Q如果配|ؓINFOq样只显CINFO, WARN, ERROR的log信息Q而DEBUG信息不会被显C,具体讲解可参照第三部分定义配|文件中的logger?/span>

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

此句为定义名为stdout的输出端是哪U类型,可以?/span>

org.apache.log4j.ConsoleAppenderQ控制台Q,

org.apache.log4j.FileAppenderQ文ӞQ?/span>

org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?/span>

org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ

org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)

具体讲解可参照第三部分定义配|文件中的Appender?/span>

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

此句为定义名为stdout的输出端的layout是哪U类型,可以?/span>

org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,

org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,

org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,

org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)

具体讲解可参照第三部分定义配|文件中的Layout?/span>

5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

如果使用pattern布局p指定的打C息的具体格式ConversionPatternQ打印参数如下:

%m 输出代码中指定的消息

%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL

%r 输出自应用启动到输出该log信息耗费的毫U数

%c 输出所属的cȝQ通常是所在类的全?/span>

%t 输出产生该日志事件的U程?/span>

%n 输出一个回车换行符QWindowsq_?#8220;rn”QUnixq_?#8220;n”

%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21

%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?/span>

[QC]是log信息的开_可以ZQ意字W,一般ؓ目U?/span>

输出的信?/span>

[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

具体讲解可参照第三部分定义配|文件中的格式化日志信息?/span>

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

此句与第3行一栗定义名为R的输出端的类型ؓ每天产生一个日志文件?/span>

8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

此句为定义名为R的输出端的文件名为D:\Tomcat 5.5\logs\qc.log

可以自行修改?/span>

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

与第4行相同?/span>

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

与第5行相同?/span>

12 log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等UؓDEBUG?/span>

可以把com.neusoft改ؓ自己目所用的包名?/span>

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

q两句是把这两个包下出现的错误的{设ؓERRORQ如果项目中没有配置EHCacheQ则不需要这两句?/span>

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

q两句是struts的包?/span>

17 log4j.logger.org.displaytag=ERROR

q句是displaytag的包。(QC问题列表面所用)

18 log4j.logger.org.springframework=DEBUG

此句为Spring的包?/span>

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包?/span>

以上q些包的讄可根据项目的实际情况而自行定制?/span>

三、log4j详解

1、定义配|文?/span>

Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ文件log4j.propertiesQ键=|。下面将介绍使用log4j.properties文g作ؓ配置文g的方?

?span style="line-height: 1.3em; font-family: '宋体'">、配|根Logger


Logger 负责处理日志记录的大部分操作?/span>

其语法ؓQ?/span>

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中Qlevel 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的别。Log4j只用四个别,?先从高C分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里?义了INFOU别Q只有等于及高于q个U别的才q行处理Q则应用E序中所有DEBUGU别的日志信息将不被打印出来。ALL:打印所有的日志QOFFQ关 闭所有的日志输出?appenderName是指定日志信息输出到哪个地斏V可同时指定多个输出目的地?/span>

?span style="line-height: 1.3em; font-family: '宋体'">、配|日志信息输出目的地 Appender


Appender 负责控制日志记录操作的输出?/span>

其语法ؓQ?/span>

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1



log4j.appender.appenderName.optionN = valueN

q里的appenderName为在①里定义的,可Q意v名?/span>

其中QLog4j提供的appender有以下几U:

org.apache.log4j.ConsoleAppenderQ控制台Q,

org.apache.log4j.FileAppenderQ文ӞQ?/span>

org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?/span>

org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ可通过 log4j.appender.R.MaxFileSize=100KB讄文g大小Q还可通过 log4j.appender.R.MaxBackupIndex=1讄Z存一个备份文件?/span>

org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)

例如Qlog4j.appender.stdout=org.apache.log4j.ConsoleAppender

定义一个名为stdout的输出目的地QConsoleAppender为控制台?/span>

?span style="line-height: 1.3em; font-family: '宋体'">、配|日志信息的格式Q布局QLayout


Layout 负责格式化Appender的输出?/span>

其语法ؓQ?/span>

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1 = value1



log4j.appender.appenderName.layout.optionN = valueN

其中QLog4j提供的layout有以下几U:

org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,

org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,

org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,

org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)

2、格式化日志信息

Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:

%m 输出代码中指定的消息

%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL

%r 输出自应用启动到输出该log信息耗费的毫U数

%c 输出所属的cȝQ通常是所在类的全?/span>

%t 输出产生该日志事件的U程?/span>

%n 输出一个回车换行符QWindowsq_?#8220;rn”QUnixq_?#8220;n”

%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21

%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?/span>

3、在代码中用Log4j

我们在需要输出日志信息的cM做如下的三个工作Q?/span>

1、导入所有需的commongs-loggingc:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

2、在自己的类中定义一个org.apache.commons.logging.LogcȝU有静态类成员Q?/span>

private final Log log = LogFactory.getLog(getClass());

LogFactory.getLog()Ҏ的参C用的是当前类的class?/span>

3、用org.apache.commons.logging.Logcȝ成员Ҏ输出日志信息Q?/span>

if (log.isDebugEnabled())
{
log.debug("111");
}
if (log.isInfoEnabled())
{
log.info("222");
}
if (log.isWarnEnabled())
{
log.warn("333");
}
if (log.isErrorEnabled())
{
log.error("444");
}
if (log.isFatalEnabled())
{
log.fatal("555")
}

kit_lo 2009-08-28 15:00 发表评论
]]>
IT目理十六?/title><link>http://www.tkk7.com/kit-soft/archive/2009/08/28/292972.html</link><dc:creator>kit_lo</dc:creator><author>kit_lo</author><pubDate>Fri, 28 Aug 2009 06:53:00 GMT</pubDate><guid>http://www.tkk7.com/kit-soft/archive/2009/08/28/292972.html</guid><wfw:comment>http://www.tkk7.com/kit-soft/comments/292972.html</wfw:comment><comments>http://www.tkk7.com/kit-soft/archive/2009/08/28/292972.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/kit-soft/comments/commentRss/292972.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kit-soft/services/trackbacks/292972.html</trackback:ping><description><![CDATA[<div class="bbnzrrp" id="blogDetailDiv" style="font-size: 16px">目标驱动Q系l思维Q风险意识,数据量化 <br /> <br /> 凡事预则立,不预则废。如果你不知道要到哪里?l你一张地图也没有用。目标驱动首先要有最基本的计划管理和旉理能力。对于一个项目,我们q程中做的所有工作都是ؓ了要辑ֈ目目标Q因此在目各个阶段所有活动都需要考虑对达成目标的影响Q当发现偏差后及时纠正。目标驱动让我们从无目的的事后应急变成了有计划有目的的事前预。目标驱动不是要抛弃q程Q项目的成功涉及到过E,人和Ҏ工具技术。ؓ了达到项目目标,我们要根据项目的实际情况采取一pd目原来已经ȝ的最佛_践Ş成一套过E,高效的过E和U极心态的人是保证目目标达成的关键。因此作为项目经理要时刻问自己,目的目标是什么?目当前状态和我达成目标的差距是什么?我如何解军_应对?<br /> <br /> 目的成功受到多斚w的因素的影响Q而且各个因素之间q存在正反作用力。系l思维是要让我们能够清楚的认识到影响目目标和成功的各个要素Q以及它们之间存在的关系。Ş成一U适合目的动态系l模型,通过q个动态模型去q目各方q系人的利益Q^衡项目四要素之间的关p,q目的短期和长期的利益。项目经理的一个重要能力就是^衡,没有最优解Q只有满意解Q懂得了qq道当目出现变更和调整的时候如何更好的应对。从单要素最优的单向思维q渡到关注整个系l的全局思维模式上?<br /> <br /> 风险意识单来讲就是项目在执行q程中可能发生的各种问题我都事先预见C而采取了适当的缓解措施,q样才能够真正的让项目能够按照预先制定的计划和目标进行。再单点是如果风险理做得好,目是不应该p|的。君子安而不忘危Q存而不忘亡Q治而不忘ؕ。风险管理的重点正是在于要Ş成风险意识,要能够通过历史l验的积累,能够把项目的关键风险识别出来Qə目能够从事后的救火转变C前的防备Qə目能够在前面紧张后面轻松?<br /> <br /> 要谈及量化管理首先应该要培训用数据说话的分析思维。在软g目理中我们做度量的目的,是要收集和分析各种历史数据Q通过Ҏ据的分析来知道项目真正的效率Q同时ؓ后箋目提供各种估算参数数据。以数据说话让我们从全凭主观l验臆断转变到对事物的客观数据分析上。只有能够收集数据,分析数据我们才可能持l改q。有了数据意识后是要有l计和量化管理方面的意识Q利用统计学的思维和量化管理手D不仅仅是让我们的过E稳定和受控Ӟ能够d现项目执行过E中Ҏ原因引v的L动,针对Ҏ波动q行Ҏ分析q取纠正行动;q能够让我们能够Ҏ预测模型更加准确的预项目能够达成目标的E度和概率?<br /> ---------------------------------------- <br /> 努力使自己成为工作的l结?<!--v:3.2--></div> <img src ="http://www.tkk7.com/kit-soft/aggbug/292972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kit-soft/" target="_blank">kit_lo</a> 2009-08-28 14:53 <a href="http://www.tkk7.com/kit-soft/archive/2009/08/28/292972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>E序员的喝酒文化http://www.tkk7.com/kit-soft/archive/2009/08/28/292971.htmlkit_lokit_loFri, 28 Aug 2009 06:52:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/28/292971.htmlhttp://www.tkk7.com/kit-soft/comments/292971.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/28/292971.html#Feedback1http://www.tkk7.com/kit-soft/comments/commentRss/292971.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292971.html   你给自己倒了杯可乐,q叫低配|?
  你给自己倒了杯啤酒,q叫标准配置?
  你给自己倒了杯茶_q茶的颜色还跟啤酒一Pq叫木马?
  你给自己倒了杯可乐,q滴了几滴醋Q不仅颜色跟啤酒一P而且不冒热气q有泡Q这叫超U木马?
  你的同事l你倒了杯白酒,q叫推荐配置?
  人到齐了Q酒席开始了?
  你先一个h喝了一口Q这叫单元测试?
  你跟旁边的h说哥们咱们随意,q叫交叉试?
  但是他说不行Q这杯要q了Q这叫压力测试?
  于是你说那就大家一h吧,q叫内部试?
  q个时候boss向全ZD杯了Q这叫集成测试?
  菜过三EQ你׃跟他们客气了?
  你向寚w的h敬酒Q这叫p2p.
  你向寚w的h敬酒Q他回敬你,你又再敬?#8230;…Q这叫tcp.
  你向一桌h挨个敬酒Q这叫o牌环?
  你说只要是兄弟就q了q杯Q这叫广播?
  可是你的女上司听了不高兴了:只有兄弟么,|酒三杯。这叫炸式V?
  可是你的女下属听了不高兴了:我喝一口,你喝一杯,q叫恶意d?
  有一个hq来向这桌敬酒,你说不行你先q了我这养Iq叫防火墙?
  你的弟们过来敬你酒Q这叫一对多?
  你是bossQ所有hq来敬你酒,q叫服务器?
  酒是一LQ可是喝法是不同的?
  你喝了一杯,boss喝了一口,q叫c#?
  你喝了一杯,mm喝了一口,q叫vb?
  你喝了一杯,你大哥喝了半杯,q叫c++?
  你喝了半杯,你小弟喝了一杯,q叫汇编?
  你喝了一杯,你的搭档也喝了一杯,q叫c?
  酒是一LQ可是喝酒的人是不同的?
  你越喝脸红Q这叫资源释放?
  你越喝脸白Q这叫资源独占?
  你已l醉了,却说我还能喝Q叫做虚拟内存?
  你明明能喝,却说我已l醉了,叫做资源保留?
  你喝一D|间就上厕所Q这叫cache?
  酒过三EQ你也该zdzd了?
  你一桌一桌的赎ͼq叫轮E?
  你突然看到某一桌的漂亮mmQ走了过去,q叫ȀzM件?
  你去了坐下来׃打算CQ这叫死循环?
  你的老大举杯邀你过去,你只好过去,q叫优先U?
  你向一桌敬酒,他们说不行不行我们都喝白的,于是你也喝白的,q叫本地化?
  你向boss敬酒Q可是boss被围了v来,你只能站在外圈,q叫队列?
  你终于到了内圈,心翼的向前一步,q叫讉K临界区?
  你拍着boss的肩膀说哥们咱们喝一杯,q叫界?
  你不知喝了几圈了Q只会说两个字,q了Q这叫udp?
  可是q有人拿着酒瓶跑过来说Q刚才都没跟你喝Q这叫丢包?
  喝酒喝到最后的l果都一?
  你突然跑向厕所Q这叫捕获异帔R误?
  你在厕所吐了Q反而觉得状态不错,q叫释放内存?
  你在台面上吐了,觉得很惭愧,q叫时实错误?
  你在boss面前吐了Q觉得很x,q叫N性错误?
  你吐Cbossw上Q只能烦性晕倒了Q这叫Shut Down?

kit_lo 2009-08-28 14:52 发表评论
]]>
文金a--IBM---点亮智慧的地?--现场手记整理http://www.tkk7.com/kit-soft/archive/2009/08/27/292854.htmlkit_lokit_loThu, 27 Aug 2009 09:11:00 GMThttp://www.tkk7.com/kit-soft/archive/2009/08/27/292854.htmlhttp://www.tkk7.com/kit-soft/comments/292854.htmlhttp://www.tkk7.com/kit-soft/archive/2009/08/27/292854.html#Feedback1http://www.tkk7.com/kit-soft/comments/commentRss/292854.htmlhttp://www.tkk7.com/kit-soft/services/trackbacks/292854.html   文金a先生生于陕西,在IT界有过 30q的实践l验。担?IBM 软体总部战略及解x案的首席设计师和首席NQIBM 政府与公众事业部 大中华区技术ȝ。文博士实际L参与?IBM 公司众多对内和对外的大型目的规划、设计和开发工作。除了IT领域之外Q文先生q具有丰富的行业l验Q尤其是在政府业与电信业。文先生擅长于从行业出发Q结合业务重?(BPR) 和IT技术,协助客户解决业务N?
    今天文先生一切从change开?包括知识、经、全球化、向数字l济转型、技术创新等领域Q结合案例,从智慧的城市到点亮智慧的地球?
  我们生活在城市化q程加快、自然资源消耗加剧的时代。大量h口的入Q给人口高度集中的城市带来了前所未有的压力。法律框架与行政机构的繁衍,一斚w使得市政理来精l,同时也得纵横交错的部门信息互通越来越复杂Q政府领导的决策也越来越依赖Ҏ有部门信息的l合掌控。IBM 倡导的智慧的地球战略Q全面释攄成熟的信息管理技术和先进的管理理念生的巨大能量Q帮助各国政府徏设更加智慧的城市、更加智慧的城市理和更加智慧的资源使用。在如何智慧的城市专题中Q文先生概要介绍 IBM 在绿色环保、智能交通、市政管理和应急反应的成功l验和解x案?
  文先生的_ֽ演讲获得与会同志的一致好评,他在Q个时内,U论了美国电子政府发展经验,横向比较中国电子政务的机遇与挑战Q聆听者获益匪?
     好东西L觉短暂,q运的是下午文先生将转入我公?西安未来国际软g公司)q行技术层面演?

kit_lo 2009-08-27 17:11 发表评论
]]>
վ֩ģ壺 Ʒվ| ҹ޾Ʒ| һ˿wwwѸ| ձҳվ| AVһӰ| һѹۿƵİ | ߹ۿվ| þAVӰ| 99߹ۿ| ޾ƷպĻþþ| 4444wwwѿ| ¶ۺ| ݺݾþѹۿ| ëƬAV뾫Ʒҹ| ѹʵj߹ۿ| ŮܳƵ| ĻþþƷ1 | ˿| ֻ߿Ƭ| ޳ɫۺվ| ޾ƷƵ| պ޹ۺϸ| ִִӲˬƵ| ձ岻Ļ| þþƷƷ| þþƷ˽ӰԺѿ| va߹ۿ| һѹۿ| ߹ۿѹƵ| 91鶹ƷԲ߹ۿ| ޾ƷҺ| һëƬѲ| ˾Ʒձ18ͼ| aƬƷѹۿ| aëƬ߹ۿ| ˳77777վ| һëƬڼ| ѹۿ| þúݺݰۺӰԺ| jizzjizzƵȫ| Ļձ޾þþ|