??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品无码精品mV在线观看,国产成人精品曰本亚洲79ren,亚洲精品国产啊女成拍色拍http://m.tkk7.com/kit-soft/zh-cnMon, 12 May 2025 03:56:46 GMTMon, 12 May 2025 03:56:46 GMT60tomcat 三种集群方式http://m.tkk7.com/kit-soft/archive/2009/08/28/292983.htmlkit_lokit_loFri, 28 Aug 2009 07:08:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/28/292983.htmlhttp://m.tkk7.com/kit-soft/comments/292983.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/28/292983.html#Feedback5http://m.tkk7.com/kit-soft/comments/commentRss/292983.htmlhttp://m.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://m.tkk7.com/kit-soft/archive/2009/08/28/292982.htmlkit_lokit_loFri, 28 Aug 2009 07:07:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/28/292982.htmlhttp://m.tkk7.com/kit-soft/comments/292982.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/28/292982.html#Feedback1http://m.tkk7.com/kit-soft/comments/commentRss/292982.htmlhttp://m.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://m.tkk7.com/kit-soft/archive/2009/08/28/292981.htmlkit_lokit_loFri, 28 Aug 2009 07:06:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/28/292981.htmlhttp://m.tkk7.com/kit-soft/comments/292981.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/28/292981.html#Feedback0http://m.tkk7.com/kit-soft/comments/commentRss/292981.htmlhttp://m.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://m.tkk7.com/kit-soft/archive/2009/08/28/292980.htmlkit_lokit_loFri, 28 Aug 2009 07:05:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/28/292980.htmlhttp://m.tkk7.com/kit-soft/comments/292980.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/28/292980.html#Feedback0http://m.tkk7.com/kit-soft/comments/commentRss/292980.htmlhttp://m.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://m.tkk7.com/kit-soft/archive/2009/08/28/292978.htmlkit_lokit_loFri, 28 Aug 2009 07:03:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/28/292978.htmlhttp://m.tkk7.com/kit-soft/comments/292978.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/28/292978.html#Feedback0http://m.tkk7.com/kit-soft/comments/commentRss/292978.htmlhttp://m.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://m.tkk7.com/kit-soft/archive/2009/08/28/292977.htmlkit_lokit_loFri, 28 Aug 2009 07:00:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/28/292977.htmlhttp://m.tkk7.com/kit-soft/comments/292977.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/28/292977.html#Feedback29http://m.tkk7.com/kit-soft/comments/commentRss/292977.htmlhttp://m.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://m.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://m.tkk7.com/kit-soft/archive/2009/08/28/292972.html</guid><wfw:comment>http://m.tkk7.com/kit-soft/comments/292972.html</wfw:comment><comments>http://m.tkk7.com/kit-soft/archive/2009/08/28/292972.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/kit-soft/comments/commentRss/292972.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/kit-soft/services/trackbacks/292972.html</trackback:ping><description><![CDATA[<div class="fvblt7f" 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://m.tkk7.com/kit-soft/aggbug/292972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/kit-soft/" target="_blank">kit_lo</a> 2009-08-28 14:53 <a href="http://m.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://m.tkk7.com/kit-soft/archive/2009/08/28/292971.htmlkit_lokit_loFri, 28 Aug 2009 06:52:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/28/292971.htmlhttp://m.tkk7.com/kit-soft/comments/292971.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/28/292971.html#Feedback1http://m.tkk7.com/kit-soft/comments/commentRss/292971.htmlhttp://m.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://m.tkk7.com/kit-soft/archive/2009/08/27/292854.htmlkit_lokit_loThu, 27 Aug 2009 09:11:00 GMThttp://m.tkk7.com/kit-soft/archive/2009/08/27/292854.htmlhttp://m.tkk7.com/kit-soft/comments/292854.htmlhttp://m.tkk7.com/kit-soft/archive/2009/08/27/292854.html#Feedback1http://m.tkk7.com/kit-soft/comments/commentRss/292854.htmlhttp://m.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 发表评论
]]>
վ֩ģ壺 ɫ˿ѹۿվ| Ʒѹۿþþ| ŮǿƨͰˬ| þƵ| ޹ۺϾþ| ߹ۿƬaѹۿ| ޵Ƶվ| ѴƬavֻƬ| ޳aƬ2023 | ĻƵ| AVһһ| Ƶ| 㽶Ƶ߹ۿ| Ļһҳ| һëƬѲ| ѨƬ߹ۿ| ֻѸۿ| ɫվ| ݽվƵ| 2019ĻѴȫ5| պƵ| ɫҹƵ| 뾫Ʒþþ| С˵| avһ | ƷɫҹƵ| ҳƵ߹ۿ| ҳƵվ| һѹ| 붯xxxxx| jizzһ| ĻƵѹۿ| ƷžžþƵ | պĻպ| jlzzjlzz߲Ƶ| ˿| jlzzjlzz߲Ƶ| þþþŮۺ| 㽶AVվ߹ۿ| ޾ƷҾþþþþ| ޳ҹ|