分享
 
 
 

给你的Java应用程序加上日志功能

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

每个应用程序都需要某种方式同外部世界进行通信并收集数据。这可以利用数据库通过接口来实现,也可以用文本文件来完成。在面对这么多选择的时候,使用普通文本文件来收集和调试数据似乎已经被遗忘了。尽管文本文件无法像最新、最酷的技术那样带给你快感,但是它们(确实)是收集数据和诊断应用程序故障的有效手段。

Log4j程序包

Java编程语言里可以用的库使得向文件写入数据变轻易了,但是为什么还要在有好程序包可用的情况下重新发明车轮呢?Java 2 SDK的1.4版将一个日志编写API内置进了语言里,但是在它变得更加成熟之前,我还是更愿意坚持使用更加可靠的工具——比如Log4j程序包。我发现它很强健,很可靠,很轻易扩展,而且很轻易实现。你可以从Apache Jakarta计划获得Log4j。要使用这个程序包,你只需要把log4j.jar文件放在用于应用程序的CLASSPATH目录里。

类别从根开始

Log4j这个程序包按照类别的概念来组织。在你的应用程序运行期间,Log4j可以有任意多个类别。但是总会有一个根类别,它是类别层次开始的地方。类别用点符号来命名,就像Java程序包一样。这使得将专门的日志放在你的应用程序变得很轻易,而应用程序能够使用代码的已有结构来控制日志statement的处理方式。

类别是可以继续的,所以一个叫做com.versatilesolutions.example的类别可以从com.versatilesolutions类别继续其设置。你可以为类别赋予优先权,让其控制应用程序能够记录的日志量。可用的优先权有调试(debug)、信息(info)、警告(warn)、错误(error),以及致命错误(fatal)等。在调用日志记录程序的时候,你要使用和不同优先权相对应的方法,来指定日志statement的优先权。假如你正在进行的操作很耗资源,那么你可以检查一下当前的优先权是否在活动,以保证耗资源的操作只在statement真正被日志记录的时候进行。

日志的类型和布局

当日志程序包接收到statement的时候,Log4j用appender来指定进行什么类型的日志记录。Log4j的标准appender有屏幕、文件、旋转文件,以及能够在中心地点收集日志数据的远程appender。Appender被用于类别,这样的话,应用程序不同的部分就有不同的日志目的地。

一旦你为类别设置好了优先权和appender,那么剩下的唯一要求就是指定布局了。布局被用来控制你日志statement的具体格式,例如日期、时间、模块名称,以及线程的ID。我不会讲到所有可用的格式,因为你可以从Log4j的文档里获得这些格式完整的摘要。

Log4j的配置可以用XML文件或者Java属性文件来完成。我更喜欢利用Java属性文件这一技术,因为使用XML文件实现这一目的的例子太多了。Listing A里是一个用来配置Log4j的属性文件。

这个属性文件里的第一个非注释行指出,根类别具有调试的优先权,而且拥有三个appender,分别由A1、A2和A3来识别。剩下的部分指定了用于每个标识符的appender。在这个属性里,appender是一个控制台(屏幕)、一个旋转文件(rotating file),以及一个UDP广播器。

UDP广播器是我加到Log4j程序包里的一个appender,这样我可以用交互方式来观察日志statement。每个appender都附加有一个布局对象。在本文里,我们用到了PatternLayout,它后面接有转化模式。这个转化模式里的字符被用来指定输出。%这个符号用于指定格式字符。在这个例子里,%-5p表示用5个字符取得优先权(p)的左对齐。然后是日期(%d)、线程信息(%t),以及消息(%m),后面还接有行结束字符(%n)。

要在你的应用程序里使用Log4j,你需要使用PropertyConfigurator来加载这个属性文件。在你启动类里加上下面这一行就能够实现目的:

import org.apache.log4j.PropertyConfigurator;

….

PropertyConfigurator.configure("path/to/file.properties");

一旦配置被加载,那么要求日志记录能力的应用程序里的每个类都需要参考类别对象。由于类别采用程序包命名的惯例,所以我经常将类的名称用作类别(名称),即使这不是必需的,是否需要还取决于你如何安排配置。声明一个用于类的静态变量就会让日志程序可供使用:

import org.apache.log4j.Category;

….

private static final Category log = Category.getInstance(MyClass.class.getName());

记录事件

现在,在你的应用程序里记录日志就很轻易了。你只需要调用一个方法就行了,这个方法和你正在记录的消息的优先权相对应。例如下面是一条调试消息:

log.debug("Log4j really works!");

假如你想要确保调试优先权是活动的,那么你就要在进行调试调用之前检查它。要注重,即使你发送消息,它也不会被记录下来,除非优先权被正确地设置。检查当前的优先权,只是在尝试日志操作之前避免耗资源操作的一种方法。下面是在日志陈述之前检查优先权的一个例子。

if ( log.isDebugEnabled() ) {

log.debug("Another log statement.”);

}

你还可以给日志方法加上一个异常,这样的话,异常的细节就会被记录在日志消息里。这个调用的格式如下:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有