java日志(slf4j, log4j, jdk4j,slf4j_simple,)

时间:2021-05-31 22:03:59

以前自学java的时候,听圣思源的张龙讲到过slf4j,由于年代过于久远,都不知道这个jar是干嘛的,直到今天做了这个笔记之后.....

先写个题外话,csdn博客怎么插入图片:在文章正文下面后看到上传附件,先把图片上传上来  然后点击 上传的图片后面的 插入就可以了哦

先了解一下文中会用到的一些概念:

1.  概念

Slf4j 全称为Simple Logging Facade for JAVA:java简单日志门面。 是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging 应该有一样的初衷。个人感觉设从计上更好一些,没有commons 那么多潜规则。同时有两个额外特点:

1. 能支持多个参数,并通过{} 占位符进行替换,避免老写logger.isXXXEnabled 这种无奈的判断,带来性能提升见:http://www.slf4j.org/faq.html#logging_performance 。

2.OSGI 机制更好兼容支持(暂时还不能理解)

Commons-logging : apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现。通过统一接口解耦,不过其内部也实现了一些简单日志方案。

Log4j : 经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。

slf4j-simple:也是一种日志解决方案。


以下是对slf4j更详细的解释引用资源:http://baike.baidu.com/view/1895694.htm

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
1、什么情况可以使用
如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。
2. 举例
自己根据网上的简单教程写了三个关于slf4j与一些具体日志解决方案整合 的小例子,
demo下载地址:http://download.csdn.net/detail/u012049463/6383477     例子很简答,看了就懂,如下(都是图): 
第一个是slf4j+slf4j_simple    (图A)
java日志(slf4j, log4j, jdk4j,slf4j_simple,)

第二个是slf4j+slf4j_jdk  (图B)
java日志(slf4j, log4j, jdk4j,slf4j_simple,)

第三个是slf4j+slf4j_log4j+log4j   (图C)
java日志(slf4j, log4j, jdk4j,slf4j_simple,)

相信到这里,大家都能大概能够理解slf4j的作用了,下面我们再来讲讲最近用的比较多的log4j的用法。

log4j教程

这有个关于log4j的教程,讲的很有条理也很具体: http://blog.csdn.net/wlq1983/article/details/2827638
以下是复制的该页面的内容:
1. 简介
2. 安装
3. log4j基本概念
3.1. Logger
3.2. Appender
3.2.1. 使用ConsoleAppender
3.2.2. 使用FileAppender
3.2.3. 使用WriterAppender
3.3. Layout
3.4. 基本示例
3.4.1. SimpleLayout和FileAppender
3.4.2. HTMLLayout和WriterAppender
3.4.3. PatternLayout和ConsoleAppender
4. 使用外部配置文件
5. 参考资料 (以及一些有参考价值的链接)

使用log4j大概涉及3个主要概念:

日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。 日志记录器(Logger)的可用级别Level (不包括自定义级别 Level), 以下内容就是摘自log4j API (http://jakarta.apache.org/log4j/docs/api/index.html):

  • static Level DEBUG

    DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。

  • static Level INFO

    INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。

  • static Level WARN

    WARN level表明会出现潜在错误的情形。

  • static Level ERROR

    ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。

  • static Level FATAL

    FATAL level指出每个严重的错误事件将会导致应用程序的退出。

另外,还有两个可用的特别的日志记录级别: (以下描述来自log4j APIhttp://jakarta.apache.org/log4j/docs/api/index.html):

  • static Level ALL

    ALL Level是最低等级的,用于打开所有日志记录。

  • static Level OFF

    OFF Level是最高等级的,用于关闭所有日志记录。

日志记录器(Logger)的行为是分等级的。


有很多方法可以创建一个日志记录器(Logger),下面方法可以取回root日志记录器:

Logger logger = Logger.getRootLogger();

还可以这样创建一个新的日志记录器:

Logger logger = Logger.getLogger("MyLogger");

比较常用的用法,就是根据类名实例化一个静态的全局日志记录器:

static Logger logger = Logger.getLogger(test.class);

所有这些创建的叫"logger"的日志记录器都可以用下面方法设置级别:

logger.setLevel((Level)Level.WARN);

可以使用7个级别中的任何一个; Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.ALL and Level.OFF.

Appender 控制日志怎样输出。下面列出一些可用的Appender(log4j API中所描述的http://jakarta.apache.org/log4j/docs/api/index.html):

  1. ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者 System.err。默认的目标是System.out。

  2. DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录。

  3. FileAppender 把日志事件写入一个文件

  4. RollingFileAppender 扩展FileAppender备份容量达到一定大小的日志文件。

  5. WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream。

  6. SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。

  7. SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

  8. SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

  9. SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。

  10. TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender。

还可以实现 Appender 接口,创建以自己的方式进行日志输出的Appender。

Appender类及其作用列表

Appender类名
作 用
org.apache.log4j.ConsoleAppender
将日志输出到控制台
org.apache.log4j.FileAppender
将日志输出到文件
org.apache.log4j.DailyRollingFileAppender
每天产生一个日志文件
org.apache.log4j.RollingFileAppender
文件大小到达指定尺寸时产生一个新的文件
org.apache.log4j. WriterAppender
将日志信息以流格式发送到任意指定的地方
 公有选项:
-Threshold=WARN:指定日志消息的输出最低层次。
-ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

1)ConsoleAppender选项
-Target=System.err:默认情况下是:System.out,指定输出控制台。
 
2)FileAppender 选项
-File=mylog.txt:指定消息输出到mylog.txt文件。
- Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
 
3)DailyRollingFileAppender 选项
-File=mylog.txt:指定消息输出到mylog.txt文件。
-Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
-DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
'.'yyyy-MM: 每月
'.'yyyy-ww: 每周 
'.'yyyy-MM-dd: 每天
'.'yyyy-MM-dd-a: 每天两次
'.'yyyy-MM-dd-HH: 每小时
'.'yyyy-MM-dd-HH-mm: 每分钟
 
4)RollingFileAppender 选项
-File=mylog.txt:指定消息输出到mylog.txt文件。
- Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
-MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
-MaxBackupIndex=2:指定可以产生的滚动文件的最大数。


FileAppender可以用这种方式创建:

FileAppender appender = null; 
try {
     appender = new FileAppender(new PatternLayout(),"filename"); 
} catch(Exception e) {}

上面用到的构造函数:

FileAppender(Layout layout, String filename) 
实例化一个FileAppender并且打开变量"filename"指定的文件。        

另一个有用的构造函数是:

FileAppender(Layout layout, String filename, boolean append)
实例化一个FileAppender并且打开变量"filename"指定的文件。        

这个构造函数还可以选择是否对指定的文件进行追加的方式输出。如果没有指定值,那么默认的方式就是追加

Appender必须使用一个与之相关联的 Layout,这样它才能知道怎样格式化它的输出。当前,log4j具有三种类型的Layout:

  1. HTMLLayout 格式化日志输出为HTML表格。

  2. PatternLayout 根据指定的 转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式。

  3. SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息。

    4.org.apache.log4j.TTCCLayout ,它包含日志产生的时间,线程,类别等信息


    1)HTMLLayout 选项
    -LocationInfo=true:默认值是false,输出java文件名称和行号。
    -Title=my app file: 默认值是 Log4J Log Messages。
     
    2)PatternLayout 选项
    - ConversionPattern=%m%n :指定怎样格式化指定的消息。
     
    3)XMLLayout  选项
    -LocationInfo=true:默认值是false,输出java文件和行号。
     
    自定义PatternLayout:
     log4j.appender.myAppender.layout.ConversionPattern=
    %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
    这里需要说明的就是日志信息格式中几个符号所代表的含义:
    1)-X号: X信息输出时左对齐。
    2)%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
    3)%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921。
    4)%r: 输出自应用启动到输出该log信息耗费的毫秒数。
    5)%c: 输出日志信息所属的类目,通常就是所在类的全名。
    6)%t: 输出产生该日志事件的线程名。
    7)%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)。
    8)%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    9)%%: 输出一个"%"字符。
    10)%F: 输出日志消息产生时所在的文件名称。
    11) %L: 输出代码中的行号。
    12)%m: 输出代码中指定的消息,产生的日志具体信息。
    13)%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行。
    可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
    1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
    2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
    3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
    4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

这里是一个非常简单的例子,程序实现了SimpleLayout和FileAppender:

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.FileAppender;
public class simpandfile {   
    static Logger logger = Logger.getLogger(simpandfile.class);
    public static void main(String args[]) {
        SimpleLayout layout = new SimpleLayout();
        FileAppender appender = null; 
        try {
             appender = new FileAppender(layout,"output1.txt",false);
        } catch(Exception e) {}
        logger.addAppender(appender); 
        logger.setLevel((Level) Level.DEBUG);
        logger.debug("Here is some DEBUG");
        logger.info("Here is some INFO");
        logger.warn("Here is some WARN");
        logger.error("Here is some ERROR");
        logger.fatal("Here is some FATAL");   
     }
}        


这里是一个非常简单的例子,程序实现了 HTMLLayout和WriterAppender:

import java.io.*;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.WriterAppender;
public class htmlandwrite {
   static Logger logger = Logger.getLogger(htmlandwrite.class);
   public static void main(String args[]) {
      HTMLLayout layout = new HTMLLayout();
      WriterAppender appender = null;
      try {
         FileOutputStream output = new FileOutputStream("output2.html");
         appender = new WriterAppender(layout,output);
      } catch(Exception e) {}
      logger.addAppender(appender);
      logger.setLevel((Level) Level.DEBUG);
      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");   
   }
}        


这里是一个非常简单的例子,程序实现了PatternLayout和ConsoleAppender:

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.ConsoleAppender;
public class consandpatt {
   static Logger logger = Logger.getLogger(consandpatt.class);
   public static void main(String args[]) {
      // Note, %n is newline
      String pattern =  "Milliseconds since program start: %r %n";
      pattern += "Classname of caller: %C %n";
      pattern += "Date in ISO8601 format: %d{ISO8601} %n";
      pattern += "Location of log event: %l %n";
      pattern += "Message: %m %n %n"; 
      PatternLayout layout = new PatternLayout(pattern);
      ConsoleAppender appender = new ConsoleAppender(layout);
      logger.addAppender(appender);
      logger.setLevel((Level) Level.DEBUG);
      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");
   }
}        


Log4j经常与外部日志文件联合使用,这样很多可选项不必硬编码在软件中。使用外部配置文件的优点就是修改可选项不需要重新编译程序。唯一的缺点就是,由于用到io 指令,速度稍微有些减慢。

有两个方法可以用来指定外部配置文件:文本文件或者XML文件。既然现在所有事情都写成XML文件,那么该教程就重点讲解XML文件方法,但是也包含相关文本文件的例子。首先,看看下面的XML配置文件示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.SimpleLayout"/>
    </appender>
    <root>
      <priority value ="debug" />
      <appender-ref ref="ConsoleAppender"/>
    </root>
</log4j:configuration>     

文件以标准的XML声明作为开始,后面跟着指出DTD(文档类型定义)的DOCTYPE声明,它定义了XML文件的结构,例如,什么元素可以嵌入在其他元素中等等。上面文件在log4j发行版的src/java/org/apache/log4j/xml目录中。 接着看看封装所有元素的 log4j:configuration 元素,它在DOCTYPE声明中被指定为根元素。嵌入在根元素中有两个结构:

  <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.SimpleLayout"/>
  </appender>          

这里创建一个名叫"ConsoleAppender"的 Appender,注意,你可以选择任何名字,该示例之所以选择"ConsoleAppender",完全是为了示例的设计。接着这个appender类以全名形式给出,经常用规范(fully qualified)类名。 Appender必须具有一个指定的 nameclass。嵌入在 Appender之内的是 layout元素,这里它被指定为SimpleLayout。 Layout 必须具有一个 class属性。

  <root>
    <priority value ="debug" />
    <appender-ref ref="ConsoleAppender"/>
  </root>          

root元素必须存在且不能被子类化。示例中的优先级被设置为"debug",设置appender饱含一个appender-ref元素。还有更多的属性或元素可以指定。查看log4j发行版中的src/java/org/apache/log4j/xml/log4j.dtd以了解关于XML配置文件结构的更多信息。可以用下面这种方法把配置信息文件读入到Java程序中:

DOMConfigurator.configure("configurationfile.xml");    

DOMConfigurator 用一棵DOM树来初始化log4j环境。这里是示例中的XML配置文件:plainlog4jconfig.xml。这里是执行该配置文件的程序: files/externalxmltest.java:

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class externalxmltest {
   static Logger logger = Logger.getLogger(filetest.class);
   public static void main(String args[]) {
      DOMConfigurator.configure("xmllog4jconfig.xml");
      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");
   }
}    

这里是一个实现带有PatternLayoutFileAppender的日志记录器Logger的XML配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="appender" class="org.apache.log4j.FileAppender">
    <param name="File" value="Indentify-Log.txt"/>
    <param name="Append" value="false"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
    </layout>
  </appender>
  <root>
    <priority value ="debug"/>
    <appender-ref ref="appender"/>
  </root>
</log4j:configuration>    

你可以从这里下载示例: xmllog4jconfig2.xml。 想要得到更多的使用XML文件配置log4j环境的例子,请查看log4j发行版的目录src/java/org/apache/log4j/xml/examples/ 。

这就是上面讨论的文本文件形式的配置文件:

# initialise root logger with level DEBUG and call it BLAHlog4j.rootLogger=DEBUG,
 BLAH# add a ConsoleAppender to the logger BLAHlog4j.appender.BLAH=
org.apache.log4j.ConsoleAppender# set set that layout to be SimpleLayoutlog4j.appender.BLAH.layout=
org.apache.log4j.SimpleLayout    

从这里可以下载: plainlog4jconfig.txt。这就是执行该配置文件的程序:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class externalplaintest {
   static Logger logger = Logger.getLogger(externalplaintest.class);
   public static void main(String args[]) {
      PropertyConfigurator.configure("plainlog4jconfig.xml");
      logger.debug("Here is some DEBUG");
      logger.info("Here is some INFO");
      logger.warn("Here is some WARN");
      logger.error("Here is some ERROR");
      logger.fatal("Here is some FATAL");
   }
}    

你可以下载使用该配置文件的示例: externalplaintest.java。想要获得更多的使用文本文件配置log4j环境的例子,请查看log4j发行版中的目录examples

使用外部配置文件的例子就简单的讨论到这里,现在应该可以肯定你已经有能力独立学习更多的log4j发行版和测试版中提供的例子。

     4.2  log4j与spring整合

先看一下配置文件(log4j.properties):
#defing a root logger, priority lever is debug, appender is xixi and hehe which define by customer
#log4j.rootLogger=DEBUG,xixi,hehe
log4j.logger.com.unj=info,xixi
log4j.logger.com.unj.packageA.ClassA=debug,xixi
log4j.logger.com.unj.packageB.ClassB=info,xixi
log4j.logger.com.unj.packageC.ClassC=warn,xixi
log4j.logger.com.unj.packageD.ClassD=error,xixi
log4j.logger.com.unj.packageD.ClassE=fatal,xixi
log4j.additivity.com.unj.packageD.ClassE=false
log4j.additivity.com.unj.packageA.ClassA=false
log4j.threshold=ERROR
log4j.appender.xixi.threshold=fatal
#

#out log to console
#define a appender which name is xixi, it appender type is org.apache.log4j.ConsoleAppender,layout is org.apache.log4j.PatternLayout and define it output format is like [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c:%L] - %m%n  
log4j.appender.xixi=org.apache.log4j.ConsoleAppender
log4j.appender.xixi.layout=org.apache.log4j.PatternLayout
log4j.appender.xixi.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c:%L] - %m%n

#out log to file
log4j.appender.hehe=org.apache.log4j.RollingFileAppender
log4j.appender.hehe.File=${ssh.root}/WEB-INF/logs/xixihehehuiliangjia.log
log4j.appender.hehe.MaxFileSize=5120KB
log4j.appender.hehe.MaxBackupIndex=10
log4j.appender.hehe.layout=org.apache.log4j.PatternLayout
log4j.appender.hehe.layout.ConversionPattern=[d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c:%L] - %m%n

在web.xml中:
 
    
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>log4j_spring_test</display-name>
	<!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root" -->
	<context-param>
		<param-name>webAppRootKey</param-name>
		<param-value>ssh.root</param-value>
	</context-param>
	<!--由Sprng载入的Log4j配置文件位置 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4jConfig.properties</param-value>
	</context-param>
	<!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond -->
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>6000</param-value>
	</context-param>
	<!--Spring log4j Config loader -->
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	
	<!-- define servlet -->
	<servlet>
		<servlet-name>mylog</servlet-name>
		<servlet-class>com.unj.packageA.LogServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>mylog</servlet-name>
		<url-pattern>justdoit/log</url-pattern>
	</servlet-mapping>

</web-app>




在spring中,log4j是和common-logging一起使用的,所以在整合spring和log4j时,一般要导入log4j-1.2.17.jar和commons-logging-1.1.1.jar
ClassA中的日志会记录两遍,因为com.unj.packageA.ClassA会继承com.unj和rootLogger,但是由于rootLogger没有定义appender,所以就只输出两遍。这种继承关系只会将父类的appender加到自己的appender列表当中,而父类中的输出级别对自己不受影响,如上,com.unj输出是info,com.unj.packageA.ClassA输出仍是debug,只是输出appender会是两个xixi。若rootlogger也定义了appender是xixi,那么com.unj.packageA.ClassA将会输出三遍。
为了摆脱这种情况,可以使用配置log4j.additivity.com.unj.packageA.ClassA=false,这样com.unj.packageA.ClassA的日志只会输出到自己的appender,而不会继承父类的。
log4j.threshold=ERROR 用来控制所有的appender,即输出到所有appender的日志,不管原来是什么级别的,都不能低于threshold所规定的级别。
还有一种更细粒度的控制日志输出级别的,log4j.appender.xixi.threshold=fatal 用来控制指定的appender的输出级别。

log4j.rootLogger=DEBUG,xixi,hehe 一般都会配置,因为自定义的log4j.logger 都会继承这个rootLogger,它就相当于java类中的Object类一样。