|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在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。 |
|