版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态配置log4j的级别。对于log4j的初学者是很有用的。我是个菜鸟,随便写了个,别介意。1.import java.io.IOException;import javax.servlet.ServletException;import javax.servlet. HYPERLINK http:/http.HttpServlet http.HttpServlet;import javax.servlet. HYPERLINK http:/http.HttpServletRequest http.HttpServletRequest;import javax.servlet. HYPERLI
2、NK http:/http.HttpServletResponse http.HttpServletResponse;import org.apache.log4j.PropertyConfigurator;public class Log4jInit extends HttpServlet public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException public void init() throws ServletExcept
3、ion String prefix = getServletContext().getRealPath(/)+WEB-INFclasses;String file = getInitParameter(log4j-init-file);if(file != null)PropertyConfigurator.configure(prefix+file);2.import org.apache.log4j.Level;import org.apache.log4j.Logger;import org.apache.log4j.Priority;import org.apache.log4j.Pr
4、opertyConfigurator;public class TestBean private static Logger logger = Logger.getLogger(TestBean.class);protected String title;public String getTitle() logger.debugC这里是 Log4j 获得的信息+title);return title;public void setTitle(String title) /PropertyConfigurator.configure(D:MyEclipse6.0workspacecycsrcpe
5、rties);/logger.setLevel(Level.INFO);(1=里是 Log4j 获得的信息+title);logger.debug(2=Start of the main();(3=Just testing a log message with priority set to INFO);logger.warn(4=Just testing a log message with priority set to WARN);logger.error(5=Just testing a log message with priority set to ERROR);logger.fa
6、tal(6=Just testing a log message with priority set to FATAL); logger.log(Priority.DEBUG, 7=Testing a log message use a alternate form); logger.debug(8=End of the main();this.title = title;建立 pertieslog4j.rootCategory=ERROR,stdout,Rlog4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender
7、.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=QC %p %t %C.%M(%L) | %m%nlog4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=C:SysTestLog4j.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.Con
8、versionPattern=%d-TS %p %t %c - %m%n.neusoft=DEBUG .opensymphony.oscache=ERROR .sf.navigator=ERROR mons=ERROR .apache.struts=WARN .displaytag=ERROR.springframework=DEBUG .ibatis.db=WARN .apache.velocity=FATAL.canoo.webtest=WARN.logicalcobwebs=WARN建立 index.jsp log4j AAAAAAAA 5 web.xmlLog4jInittest.Lo
9、g4jInitlog4j-init-fileperties1index.jsp这样可以在页面上实现动态修改类的log输出的级别。PropertyConfigurator.configureAndWatch(/WEB-INF/perties, 1000);log4j 自带有 FileWatchdog 功能:PropertyConfigurator.configureAndWatch(c:/perties,60000);/每分钟检测一次文件是否被更改,如果更改,则自动重新读取配置。DOMConfigurator.configureAndWatch(c:/perties,60000);/xm 配置格
10、式的。动态配置log4j1配置外部配置文件来配置的基本步骤1.1 一个运用配置文件的实例Log4j之所以能成功的原因之一是它的灵活性。但如果只是简单的调用 BasicConfigurator.configure()来进行配置工作,那么所有的配置都是在函数中写死的,以后修 改配置就要修改原代码,这就不能体现出log4j的灵活性了,所以基本上不会通过BasicConfigurator.configure(来 进行配置工作的。为了增加软件的灵活性,最常用的做法就是使用配置文件,如web.xml之于J2EE,struts-config.xml之于struts 一样,log4j也提供了让我们把配置信息从
11、程序转移到配置文件 中的方法。Log4j提供了两种方式的配置文件:XML文件和Java的property配置文件。通过 把配置信息转移到外部文件中,当我们要修改配置信息时,就可以直接修改配置文件而不用 去修改代码了,下面,我们就来完成一个通过配置文件来实现log4j的实例。例 2-a:package TestLog4j;import org.apache.log4j.Logger;import org.apache.log4j.BasicConfigurator;import org.apache.log4j.PropertyConfigurator;import org.apache.log
12、4j.Priority; public class TestLog4j static Logger logger = Logger.getLogger(TestLog4j.class.getName();public TestLog4j()public static void main(String args)通过BasicConfigurator类来初始化/BasicConfigurator.configure();/(1)通过配置文件来初始化PropertyConfigurator.configure(F:nepalonperties);logger.debug(Start of the
13、main() in TestLog4j); 代码(2) (Just testing a log message with priority set to INFO);logger.warn(Just testing a log message with priority set to WARN);logger.error(Just testing a log message with priority set to ERROR); logger.fatal(Just testing a log message with priority set to FATAL);logger.log(Pri
14、ority.WARN, Testing a log message use a alternate form);logger.debug(TestLog4j.class.getName(); 代码(2)在这个例子中,我们用PropertyConfigurator.configure(F:nepalonperties)代替BasicConfigurator.configure(进行配置。PropertyConfigurator.configure (函数的参数可以是一个 properties文件所在路径的String对象,可以是一个properties文件所在路径的URL对象, 也可以是一个pr
15、operties对象。通过PropertyConfigurator.configure()可以通过指定的 properties文件来配置信息。如果要用XML文件进行信息配置,可以在代码中调用DOMConfigurator()函数来进行配置工作。在这里,我们只以properties文件来完成例子。接 着,我们来看一下perties文件中都有些什么东西:例 2-b:log4j.rootLogger = DEBUG, A1log4j.appender.A1 = org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout = org.apache.
16、log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern = %-4r %t %-5p %c %x - %m%n 运行这个实例,运行结果为0 main DEBUG TestLog4j.TestLog4j - Start of the main() in TestLog4j20 main INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO20 main WARN TestLog4j.TestLog4j - Just test
17、ing a log message with priority set to WARN20 main ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR20 main FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL 180 main WARN TestLog4j.TestLog4j - Testing a log message use a alternate form
18、 180 main DEBUG TestLog4j.TestLog4j - TestLog4j.TestLog4j下面,我们分析一下这个配置文件。由于每一个Logger对旬都有一个级别,文件的第一行就是定义了一个Logger及其级别。 在这里定义了一个根记录器(root logger),这涉及到记录器的层次问题,在些暂时不深入讨 论,在后面的章节再进行讨论。第二行定义了一个名为A1的输出流,这个流就是控制台,所以通过Logger对象打印的 信息会在控制台输出。第三行定义了打印信息的布局。在这里我们用PatternLayout作为此记录器的布局,PatternLayout允许你以灵活的格式来打印
19、信息。第四行指定的打印信息的具体格式,从结果可知,这个实例的打印格式为:当前打印语 句所使用的时间日志所在的线程打印的级别当前日志所在的类的全名日志信息。现在我们来修改一下这个记录器的级别,把第一行的DEBUG改为INFO,再运行程序,结果 将变为:0 main INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO10 main WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN10
20、 main ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR10 main FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL10 main WARN TestLog4j.TestLog4j - Testing a log message use a alternate form由于这个Logger的级别变为INFO,而代码(2)是调用debug()函数来输出日志信息时只
21、能 当记录器级别为DEBUG时才输出信息,所以代码(2)将不输出信息。1.2实例原理1.2.1初始化配置信息如果要通过JAVA的properties文件来配置信息,那么在代码中就要通过 PropertyConfigurator.configure(函数从properties文件中加载配置信息,这个函数有三种参数 形式:一个properties文件所在路径的String对象,可以是一个properties文件所在路径的 URL对象,也可以是一个properties对象。如果要用XML文件来配置信息,则可用类型的 DOMConfigurator()函数来从一个XML文件中加载配置信息。1.2.2
22、输出端 Appender在上面的例子中,我们都是简单的把日志信息输出到控制台中。其实在log4j中还可以把日 志信息输出到其它的输出端,对于同一个日志信息,我们还可以让它同时输出到多个输出端 中,如同时在控制台和文件中进行打印。一个输出端就是一个appender。要在配置文件中 定义一个appender有三步:1)在定义一个记录器的同时定义出该记录器的输出端appender。在例2的配置文件的第一 句log4j.rootLogger = DEBUG, A1中,我们定义了一个根记录器,它的级别为DEBUG,它有一 个 appender 名为 A1。定义根记录器的格式为 log4j.rootLog
23、ger = level , appendName1, appendName2, appendNameN。同一个记录器可有多个输出端。2)定义appender的输出目的地。定义一个appender的输出目的地的格式为 log4j.appender.appenderName = .of.appender.clas。log4j 提供了 以下几种 常用的输出目的地:? org.apache.log4j.ConsoleAppender,将日志信息输出到控制台? org.apache.log4j.FileAppender,将日志信息输出到一个文件? org.apache.log4j.DailyRollin
24、gFileAppender,将日志信息输出到一个,并且每天输出到一个新 的日志文件? org.apache.log4j.RollingFileAppender,将日志信息输出到一个文件,通过指定文件的的尺寸, 当文件大小到达指定尺寸的时候会自动把文件改名,如名为example.log的文件会改名为 example.log.1,同时产生一个新的example.log文件。如果新的文件再次达到指定尺寸,又 会自动把文件改名为example.log.2,同时产生一个example.log文件。依此类推,直到 example.log. MaxBackupIndex, MaxBackupIndex 的值
25、可在配置文件中定义。? org.apache.log4j.WriterAppender,将日志信息以流格式发送到任意指定的地方。? org.apache.log4j.jdbc.JDBCAppender,通过JDBC把日志信息输出到数据库中。在例 2 中,log4j.appender.A1 = org.apache.log4j.ConsoleAppender定义了名为 A1 的 appender 的输出目的地为控制台,所以日志信息将输出到控制台。3)定义与所选的输出目的地相关的参数,定义格式为:log4j.appender.appenderName.optionName1 = value1 lo
26、g4j.appender.appenderName.optionNameN = valueN其中一个最常用的参数layout将在下面介绍。1.2.3 输出格式(布局)layout通过appender可以控制输出的目的地,而如果要控制输出的格式,就可通过log4j的layout 组件来实现。通过配置文件定义一个appender的输出格式,也通常需要两个步骤:1)定义appender的布局模式。定义一个appender的布局模式的格式为log4j.appender.appenderName.layout = .of.layout.class Log4j 提供的布局模 式有以下几种:? org.ap
27、ache.log4j.HTMLLayout,以 HTML表格形式布局? org.apache.log4j.PatternLayout,可以灵活地指定布局模式? org.apache.log4j.SimpleLayout,包含日志信息的级别和信息字符串在例 2 中 log4j.appender.A1.layout = org.apache.log4j.PatternLayout 定义了名为 A1 的 appender 的布局模式为 PatternLayout。2)定义与所选的布局模式相关的设置信息,定义格式为:log4j.appender.appenderName.layout.optionNa
28、me1 = value1 log4j.appender.appenderName.layout.optionNameN = valueN选择了不同的布局模式可能会有不同的设置信息。实例2所选的布局模式PatternLayout的 一个PatternLayout为ConversionPattern,通过定义这个PatternLayout的值,我们可以指定 输出信息的输出格式。在例2的配置文件中的定义如下 log4j.appender.A1.layout.ConversionPattern = %-4r %t %-5p %c %x - %m%n。在下面,我们将 介绍布局模式PatternLayou
29、t的参数ConversionPattern的各个值代表的含义。1.2.4 ConversionPattern 参数的格式含义格式名含义%c输出日志信息所属的类的全名%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%dyyy-MM-dd HH:mm:ss ,输出类似:2002-10-18-22: 10: 28%f输出日志信息所属的类的类名%l输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行%m输出代码中指定的信息,如log(message)中的message%n输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”%p输出优
30、先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则 为DEBUG,依此类推%r输出自应用启动到输出该日志信息所耗费的毫秒数%t输出产生该日志事件的线程名1.3定义多个输出目的地的实例从上面的实例原理中我们已经知道,同一个日志信息可以同时输出到多个输出目的地,在这 个例子中,我们将实现一个把日志信息同时输出到控制器、一个文件中的实例和数据库中。 这个实例的Java代码我们沿用例2中的代码,我们只需修改配置文件即可。这也体现了 log4j 的灵活性。例 3-a:create table log4j(logID int primary key iden
31、tity,message varchar(1024),priority varchar(10),milliseconds int,category varchar(256),thread varchar(100),NDC varchar(256),createDate datetime,location varchar(256),caller varchar(100),method varchar(100),filename varchar(100),line int)例 3-b:#1定义了两个输出端log4j.rootLogger = INFO, A1, A2,A3#2定义A1输出到控制器l
32、og4j.appender.A1 = org.apache.log4j.ConsoleAppender#3定义A1的布局模式为PatternLayoutlog4j.appender.A1.layout = org.apache.log4j.PatternLayout#4定义A1的输出格式log4j.appender.A1.layout.ConversionPattern = %-4r %t %-5p %c - %m%n#5定义A2输出到文件log4j.appender.A2 = org.apache.log4j.RollingFileAppender#6定义A2要输出到哪一个文件log4j.a
33、ppender.A2.File = F:nepalonclassesexample3.log#7定义A2的输出文件的最大长度log4j.appender.A2.MaxFileSize = 1KB#8定义A2的备份文件数log4j.appender.A2.MaxBackupIndex = 3#9定义A2的布局模式为PatternLayoutlog4j.appender.A2.layout = org.apache.log4j.PatternLayout#10定义A2的输出格式log4j.appender.A2.layout.ConversionPattern = %dyyyy-MM-dd hh:
34、mm:ss:%p %t %c - %m%n#11区定义A3输出到数据库log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.A3.BufferSize = 40log4j.appender.A3.Driver = com.microsoft.jdbc.sqlserver.SQLServerDriverlog4j.appender.A3.URL = jdbc:microsoft:sqlserver:/:1433;DatabaseName=nepalonlog4j.appender.A3.User = salog4
35、j.appender.A3.Password =log4j.appender.A3.layout = org.apache.log4j.PatternLayoutlog4j.appender.A3.layout.ConversionPattern= INSERT INTO log4j (createDate, thread, priority, category, message) values(getdate(), %t, %-5p, %c, %m)配置文件中的6、7、8行显示了输出端为RollingFileAppender的特有参数及其运用的方法。 11区显示了输出端为JDBCAppend
36、er的特有参数及其运用方法。在这着重讲解一下6、7、8 行的作用。6行指定日志信息输出到哪个文件,7行指定日志文件的最大长度,最后要详细 介绍8行。第8行的参数是设置备份文件的个数的参数,在这里我们设置为3,表示最多有 3个备份文件,具体作用为:当example3.log文件的大小超过K时,就把文件改名为example3.log.1,同时生成一个新 的 example3.log 文件当example3.log文件的大小再次超过1K,又把文件改名为example3.log.1。但由于此时 example3.log.1 已存在,则先把 example3.log.1 更名为 example3.log
37、.2,再把 example3.log 文 件改名为 example3.log.13)同理,当example3.log文件的大小再次超过 1K,先把example3.log.2文件更名为 example3.log.3,把 example3.log.1 文件更名为 example3.log.2,再把 example3.log 文件改名 为 example3.log.14)当example3.log文件的大小再次超过1K,先把example3.log.2文件更名为example3.log.3, 旧的example3.log.3文件将被覆盖;把example3.log.1文件更名为example3.l
38、og.2,旧的 example3.log.2文件被覆盖;最后把example3.log文件改名为example3.log.1并覆盖掉旧的 example3.log.1 文件。运行结果将分为两部分在控制器中:0 main INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO11 main WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN21 main ERROR TestLog4j.
39、TestLog4j - Just testing a log message with priority set to ERROR 21 main FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL21 main WARN TestLog4j.TestLog4j - Testing a log message use a alternate form在文件 example3.log 中:2003-12-18 04:23:02:INFO main TestLog4j.TestLog4j
40、 - Just testing a log message with priority set to INFO2003-12-18 04:23:02:WARN main TestLog4j.TestLog4j - Just testing a log message with priority set to WARN2003-12-18 04:23:02:ERROR main TestLog4j.TestLog4j- Just testing a log message with priority set to ERROR2003-12-18 04:23:02:FATAL main TestL
41、og4j.TestLog4j - Just testing a log message with priority set to FATAL2003-12-18 04:23:02:WARN main TestLog4j.TestLog4j - Testing a log message use a alternate form 1.4配置log4j的总结这个教程到这里,关于配置log4j的配置文件的基本原理已经讲完了,而且通过例3我们已 经可以完成基本的日志工作了。现在,我们就做一个总结。配置一个配置文件的基本步骤如 下:1)定义一个Logger。在定义Logger时指定该Logger的级别级
42、其输出目的地。定义Logger 的格式为log4j.rootLogger = level , appendName1, appendName2, appendNameN。2)定义appender的输出目的地。定义一个appender的输出目的地的格式为log4j.appender.appenderName = .of.appender.classlog4j 提供的输出端有 ConsoleAppender、FileAppender、DailyRollingFileAppender、 RollingFileAppender 和 WriterAppender。3)定义appender的除布局模式外的
43、其它相关参数,如例3中第6、7、8定义了 A2的相关 参数。定义格式为log4j.appender.appenderName.optionName1 = value1 log4j.appender.appenderName.optionNameN = valueN如果除了布局模式外不需要定义别的参数,可跳过这一步(如例3中的A1)。4)定义appender的布局模式。定义一个appender的布局模式的格式为 log4j.appender.appenderName.layout = .of.layout.class布局模式其实也是步骤3)中的一个部分,只是布局模式参数是每一个appender必
44、须定义的参数。Log4j 提供的布局模式有 HTMLLayout、PatternLayout和 SimpleLayout。定义与所选的布局模式相关的设置信息,定义格式为og4j.appender.appenderName.layout.optionName1 = value1 log4j.appender.appenderName.layout.optionNameN = valueN2 记录器的层次Logger hierarchy2.1何为记录器的层次hierarchy首先,我们先看一下何为层次,以我们最熟悉的继承为例,下面是一张类图在这个继承体系中,类B是类C的父类,类A是类C的祖先类,类
45、D是类C的子类。这些 类之间就构成一种层次关系。在这些具有层次关系的类中,子类都可继承它的父类的特征, 如类B的对象能调用类A中的非private实例变量和函数;而类C由于继承自类B,所以类B 的对象可以同时调用类A和类B中的非private实例变量和函数。在log4j中,处于不同层次中的Logger也具有象类这样的继承关系。2.2 记录器的层次如果一个应用中包含了上千个类,那么也几乎需要上千个Logger实例。如何对这上千个 Logger实例进行方便地配置,就是一个很重要的问题。Log4J采用了一种树状的继承层次巧 妙地解决了这个问题。在Log4J中Logger是具有层次关系的。它有一个共同
46、的根,位于最上 层,其它Logger遵循类似包的层次。下面我们将进行介绍。根记录器 root logger就象一个Java中的Object类一样,log4j中的logger层次中有一个称之为根记录器的记录器, 其它所有的记录器都继承自这个根记录器。根记录器有两个特征:根记录器总是存在。就像Java中的Object类一样,因为用log4j输出日志信息是通过记 录器来实现的,所以只要你应用了 log4j,根记录器就肯定存在的。根记录器没有名称,所以不能通过名称来取得根记录器。但在Logger类中提供了getRootLogger()的方法来取得根记录器。记录器的层次Logger遵循类似包的层次。如s
47、tatic Logger rootLog = Logger.getRootLogger();static Logger log1 = Logger.getLogger(test4j);static Logger log2 = Logger.getLogger(test4j.test4j2);static Logger log3 = Logger.getLogger(test4j.test4j2.test4j2);那么rootLog是log2的祖先子记录器,log1是log2的父子记录器,log3是log2的子记录器。记录器象Java中的类继承一样,子记录器可以继承父记录器的设置信息,也可以可以
48、覆写 相应的信息。首先先看一下记录器层次中的继承有什么用处。假设程序中的每个包都具有一些基本的日志 信息,而包中的不同包可能会有些额外的日志信息要输出,这种情况就可以象处理Java中 的类一样,运用Logger中的层次关系来达到目的。假设有个名为A的包,我包下的所有类 都要把日志信息输出到控制台中;A.B包除了输出到控制台外还要输出到文件中;A.C包除 了输出到控制台中还要输出到HTML文档中。这样我们就可以通过定义一个父记录器A,它 负责把日志信息输出到控制台中;定义一个A的子记录器A.B,它负责把日志信息输出到文 件中;定义一个A的子记录器A.C,它负责把日志信息输出到HTML文档中。记录
49、器遵循的是类似包的层次,这样做为我们带来了大大的方便。Logger类中的getLogger() 方法可以取得Logger对象,这个方法有三种参数形式String、Class和URL,其实不论是用哪 一种,最终都是通过记录器的名字来取得记录器对象的。如果要取得一个名为A.B的记录器 对象,我们可以Logger.getLogger( A.B ”)。但从上面的例子中,我们都是通过 Logger.getLogger(TestLog4j.class.getName()这种方法来取得记录器对象。这是为什么呢?现 在我们假设A.B的包下有一个类BClass,那么我们调用BClass.class.getNam
50、e()得到的是这个 类的全名 A.B.BClass。所以当调用 Logger.getLogger(BClass.class.getName()时,最理想的情况 是返回名为A.B.BClass的记录器对象。但是如果不存在名为A.B.BClass的记录器时它会怎样 呢?其实通过Logger类的getLogger方法取得记录器时存在下面两种情况:如果存在与所要找的名字完全相同的记录器,则返回相应的记录器对象。当调用 Logger.getLogger(BClass.class.getName()时,如果定义了名为 A.B.BClass 的记录器,它 就返回该记录器的对象。但如果找不到,它会尝试返回在记
51、录器层次中与所要找的记录器最接近的记录器对象。当调用 Logger.getLogger(BClass.class.getName()时,如果没有定义了名为 A.B.BClass 的记录器, 那会尝试返回名为A.B的记录器的对象;如果又没有定义名为A.B的记录器,它会尝试返回 名为A的记录器的对象;如果也没定义名为A的记录器,它就会返回根记录器的对象,而 根记录器是必须存在的,所以你总能得到一个记录器对象。好了,现在我们回到前面的问题,我们为什么总要通过 Logger.getLogger(BClass.class.getName()这种以类全名作为参数来取得记录器对象呢?其实 这是为了管理方便。
52、因为我们在定义设计Logger时也遵循类似包的规则,使设计器的名称 与程序中的类包对应。如上面的假设中我们的程序中有A包,A包下有B包和C包,B包下 又有类BClass,那么我们就可使设计器的名为A、A.B、A.C、A.B.BClass,以此类推。那么当 我们通过类命名来取得设计器对象时,总能取到与所要的设计器最接近的设计器对象。2.3如何应用记录器的层次2.3.1如果定义及获取不同层次的记录器任何一个记录器的使用都有两个步骤:1)在配置文件中定义相应的记录器。在配置文件中定义记录器的格式有两种?定义根记录器的格式为log4j.rootLogger = level , appendNamel,
53、 appendName2, .appendNameN?定义一个非根记录器的格式为log4j.logger.loggerName1 = level , appendNamel,.appendNameN log4j.logger.loggerNameM = level , appendNamel, .appendNameN 我们可以定义任意个非根记录器。2)在代码中调用Logger类的取得记录器方法取得相应的记录器对象。要取得根记录器对象可通过Logger.getRootLogger()函数,要取得非根记录器可通过Logger.getLogger()函数。理论知道就讲到这里,纸上得来终觉浅,下面,
54、我们来小小演练一下。例 4-a:package TestLog4j;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import org.apache.log4j.Priority;import TestLog4j.TestLog4j2.TestLog4j2;public class TestLog4jstatic Logger logger = Logger.getLogger(TestLog4j.class.getName(); / (2)public TestLog4j()public
55、 static void main(String args)/同时输出到控制台和一个文件的实例并实现了 Logger的继承PropertyConfigurator.configure(F:nepalonperties);logger.debug(Start of the main() in TestLog4j);(Just testing a log message with priority set to INFO);logger.warn(Just testing a log message with priority set to WARN);logger.error(Just test
56、ing a log message with priority set to ERROR);logger.fatal(Just testing a log message with priority set to FATAL);logger.log(Priority.WARN, Testing a log message use a alternate form);logger.debug(TestLog4j.class.getName();TestLog4j2 testLog4j2 = new TestLog4j2(); /(1)testLog4j2.testLog();在类TestLog4
57、j中我们调用了另一个类TestLog4j2,下面看一下类TestLog4j2的代码。例 4-b:package TestLog4j.TestLog4j2;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import org.apache.log4j.Priority;public class TestLog4j2static Logger logger = Logger.getLogger(TestLog4j2.class.getName(); /(1)public TestLog4j2()
58、public void testLog()/同时输出到控制台和一个文件的实例PropertyConfigurator.configure(F:nepalonperties);logger.debug(2Start of the main();(2Just testing a log message with priority set to INFO);logger.warn(2Just testing a log message with priority set to WARN);logger.error(2Just testing a log message with priority s
59、et to ERROR);logger.fatal(2Just testing a log message with priority set to FATAL);logger.log(Priority.DEBUG, Testing a log message use a alternate form); logger.debug(2End of the main();最后我们来看一下配置文件。例 4-c:perties 文件内容#1区# Use two appenders, one to log to console, another to log to a file log4j.rootL
60、ogger = debug, stdout#2区#Print only messages of priority WARN or higher for your category log4j.logger.TestLog4j= , Rlog4j.logger.TestLog4j.TestLog4j2=WARN#3区# First appender writes to consolelog4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.Pattern
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 虚拟现实在木材加工质量检测中的应用-洞察分析
- 相对论引力波源-洞察分析
- 维修人员职业素养提升-洞察分析
- 物权法司法解释研究-洞察分析
- 网页设计安全策略-洞察分析
- 网络金融风险管理-第1篇-洞察分析
- 无人值守油气开采站实践-洞察分析
- 虚拟现实在协同设计中的应用-洞察分析
- 学习风格与教学策略匹配-洞察分析
- 医护抗疫个人先进事迹材料(5篇)
- 青海省全省市县乡镇卫生院街道社区卫生服务中心基本公共卫生服务医疗机构信息名单目录450家
- 网络暴力的法律规制开题报告
- 水泥混凝土路面施工方案85171
- 泰康人寿养老社区介绍课件
- T∕CSTM 00584-2022 建筑用晶体硅光伏屋面瓦
- 环境保护知识培训
- 《民航服务礼仪》项目五 地面服务礼仪
- 最新干部(职工)基本信息审核表格式
- 国家开放大学实验学院生活中的法律第二单元测验答案
- 高级社会工作师直接服务个案(老年社会工作服务个案案例)
- DB23∕T 1019-2020 黑龙江省建筑工程资料管理标准
评论
0/150
提交评论