因胸联盟 发表于 2015-1-18 11:30:37

JAVA网页设计一个log4j的进修笔计

在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。Log4j进修条记

byheavyz
2003-04-15

转自:http://zooo.51.net/heavyz_cs/notebook/log4j.html



--------------------------------------------------------------------------------





Log4j主页:http://jakarta.apache.org/log4j



--------------------------------------------------------------------------------


Index

Log4j的类图
Logger:日记写出器
Logger的输入办法
Logger的定名划定规矩
Loglevel
示例代码
关于logger的两点申明
Appender:日记目标地
ConsoleAppender
FileAppender
RollingFileAppender
Layout:日记格局化器
PatternLayout
patternsinPatternLayout
Configuration:设置
默许的log4j初始化历程
BasicConfigurator.configure()
xml格局的log4j设置文件概述
在xml文件中设置appender和layout
我本人的一个利用xml文件设置log4j情况的很复杂的例子
Log4j的编码习气
参考材料



Log4j的类图




Logger-日记写出器,供程序员输入日记信息
Appender-日记目标地,把格局化好的日记信息输入到指定的中央往
ConsoleAppender-目标地为把持台的Appender
FileAppender-目标地为文件的Appender
RollingFileAppender-目标地为巨细受限的文件的Appender
Layout-日记格局化器,用来把程序员的loggingrequest格局化成字符串
PatternLayout-用指定的pattern格局化loggingrequest的Layout



Logger:日记写出器
Logger对象是用来代替System.out大概System.err的日记写出器,用来供程序员输入日记信息。

Logger的输入办法
Logger类对象供应一系列办法供程序员输入日记信息。




------Log4jAPIs:classLogger------



//Printingmethods:

publicvoiddebug(Objectmsg);
publicvoiddebug(Objectmsg,Throwablet);

publicvoidinfo(Objectmsg);
publicvoidinfo(Objectmsg,Throwablet);

publicvoidwarn(Objectmsg);
publicvoidwarn(Objectmsg,Throwablet);

publicvoiderror(Objectmsg);
publicvoiderror(Objectmsg,Throwablet);

publicvoidfatal(Objectmsg);
publicvoidfatal(Objectmsg,Throwablet);

//Genericprintingmethod:

publicvoidlog(Levell,Objectmsg);




Logger的定名划定规矩
Logger由一个String类的名字辨认,logger的名字是巨细写敏感的,且名字之间具有承继的干系,子名有父名作为前缀,用点号.分开。如:x.y是x.y.z的父亲。

根logger(rootlogger)是一切logger的先人,它具有以下属性:1)它老是存在的;2)它不成以经由过程名字取得。

经由过程挪用publicstaticLoggerLogger.getRootLogger()取得rootlogger;经由过程挪用publicstaticLoggerLogger.getLogger(Stringname)大概publicstaticLoggerLogger.getLogger(Classclazz)取得(大概创立)一个namedlogger。后者相称于挪用Logger.getLogger(clazz.getName())。

在某对象中,用该对象所属的类为参数,挪用Logger.getLogger(Classclazz)以取得logger被以为是今朝所知的最明智的定名logger的办法。


Loglevel
每一个logger都被分派了一个日记级别(loglevel),用来把持日记信息的输入。未被分派level的logger将承继它比来的父logger的level。

每条输入到logger的日记哀求(loggingrequest)也都有一个level,假如该request的level年夜于即是该logger的level,则该request将被处置(称为enabled);不然该request将被疏忽。故可得知:

logger的level越低,暗示该logger越具体
loggingrequest的level越高,暗示该loggingrequest越优先输入

Level类中预界说了五个level,它们的巨细干系以下:


Level.ALL<Level.DEBUG<Level.INFO<Level.WARN<Level.ERROR<Level.FATAL<Level.OFF




示例代码
以下代码将用本人所属的类为参数,创立一个logger,启用默许设置,设置其level并向其输入多少loggingrequest。


importorg.apache.log4j.Logger;
importorg.apache.log4j.BasicConfigurator;
importorg.apache.log4j.Level;

publicclassLog4jTest{
publicstaticvoidmain(Stringargv[]){


//CreatealoggerbythenameofclassLog4jTest.

Loggerlogger=Logger.getLogger(Log4jTest.class);

//Usethedefaultconfiguration.

BasicConfigurator.configure();

//SettheloggerleveltoLevel.INFO

logger.setLevel(Level.INFO);

//ThisrequestwillbedisabledsinceLevel.DEBUG<Level.INFO.

logger.debug("Thisisdebug.");

//Theserequestswillbeenabled.

logger.info("Thisisaninfo.");
logger.warn("Thisisawarning.");
logger.error("Thisisanerror.");
logger.fatal("Thisisafatalerror.");

return;
}
}




关于logger的两点申明

用同名参数挪用Logger.getLogger(Stringname)将前往统一个logger的援用。故能够在一个中央设置logger,在别的一个中央取得设置好的logger,而不必互相间传送logger的援用。
logger的创立能够依照恣意的按次,即,父logger能够后于子logger被创立。log4j将主动保护logger的承继树。





Appender:日记目标地
每一个logger都能够具有一个大概多个appender,每一个appender暗示一个日记的输入目标地,好比console大概某个文件。可使用Logger.addAppender(Appenderapp)为logger增添一个appender;可使用Logger.removeAppender(Appenderapp)为logger移除一个appender。

默许情形下,logger的additive标记被设置为true,暗示子logger将承继父logger的一切appenders。该选项能够被从头设置,暗示子logger将不再承继父logger的appenders。

rootlogger具有方针为system.out的consoleAppender,故默许情形下,一切的logger都将承继该appender。




------Log4jAPIs:classLogger------



//为logger对象增添大概移除一个Appender对象:.

publicvoidappAppender(Appenderapp);
publicvoidremoveAppender(Appenderapp);

//取得和设置additive标记:是不是承继父logger的appenders:.
//注重:在设置additive标记为false时,必需包管已为该logger设置了新的appender,:.
//不然log4j将报错:log4j:WARNNoappenderscouldbefoundforlogger(x.y.z).:.

publicbooleangetAdditivity();
publicvoidsetAdditivity(booleanadditive);


ConsoleAppender
可使用ConsoleAppender对象把日记输入到把持台。每一个ConsoleAppender都有一个target,暗示它的输入目标地。它能够是System.out,尺度输入设备(缓冲显现屏);大概是System.err,尺度毛病设备(不缓冲显现屏)。ConsoleAppender的利用办法参考以下API:.




------Log4jAPIs:classConsoleAppenderextendsWriterAppender------



//机关办法,利用一个Layout对象机关一个ConsoleAppender对象:.
//默许情形下,ConsoleAppender的target是System.out:.

publicConsoleAppender(Layoutlayout);

//机关办法,利用一个Layout对象和一个target字符串机关ConsoleAppender对象:.
//target的大概取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR:.

publicConsoleAppender(Layoutlayout,Stringtarget);




FileAppender
可使用FileAppender对象把日记输入到一个指定的日记文件中往。利用办法能够参考以下的API:.




------Log4jAPIs:classFileAppenderextendsWriterAppender------



//机关办法,利用一个Layout对象和日记文件名机关一个FileAppender对象:.

publicFileAppender(Layoutlayout,Stringfilename)
throwsIOException;
publicFileAppender(Layoutlayout,Stringfilename,booleanappend)
throwsIOException;




RollingFileAppender
可使用FileAppender的子类RollingFileAppender对象,把日记输入到一个指定的日记文件中。分歧的是该日记文件的巨细遭到限定,当日记内容超越最年夜的尺寸时,该文件将向上转动(最老的日记被擦除)。还能够在该类对象中指定为日记文件做几个备份。详细利用办法参考以下API:.




------Log4jAPIs:classRollingFileAppenderextendsFileAppender------



//机关办法,利用一个Layout对象和日记文件名机关一个RollingFileAppender对象:.

publicRollingFileAppender(Layoutlayout,Stringfilename)
throwsIOException;
publicRollingFileAppender(Layoutlayout,Stringfilename,booleanappend)
throwsIOException;

//取得和设置日记备份文件的个数:.

publicintgetMaxBackupIndex();
publicvoidsetMaxBackupIndex(intindex);

//取得和设置转动日记文件的最年夜尺寸:.

publiclonggetMaximumFileSize();
publicvoidsetMaximumFileSize(longsize);






Layout:日记格局化器
每一个appender都和一个layout相接洽;layout的义务是格局化用户的loggingrequest,appender的义务是把layout格局化好的输入内容送往指定的目标地。

PatternLayout
PatternLayout是Layout的一个子类,用来利用相似C言语的printf函数中利用的格局把持字符串来把持日记的输入格局。利用办法参考以下API:.




------Log4jAPIs:classPatternLayoutextendsLayout------



//无参数机关办法,利用DEFAULT_CONVERSION_PATTERN机关一个PatternLayout:.
//注重:DEFAULT_CONVERSION_PATTERN为"%m%n",只打印动静信息:.

publicPatternLayout();

//机关办法,利用自界说的pattern机关一个PatternLayout:.

publicPatternLayout(Stringpattern);

//取得和设置PatternLayout对象的日记pattern:.

publicStringgetConversionPattern();
publicvoidsetConversionPattern(Stringpattern);




patternsinPatternLayout
未完待续




Configuration:设置
对log4j情况的设置就是对rootlogger的设置,包含把rootlogger设置为哪一个级别(level);为它增添哪些appender,等等。这些能够经由过程设置体系属性的办法来隐式地完成,也能够在程序里挪用XXXConfigurator.configure()办法来显式地完成。

默许的log4j初始化历程
Logger类的静态初始化块(staticinitializationblock)中对log4j的情况做默许的初始化。注重:假如程序员已经由过程设置体系属性的办法来设置了log4j情况,则不必要再显式地挪用XXXConfigurator.configure()办法来设置log4j情况了。

Logger的静态初始化块在完成初始化历程时将反省一系列log4j界说的体系属性。它所做的事变以下:

反省体系属性log4j.defaultInitOverride,假如该属性被设置为false,则实行初始化;不然(只需不是false,不管是甚么值,乃至没有值,都是不是则),跳过初始化。
把体系属性log4j.configuration的值赋给变量resource。假如该体系变量没有被界说,则把resource赋值为"log4j.properties"。注重:在apache的log4j文档中倡议利用界说log4j.configuration体系属性的办法来设置默许的初始化文件是一个好办法。
试图把resource变量转化成为一个URL对象url。假如一样平常的转化办法行欠亨,就挪用org.apache.log4j.helpers.Loader.getResource(resource,Logger.class)办法来完成转化。
假如url以".html"开头,则挪用办法DOMConfigurator.configure(url)来完成初始化;不然,则挪用办法PropertyConfigurator.configure(url)来完成初始化。假如url指定的资本不克不及被取得,则跳出初始化历程。



BasicConfigurator.configure()
BasicConfigurator.configure()办法利用最简的办法设置log4j情况。注:所谓设置log4j情况,就是指设置rootlogger,由于一切别的的logger都是rootlogger的儿女,以是它们(默许情形下)都将承继rootlogger的性子。

BasicConfigurator.configure()完成的义务是:

用默许pattern创立PatternLayout对象p:
PatternLayoutp=newPatternLayout("%-4r[%t]%-5p%c%x-%m%n");
用p创立ConsoleAppender对象a,方针是system.out,尺度输入设备:
ConsoleAppendera=newConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
为rootlogger增添一个ConsoleAppenderp:
rootLogger.addAppender(p);
把rootlogger的loglevel设置为DEBUG级别:
rootLogger.setLevel(Level.DEBUG);



xml格局的log4j设置文件概述
xml格局的log4j设置文件必要利用org.apache.log4j.html.DOMConfigurator.configure()办法来读进。对xml文件的语法界说能够在log4j的公布包中找到:org/apache/log4j/xml/log4j.dtd。

log4j的xml设置文件的树状布局
log4j的xml设置文件的树状布局以下所示,注重下图只显现了经常使用的部分。:.


xmldeclarationanddtd
|
log4j:configuration
|
+--appender(name,class)
||
|+--param(name,value)
|+--layout(class)
||
|+--param(name,value)
+--logger(name,additivity)
||
|+--level(class,value)
|||
||+--param(name,value)
|+--appender-ref(ref)
+--root
|
+--param(name,class)
+--level
||
|+--param(name,value)
+--appender-ref(ref)




xmldeclarationanddtd
xml设置文件的头部包含两个部分:xml声明和dtd声明。头部的格局以下::.


<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPElog4j:configurationSYSTEM"log4j.dtd">




log4j:configuration(rootelement)

xmlns:log4j[#FIXEDattribute]:界说log4j的名字空间,取定值"http://jakarta.apache.org/log4j/"
appender[*child]:一个appender子元素界说一个日记输入目标地
logger[*child]:一个logger子元素界说一个日记写出器
root[?child]:root子元素界说了rootlogger



appender
appender元素界说一个日记输入目标地。


name[#REQUIREDattribute]:界说appender的名字,以便被后文援用
class[#REQUIREDattribute]:界说appender对象所属的类的全名
param[*child]:创立appender对象时传送给类机关办法的参数
layout[?child]:该appender利用的layout对象



layout
layout元素界说与某一个appender相接洽的日记格局化器。


class[#REQUIREDattribute]:界说layout对象所属的类的全名
param[*child]:创立layout对象时传送给类机关办法的参数



logger
logger元素界说一个日记输入器。


name[#REQUIREDattribute]:界说logger的名字,以便被后文援用
additivity[#ENUMattribute]:取值为"true"(默许)大概"false",是不是承继父logger的属性
level[?child]:界说该logger的日记级别
appender-ref[*child]:界说该logger的输入目标地



root
root元素界说根日记输入器rootlogger。


param[*child]:创立rootlogger对象时传送给类机关办法的参数
level[?child]:界说rootlogger的日记级别
appender-ref[*child]:界说rootlogger的输入目标地



level
level元素界说logger对象的日记级别。


class[#IMPLIEDattribute]:界说level对象所属的类,默许情形下是"org.apache.log4j.Level类
value[#REQUIREDattribute]:为level对象赋值。大概的取值从小到年夜顺次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时暗示没有任何日记信息被输入
param[*child]:创立level对象时传送给类机关办法的参数



appender-ref
appender-ref元素援用一个appender元素的名字,为logger对象增添一个appender。


ref[#REQUIREDattribute]:一个appender元素的名字的援用
appender-ref元素没有子元素



param
param元素在创立对象时为类的机关办法供应参数。它能够成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。


nameandvalue[#REQUIREDattributes]:供应参数的一组名值对
param元素没有子元素





在xml文件中设置appender和layout
创立分歧的Appender对象大概分歧的Layout对象要挪用分歧的机关办法。可使用param子元从来设定分歧的参数值。

创立ConsoleAppender对象
ConsoleAppender的机关办法不承受别的的参数。:.


............
<appendername="console.log"class="org.apache.log4j.ConsoleAppender">
<layout...>
......
</layout>
</appender>
............




创立FileAppender对象
能够为FileAppender类的机关办法传送两个参数:File暗示日记文件名;Append暗示如文件已存在,是不是把日记追加到文件尾部,大概取值为"true"和"false"(默许)。:.


............
<appendername="file.log"class="org.apache.log4j.FileAppender">
<paramname="File"value="/tmp/log.txt"/>
<paramname="Append"value="false"/>
<layout...>
......
</layout>
</appender>
............




创立RollingFileAppender对象
除File和Append之外,还能够为RollingFileAppender类的机关办法传送两个参数:MaxBackupIndex备份日记文件的个数(默许是1个);MaxFileSize暗示日记文件同意的最年夜字节数(默许是10M)。:.


............
<appendername="rollingFile.log"class="org.apache.log4j.RollingFileAppender">
<paramname="File"value="/tmp/rollingLog.txt"/>
<paramname="Append"value="false"/>
<paramname="MaxBackupIndex"value="2"/>
<paramname="MaxFileSize"value="1024"/>
<layout...>
......
</layout>
</appender>
............




创立PatternLayout对象
能够为PatternLayout类的机关办法传送参数ConversionPattern。:.


............
<layoutclass="org.apache.log4j.PatternLayout>
<paramname="Conversion"value="%d[%t]%p-%m%n"/>
</layout>
............






我本人的一个利用xml文件设置log4j情况的很复杂的例子
为WSOTA项目开辟javawebstart的胖客户端时,利用了以下的xml文件设置log4j情况(文件名为wsota-rc.log4j.html)::.


<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPElog4j:configurationSYSTEM"log4j.dtd">

<log4j:configurationxmlns:log4j="http://jakarta.apache.org/log4j/">

<!--=================================================================-->
<!--arollingfileappender-->
<!--=================================================================-->

<appendername="wsota-rc.file.log"class="org.apache.log4j.RollingFileAppender">
<paramname="File"value="/tmp/wsota-rc.log"/>
<paramname="Append"value="false"/>
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern"value="%d[%t]%p-%m%n"/>
</layout>
</appender>

<!--=================================================================-->
<!--aconsoleappender-->
<!--debugcanbeturnedoffbysettinglevelofrootto"off"-->
<!--=================================================================-->

<appendername="wsota-rc.console.log"class="org.apache.log4j.ConsoleAppender">
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern"value="%d[%t]%p-%m%n"/>
</layout>
</appender>

<!--usethistoturnondebugtoarollingfile.-->

<root>
<levelvalue="debug"/>
<appender-refref="wsota-rc.file.log"/>
</root>

<!--usethistoturnondebugtoconsole.-->
<!--
<root>
<levelvalue="off"/>
<appender-refref="wsota-rc.console.log"/>
</root>
-->


<!--usethistoturnoffdebug.-->
<!--
<root>
<levelvalue="off"/>
<appender-refref="wsota-rc.console.log"/>
</root>
-->

</log4j:configuration>


在胖客户程序中利用了以下代码来利用内部xml文件设置log4j情况,注重该代码段位于程序的mainclass的静态初始化块中,含有以下代码的类和xml设置文件在统一个目次下::.


importorg.apache.log4j.html.DOMConfigurator;

publicclassSapFrameextendsJFrame{
static{
DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.html"));
}
............
}






Log4j的编码习气

让每一个类都具有一个privatestatic的Logger对象,用来输入该类中的全体日记信息
利用xml文件来完成对log4j情况的设置。在项目标mainclass中的静态初始化块里放log4j情况的设置代码。注重:在一个项目中,log4j情况只必要被设置一次,而不是在每一个利用了logger的类里都必要挪用一次
用MyClass.class作为参数创立该类的静态Logger对象
增补中...


在性能方面,在windows平台下,.net可能是占强项,要是把.net放在sun开发的操作系统上去运行呢?根本就运行不了,.net对其它操作系统的支持也很弱,性能也可能比不上java。

飘飘悠悠 发表于 2015-1-30 12:58:25

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

冷月葬花魂 发表于 2015-2-4 15:54:01

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

谁可相欹 发表于 2015-2-10 03:37:14

是一种使网页(Web Page)产生生动活泼画面的语言

爱飞 发表于 2015-2-28 18:32:21

是一种语言,用以产生「小应用程序(Applet(s))

飘灵儿 发表于 2015-3-1 04:10:24

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

乐观 发表于 2015-3-11 17:00:00

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

柔情似水 发表于 2015-3-19 01:54:57

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

不帅 发表于 2015-3-26 23:31:09

是一种使用者不需花费很多时间学习的语言
页: [1]
查看完整版本: JAVA网页设计一个log4j的进修笔计