log4j了解

来源:互联网 发布:餐饮库存软件 编辑:程序博客网 时间:2024/05/22 09:11

log4j使用

我们在编程时经常不可避免地要使用到一些日志操作,比如开发阶段的调试信息、运行时的日志记录及审计。
调查显示,日志代码占代码总量的4%。通常大家可以简单地使用System.out.println()语句输出日志信息,但是在发布时,
通常不想在正式的版本中打印这些开发时的调试信息,于是又要手工地把这些语句删除,
所以大量的这样的System.out.println()调试语句会带来麻烦。更多做法是把它封闭一个简单的输出,比如: + expand sourceview plaincopy to clipboardprint?
public final class Debug       
{      
    public static final boolean debugOn = true;      
    public static void println(java/lang/String.java.html" target="_blank">String msg) {     
        if (debugOn)      
        {     
            java/lang/System.java.html" target="_blank">System.out.println(msg);      
        }      
    }      
}    
public final class Debug    
{   
    public static final boolean debugOn = true;   
    public static void println(java/lang/String.java.html" target="_blank">String msg) {  
        if (debugOn)   
        {  
            java/lang/System.java.html" target="_blank">System.out.println(msg);   
        }   
    }   
}   

java 代码
这样就可把代码中要用System.out.println()输出调试信息的地方全用Debug.println()替代,
当在发布时只需把Debug类中的debugOn改成false即可。这样做虽然在一定程度上解决了问题,
但如果需要的是更复杂的日志系统呢,比如把日志信息保存为文件等别的形式;
又或是当系统在试运行了一段时间后我们又要更改某些试运行时的测试信息。
如果真的遇到这样的情况,也行就只有修改代码了,这样又给开发工作带来了麻烦。

Log4J是Apache软件基金会Jakarta项目下的一个子项目,是用Java编写的优秀日志工具包。
通过Log4J可以在不修改代码的情况下,方便、灵活地控制任意粒度的日志信息的开启或关闭,
然后使用定制的格式,把日志信息输出到一个或多个需要的地方。并且,
Log4J还有一条平滑的学习曲线,在三分钟内就可学会它的简单使用。
随着使用深入,你会发现Log4J功能的强大,几乎可以满足日志方面的所有需要。

第一个log4j程序及其原理


1 第一个log4j程序

让我们从现在开始记时,看完成第一个log4j程序要不要3分钟。首先log4j-1.2.7.jar考到你的类路径下。然后创建一个类,代码如下:

java 代码
+ expand sourceview plaincopy to clipboardprint?
package TestLog4j;      
import org.apache.log4j.Logger;      
import org.apache.log4j.BasicConfigurator;      
import org.apache.log4j.PropertyConfigurator;      
import org.apache.log4j.Priority;      
     
public class TestLog4j       
{      
    //代码(1)      
    static Logger logger = Logger.getLogger(TestLog4j.class.getName());      
    public TestLog4j(){}      
    public static void main(java/lang/String.java.html" target="_blank">String[] args)     
{     
     //代码(2)     
        BasicConfigurator.configure();     
         //代码(3)     
        logger.debug("Start of the main() in TestLog4j");     
        logger.info("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(Priority.DEBUG, "Testing a log message use a alternate form");     
        logger.debug("End of the main() in TestLog4j");      
    }      
}     
package TestLog4j;   
import org.apache.log4j.Logger;   
import org.apache.log4j.BasicConfigurator;   
import org.apache.log4j.PropertyConfigurator;   
import org.apache.log4j.Priority;   
  
public class TestLog4j    
{   
    //代码(1)   
    static Logger logger = Logger.getLogger(TestLog4j.class.getName());   
    public TestLog4j(){}   
    public static void main(java/lang/String.java.html" target="_blank">String[] args)  
{  
     //代码(2)  
        BasicConfigurator.configure();  
         //代码(3)  
        logger.debug("Start of the main() in TestLog4j");  
        logger.info("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(Priority.DEBUG, "Testing a log message use a alternate form");  
        logger.debug("End of the main() in TestLog4j");   
    }   
}   
 
最后运行这个类,你就会看到运行结果为:
0 [main] DEBUG TestLog4j.TestLog4j  - Start of the main() in TestLog4j
10 [main] INFO TestLog4j.TestLog4j  - Just testing a log message with priority set to INFO
10 [main] WARN TestLog4j.TestLog4j  - Just testing a log message with priority set to WARN
21 [main] ERROR TestLog4j.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 FATAL
111 [main] DEBUG TestLog4j.TestLog4j  - Testing a log message use a alternate form
111 [main] DEBUG TestLog4j.TestLog4j  - End of the main() in TestLog4j
好了,看一看你的表,应该不到3分钟吧。在这短短的3分钟里,我们做了些什么呢?下面我们来分析一下代码。
1)    首先代码(1)先通过Logger类的getLogger()方法得到一个Logger类的对象。在getLogger()方法中,
 通常把所在的类的Class对象或是所在类的全名作为参数。运用log4j输出日志要用到Logger对象。
2)    然后代码(2)进行一些必要的初始化,如要把调试信息输出到哪。
 当用System.out.println()时可以很明确的知道要把信息输出到标准输出设备且只能输出到那里。
 运用log4j,我们可以输出到许多地方,如控制台、文件、HTML文件等,至于要输出到哪里,就要自己进行初始化。
 在代码(2),我们调用自带的初始化方法来完成初始化。用这个方法进行初始化就不能体现出log4j的灵活性,
 所以基本上不会这样做。Log4j提供了用XML文件或Java配置文件来配置设置的方法,在下面我们将进行介绍。
3)    接着代码(3)就是输出信息的代码了。你可以看到代码(3)中尝试了用几种不同的方法来输出信息,对于这几种信息的作用,
 我会在下面进行介绍,你现在只需把它当成是输出语句就行。
最后,我们来看一下运行结果(日志信息)的意义。第一个数字是指程序开始运行到运行该日志语句所经历的毫秒数
(用来做一点运行效率分析也不错),“[main]”是日志事件发生的线程,随后的“DEBUG”、“INFO”等信息是相应日志信息的优先级别,
“TestLog4j.TestLog4”是当前TestLog4所在的包和名称,最后是日志信息。

2 实例原理

虽然完成了第一程序了,但程序中的内容还是不太了解。好,现在我就对上面的例子用到的log4j的原理进行讲解。
在以后的章节中,我都会采取这种先实例,再根据实例来介绍所涉及的log4j原理的方法。

2.1 记录器Logger

Logger类是在log4j1.2以后才有的,以前是用Category类来实现现在的Logger类的功能的。
从API可知,Logger类是Category类的子类。Logger类的代码如下:

java 代码
+ expand sourceview plaincopy to clipboardprint?
package org.apache.log4j;      
     
public class Logger {      
     
    // 创建和取回方法:      
public static Logger getRootLogger();      
public static Logger getLogger(java/lang/String.java.html" target="_blank">String name);     
public static Logger getLogger(java/lang/Class.java.html" target="_blank">Class class1);      
     
    // 打印方法:      
    public void debug(java/lang/Object.java.html" target="_blank">Object message);     
    public void info(java/lang/Object.java.html" target="_blank">Object message);      
    public void warn(java/lang/Object.java.html" target="_blank">Object message);     
    public void error(java/lang/Object.java.html" target="_blank">Object message);      
    public void fatal(java/lang/Object.java.html" target="_blank">Object message);     
    
    // 常用打印方法:     
    public void log(Level l, java/lang/Object.java.html" target="_blank">Object message);      
}     
package org.apache.log4j;   
  
public class Logger {   
  
    // 创建和取回方法:   
public static Logger getRootLogger();   
public static Logger getLogger(java/lang/String.java.html" target="_blank">String name);  
public static Logger getLogger(java/lang/Class.java.html" target="_blank">Class class1);   
  
    // 打印方法:   
    public void debug(java/lang/Object.java.html" target="_blank">Object message);  
    public void info(java/lang/Object.java.html" target="_blank">Object message);   
    public void warn(java/lang/Object.java.html" target="_blank">Object message);  
    public void error(java/lang/Object.java.html" target="_blank">Object message);   
    public void fatal(java/lang/Object.java.html" target="_blank">Object message);  
 
    // 常用打印方法:  
    public void log(Level l, java/lang/Object.java.html" target="_blank">Object message);   
}    

在讨论Logger类中的方法之前,我先讲一下log4j中的级别(level)的概念。

2.1.1 级别Level

Log4j中的日志级别分为五种:DEBUG、INFO、WARN、ERROR和FATAL,这五种级别从左到右级别依次增加。

2.1.2 Logger中的打印函数与级别

对于每一个记录器,我们都可对它赋于一定的级别,而打印函数打印的即是相应级别的信息。
当对一个级别为A的Logger调用级别为B的打印方法时,只有当B>=A时才会进行打印。
例如,如果有一个级别为WARN的Logger对象logger,只有对它调用logger.warn (message)、logger.error (message)和
logger.fatal (message)这三个打印函数才会打印信息;而调用logger.debug (message)和logger.info (message)则不会打印信息,
因为debug()函数只有当logger的级别为DEBUG时才打印信息,info()函数只有当logger的级别为INFO时才打印信息。
除了对应于每一个级别有一个打印函数外,在Logger类中还有一个log(),它可以让你通过参数来指定一个打印信息的打印级别。

引入级别后就可通过修改调试的级别来控制某个调试信息是否输出。假设我们有的信息是在开发时才需要输出的(称为测试信息),
那么我们把输出测试信息的Logger的级别在开发时设为DEBUG级别的,并用debug(Object message)函数来进行打印。
当要发布系统时,只需把相应的Logger的级别调高就可以屏蔽掉测试信息。

 
二 动态配置log4j
1 配置外部配置文件来配置的基本步骤
1.1 一个运用配置文件的实例
Log4j之所以能成功的原因之一是它的灵活性。但如果只是简单的调用BasicConfigurator.configure()来进行配置工作,
那么所有的配置都是在函数中写死的,以后修改配置就要修改原代码,这就不能体现出log4j的灵活性了,
所以基本上不会通过BasicConfigurator.configure()来进行配置工作的。
为了增加软件的灵活性,最常用的做法就是使用配置文件,如web.xml之于J2EE,struts-config.xml之于struts一样,
log4j也提供了让我们把配置信息从程序转移到配置文件中的方法。Log4j提供了两种方式的配置文件:
XML文件和Java的property配置文件。通过把配置信息转移到外部文件中,当我们要修改配置信息时,
就可以直接修改配置文件而不用去修改代码了,下面,我们就来完成一个通过配置文件来实现log4j的实例。
例2-a:

java 代码
+ expand sourceview plaincopy to clipboardprint?
package TestLog4j;      
import org.apache.log4j.Logger;      
import org.apache.log4j.BasicConfigurator;      
import org.apache.log4j.PropertyConfigurator;      
import org.apache.log4j.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://nepalon//log4j.properties");      
     
logger.debug("Start of the main() in TestLog4j"); //代码(2)      
logger.info("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(Priority.WARN, "Testing a log message use a alternate form");      
logger.debug(TestLog4j.class.getName()); //代码(2)      
}      
}     
package TestLog4j;   
import org.apache.log4j.Logger;   
import org.apache.log4j.BasicConfigurator;   
import org.apache.log4j.PropertyConfigurator;   
import org.apache.log4j.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://nepalon//log4j.properties");   
  
logger.debug("Start of the main() in TestLog4j"); //代码(2)   
logger.info("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(Priority.WARN, "Testing a log message use a alternate form");   
logger.debug(TestLog4j.class.getName()); //代码(2)   
}   
}    


在这个例子中,我们用PropertyConfigurator.configure("F://nepalon//log4j.properties")代替BasicConfigurator.configure()进行配置。PropertyConfigurator.configure()函数的参数可以是一个properties文件所在路径的String对象,可以是一个properties文件所在路径的URL对象,也可以是一个properties对象。通过PropertyConfigurator.configure()可以通过指定的properties文件来配置信息。如果要用XML文件进行信息配置,可以在代码中调用DOMConfigurator()函数来进行配置工作。在这里,我们只以properties文件来完成例子。接着,我们来看一下log4j.properties文件中都有些什么东西:
例2-b:
log4j.rootLogger = DEBUG, A1
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %-4r [%t] %-5p %c %x - %m%n
运行这个实例,运行结果为
0 [main] DEBUG TestLog4j.TestLog4j - Start of the main() in TestLog4j
20 [main] INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO
20 [main] WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN
20 [main] ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR
20 [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
180 [main] DEBUG TestLog4j.TestLog4j - TestLog4j.TestLog4j
下面,我们分析一下这个配置文件。
1) 由于每一个Logger对旬都有一个级别,文件的第一行就是定义了一个Logger及其级别。在这里定义了一个根记录器(root logger),
这涉及到记录器的层次问题,在些暂时不深入讨论,在后面的章节再进行讨论。
2) 第二行定义了一个名为A1的输出流,这个流就是控制台,所以通过Logger对象打印的信息会在控制台输出。
3) 第三行定义了打印信息的布局。在这里我们用PatternLayout作为此记录器的布局,PatternLayout允许你以灵活的格式来打印信息。
4) 第四行指定的打印信息的具体格式,从结果可知,这个实例的打印格式为:当前打印语句所使用的时间 [日志所在的线程] 打印的级别
当前日志所在的类的全名 日志信息。
现在我们来修改一下这个记录器的级别,把第一行的DEBUG改为INFO,再运行程序,结果将变为:
0 [main] INFO TestLog4j.TestLog4j - Just testing a log message with priority set to INFO
10 [main] WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN
10 [main] ERROR TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR
10 [main] FATAL TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL
10 [main] WARN TestLog4j.TestLog4j - Testing a log message use a alternate form
由于这个Logger的级别变为INFO,而代码(2)是调用debug()函数来输出日志信息时只能当记录器级别为DEBUG时才输出信息,
所以代码(2)将不输出信息。
1.2 实例原理
1.2.1 初始化配置信息
如果要通过JAVA的properties文件来配置信息,那么在代码中就要通过PropertyConfigurator.configure()
函数从properties文件中加载配置信息,这个函数有三种参数形式:
一个properties文件所在路径的String对象,可以是一个properties文件所在路径的URL对象,
也可以是一个properties对象。如果要用XML文件来配置信息,则可用类型的
DOMConfigurator()函数来从一个XML文件中加载配置信息。
1.2.2 输出端Appender
在上面的例子中,我们都是简单的把日志信息输出到控制台中。其实在log4j中还可以把日志信息输出到其它的输出端,
对于同一个日志信息,我们还可以让它同时输出到多个输出端中,如同时在控制台和文件中进行打印。
一个输出端就是一个appender。要在配置文件中定义一个appender有三步:
1) 在定义一个记录器的同时定义出该记录器的输出端appender。在例2的配置文件的第一句log4j.rootLogger = DEBUG, A1中,
我们定义了一个根记录器,它的级别为DEBUG,它有一个appender名为A1。定义根记录器的格式为log4j.rootLogger = [ level ],
appendName1, appendName2, …appendNameN。同一个记录器可有多个输出端。
2) 定义appender的输出目的地。定义一个appender的输出目的地的格式为
log4j.appender.appenderName = fully.qualified.name.of.appender.class。log4j提供了以下几种常用的输出目的地:
? org.apache.log4j.ConsoleAppender,将日志信息输出到控制台                                                         
? org.apache.log4j.FileAppender,将日志信息输出到一个文件
? org.apache.log4j.DailyRollingFileAppender,将日志信息输出到一个,并且每天输出到一个新的日志文件
? org.apache.log4j.RollingFileAppender,将日志信息输出到一个文件,通过指定文件的的尺寸,
当文件大小到达指定尺寸的时候会自动把文件改名,如名为example.log的文件会改名为example.log.1,
同时产生一个新的example.log文件。如果新的文件再次达到指定尺寸,又会自动把文件改名为example.log.2,
同时产生一个example.log文件。依此类推,直到example.log. MaxBackupIndex,MaxBackupIndex的值可在配置文件中定义。
? 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
……
log4j.appender.appenderName.optionNameN = valueN
其中一个最常用的参数layout将在下面介绍。
1.2.3 输出格式(布局)layout
通过appender可以控制输出的目的地,而如果要控制输出的格式,就可通过log4j的layout组件来实现。
通过配置文件定义一个appender的输出格式,也通常需要两个步骤:
1) 定义appender的布局模式。定义一个appender的布局模式的格式为
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class。Log4j提供的布局模式有以下几种:
? org.apache.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.optionName1 = 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。在下面,
我们将介绍布局模式PatternLayout的参数ConversionPattern的各个值代表的含义。
1.2.4 ConversionPattern参数的格式含义
格式名 含义
%c 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },
输出类似:2002-10-18- 22:10:28
%f 输出日志信息所属的类的类名
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名
1.3 定义多个输出目的地的实例
从上面的实例原理中我们已经知道,同一个日志信息可以同时输出到多个输出目的地,在这个例子中,
我们将实现一个把日志信息同时输出到控制器、一个文件中的实例和数据库中。
这个实例的Java代码我们沿用例2中的代码,我们只需修改配置文件即可。这也体现了log4j的灵活性。
例3-a:

sql 代码
create table log4j(   
logID int primary key identity,   
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输出到控制器
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
#3 定义A1的布局模式为PatternLayout
log4j.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.appender.A2.File = F://nepalon//classes//example3.log
#7 定义A2的输出文件的最大长度
log4j.appender.A2.MaxFileSize = 1KB
#8 定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#9 定义A2的布局模式为PatternLayout
log4j.appender.A2.layout = org.apache.log4j.PatternLayout
#10 定义A2的输出格式
log4j.appender.A2.layout.ConversionPattern = %d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

#11区 定义A3输出到数据库
log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.BufferSize = 40
log4j.appender.A3.Driver = com.microsoft.jdbc.sqlserver.SQLServerDriver
log4j.appender.A3.URL = jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=nepalon
log4j.appender.A3.User = sa
log4j.appender.A3.Password =
log4j.appender.A3.layout = org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern = INSERT INTO log4j
(createDate, thread, priority, category, message) values(getdate(), '%t', '%-5p', '%c', '%m')
配置文件中的6、7、8行显示了输出端为RollingFileAppender的特有参数及其运用的方法。
11区显示了输出端为JDBCAppender的特有参数及其运用方法。在这着重讲解一下6、7、8行的作用。
6行指定日志信息输出到哪个文件,7行指定日志文件的最大长度,最后要详细介绍8行。第8行的参数是设置备份文件的个数的参数,
在这里我们设置为3,表示最多有3个备份文件,具体作用为:
1) 当example3.log文件的大小超过K时,就把文件改名为example3.log.1,同时生成一个新的example3.log文件
2) 当example3.log文件的大小再次超过1K,又把文件改名为example3.log.1。但由于此时example3.log.1已存在,
则先把example3.log.1更名为example3.log.2,再把example3.log文件改名为example3.log.1
3) 同理,当example3.log文件的大小再次超过1K,先把example3.log.2文件更名为example3.log.3,
把example3.log.1文件更名为example3.log.2,再把example3.log文件改名为example3.log.1
4) 当example3.log文件的大小再次超过1K,先把example3.log.2文件更名为example3.log.3,旧的example3.log.3文件将被覆盖;
把example3.log.1文件更名为example3.log.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 INFO
11 [main] WARN TestLog4j.TestLog4j - Just testing a log message with priority set to WARN
21 [main] ERROR TestLog4j.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 FATAL
21 [main] WARN TestLog4j.TestLog4j - Testing a log message use a alternate form
在文件example3.log中:
2003-12-18 04:23:02:INFO main TestLog4j.TestLog4j - Just testing a log message with priority set to INFO
2003-12-18 04:23:02:WARN main TestLog4j.TestLog4j - Just testing a log message with priority set to WARN
2003-12-18 04:23:02:ERROR main TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR
2003-12-18 04:23:02:FATAL main TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL
2003-12-18 04:23:02:WARN main TestLog4j.TestLog4j - Testing a log message use a alternate form

 

Log4j使用总结

#OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。

Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG

#这里定义能显示到的最低级别,若定义到INFO级别,则看不到DEBUG级别的信息了~!
log4j.rootLogger=DEBUG

#将DAO层log记录到DAOLog,allLog中
log4j.logger.DAO=DEBUG,A2,A4
#将逻辑层log记录到BusinessLog,allLog中
log4j.logger.Businesslog=DEBUG,A3,A4

#A1--打印到屏幕上
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p  [%t]  %37c  %3x  -  %m%n

#A2--打印到文件DAOLog中--专门为DAO层服务
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=DAOLog
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p]  %d{yyyy-MM-dd  HH:mm:ss,SSS}  method:%l%n%m%n

#A3--打印到文件BusinessLog中--专门记录逻辑处理层服务log信息
log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A3.file=BusinessLog
log4j.appender.A3.DatePattern='.'yyyy-MM-dd
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=[%-5p]  %d{yyyy-MM-dd  HH:mm:ss,SSS}  method:%l%n%m%n

#A4--打印到文件alllog中--记录所有log信息
log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A4.file=alllog
log4j.appender.A4.DatePattern='.'yyyy-MM-dd
log4j.appender.A4.layout=org.apache.log4j.PatternLayout
log4j.appender.A4.layout.ConversionPattern=[%-5p]  %d{yyyy-MM-dd  HH:mm:ss,SSS}  method:%l%n%m%n

#Appender的使用
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=demo
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%m%n

#Layout的配置
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p]  %d{yyyy-MM-dd  HH:mm:ss,SSS}  method:%l%n%m%n

ConversionPattern参数的格式含义
格式名  含义
%c  输出日志信息所属的类的全名
%d  输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd  HH:mm:ss  },输出类似:2002-10-18-  22:10:28
%f  输出日志信息所属的类的类名
%l  输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m  输出代码中指定的信息,如log(message)中的message
%n  输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%p  输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r  输出自应用启动到输出该日志信息所耗费的毫秒数
%t  输出产生该日志事件的线程名

#1  定义了两个输出端
log4j.rootLogger  =  INFO,  A1,  A2,A3

#2  定义A1输出到控制器
log4j.appender.A1  =  org.apache.log4j.ConsoleAppender
#3  定义A1的布局模式为PatternLayout
log4j.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.appender.A2.File  =  F:nepalonclassesexample3.log
#7  定义A2的输出文件的最大长度
log4j.appender.A2.MaxFileSize  =  1KB
#8  定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex  =  3
#9  定义A2的布局模式为PatternLayout
log4j.appender.A2.layout  =  org.apache.log4j.PatternLayout
#10  定义A2的输出格式
log4j.appender.A2.layout.ConversionPattern  =  %d{yyyy-MM-dd  hh:mm:ss}:%p  %t  %c  -  %m%n

配置log4j的总结
这个教程到这里,关于配置log4j的配置文件的基本原理已经讲完了,而且通过例3我们已经可以完成基本的日志工作了。现在,我们就做一个总结。配置一个配置文件的基本步骤如下:
1)  定义一个Logger。在定义Logger时指定该Logger的级别级其输出目的地。定义Logger的格式为
log4j.rootLogger  =  [  level  ],  appendName1,  appendName2,  …appendNameN。
2)  定义appender的输出目的地。定义一个appender的输出目的地的格式为
log4j.appender.appenderName  =  fully.qualified.name.of.appender.class。
log4j提供的输出端有ConsoleAppender、FileAppender  、DailyRollingFileAppender、RollingFileAppender和WriterAppender。
3)  定义appender的除布局模式外的其它相关参数,如例3中第6、7、8定义了A2的相关参数。定义格式为
log4j.appender.appenderName.optionName1  =  value1
……
log4j.appender.appenderName.optionNameN  =  valueN
如果除了布局模式外不需要定义别的参数,可跳过这一步(如例3中的A1)。
4)  定义appender的布局模式。定义一个appender的布局模式的格式为
log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class。
布局模式其实也是步骤3)中的一个部分,只是布局模式参数是每一个appender必须定义的参数。Log4j提供的布局模式有HTMLLayout、PatternLayout和SimpleLayout。
5)  定义与所选的布局模式相关的设置信息,定义格式为
og4j.appender.appenderName.layout.optionName1  =  value1
……
log4j.appender.appenderName.layout.optionNameN  =  valueN


在类中使用时,导入以下包:
import  org.apache.log4j.BasicConfigurator;
import  org.apache.log4j.Logger;
import  org.apache.log4j.PropertyConfigurator;

在类中创建log对象
private  Logger  log  =  Logger.getLogger(this.getClass());

 

log.info("");