SLF4j API: http://www.slf4j.org/api/org/slf4j/Logger.html
log4j:参考 http://www.iteye.com/topic/378077
log4j FAQ: http://www.java2s.com/CN/Code/Java/Language-Basics/Log4j.htm
 
   
   
   
   
  1. <slf4j-api.version>1.5.11slf4j-api.version> 
  2.         <log4j.version>1.2.16log4j.version> 
  3.         <slf4j-log4j12.version>1.5.6slf4j-log4j12.version> 
  4.  
  5.  
  6.         <dependency> 
  7.             <groupId>com.alibaba.externalgroupId> 
  8.             <artifactId>org.slf4j.slf4j-apiartifactId> 
  9.             <version>${slf4j-api.version}version> 
  10.         dependency> 
  11.         <dependency> 
  12.             <groupId>com.alibaba.externalgroupId> 
  13.             <artifactId>jakarta.log4jartifactId> 
  14.             <version>${log4j.version}version> 
  15.         dependency> 
  16.         <dependency> 
  17.             <groupId>com.alibaba.externalgroupId> 
  18.             <artifactId>org.slf4j.slf4j-log4j12artifactId> 
  19.             <version>${slf4j-log4j12.version}version> 
  20.         dependency> 
 
 
 
 
 
 
 
   
   
   
   
  1. <dependency> 
  2.           <groupId>com.alibaba.externalgroupId> 
  3.          <artifactId>jakarta.log4jartifactId> 
  4.          <version>1.2.16version> 
  5. dependency> 
 
  知识点梳理:
   (1)让下一次增加的log内容添加到log文件最后, 而不是覆盖, true"/>
   (2)分别控制每个部分的输出格式:分别在每种输出格式里面说明就可以了
   (3)让console和file都输出:  将文件输出样式和标准输出样式都加到root标签中。
    <appender-ref ref="FILE" />

    <appender-ref ref="STDOUT" />
 (4)Log4j的继承

Parent类:
import org.apache.log4j.Logger;

public class Parent {
   protected static Logger    log = null; //不能为private
  Parent(){
    log= Logger.getLogger(getClass().getName());
  }
   public static void testParent(){
    log.info( "--hello parent!--");
  }
   public static void main(String[] args) {
     new Parent().testParent();
  }
}
 
Son类:
public class Son extends Parent {
   public void testSon(){
    log.info( "---hello son---");  //利用父类继承过来的log对象
  }
   public static void main(String[] args) {
     new Son().testSon();
  }
}

(5)输出格式转换

转换模式(conversion pattern)为"%r [%t] %-5p %c - %m%n"的PatternLayout将生成类似于以下内容的输出: 
176 [main] INFO org.foo.Bar - Located nearest gas station

在上面的输出中: 
* 第一个字段表示自程序开始到发出日志记录请求时所消耗的毫秒数 
* 第二个字段表示发出日志记录请求的线程 
* 第三个字段表示日志记录请求的Level 
* 第四个字段表示发出日志记录请求的Logger的名称 
* 第五个字段(-后的文本)表示日志记录请求的消息
log4j的配置文件如下: 
xml version ="1.0" encoding ="GB2312" ?>    
    
    
< log4j:configuration xmlns:log4j ='http://jakarta.apache.org/log4j/' >    
    
    
    
    
    
< appender name ="LOG.DEBUG" class ="org.apache.log4j.RollingFileAppender" >    
< param name ="File" value ="d:/log/debug.log" />    
< param name ="MaxFileSize" value ="5120KB" />    
< param name ="MaxBackupIndex" value ="10" />    
< layout class ="org.apache.log4j.PatternLayout" >    
     < param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />    
layout >    
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >        
     < param name ="LevelMin" value ="DEBUG" />        
     < param name ="LevelMax" value ="DEBUG" />        
filter >    
appender >    
    
    
< appender name ="LOG.INFO" class ="org.apache.log4j.RollingFileAppender" >    
< param name ="File" value ="d:/log/info.log" />    
< param name ="MaxFileSize" value ="5120KB" />    
< param name ="MaxBackupIndex" value ="10" />    
< layout class ="org.apache.log4j.PatternLayout" >    
     < param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />    
layout >    
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >        
     < param name ="LevelMin" value ="INFO" />        
     < param name ="LevelMax" value ="INFO" />        
filter >    
appender >    
    
    
< appender name ="LOG.WARN" class ="org.apache.log4j.RollingFileAppender" >    
< param name ="File" value ="d:/log/warn.log" />    
< param name ="MaxFileSize" value ="5120KB" />    
< param name ="MaxBackupIndex" value ="10" />    
< layout class ="org.apache.log4j.PatternLayout" >    
     < param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />    
layout >    
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >        
     < param name ="LevelMin" value ="WARN" />        
     < param name ="LevelMax" value ="WARN" />        
filter >    
appender >    
    
    
< appender name ="LOG.ERROR" class ="org.apache.log4j.RollingFileAppender" >    
< param name ="File" value ="d:/log/error.log" />    
< param name ="MaxFileSize" value ="5120KB" />    
< param name ="MaxBackupIndex" value ="10" />    
< layout class ="org.apache.log4j.PatternLayout" >    
     < param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />    
layout >    
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >        
     < param name ="LevelMin" value ="ERROR" />        
     < param name ="LevelMax" value ="ERROR" />        
filter >    
appender >    
    
    
< appender name ="LOG.FATAL" class ="org.apache.log4j.RollingFileAppender" >    
< param name ="File" value ="d:/log/fatal.log" />    
< param name ="MaxFileSize" value ="5120KB" />    
< param name ="MaxBackupIndex" value ="10" />    
< layout class ="org.apache.log4j.PatternLayout" >    
     < param name ="ConversionPattern" value ="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />    
layout >    
< filter class ="org.apache.log4j.varia.LevelRangeFilter" >        
     < param name ="LevelMin" value ="FATAL" />        
     < param name ="LevelMax" value ="FATAL" />        
filter >    
appender >    
    
    
    
    
    
< root >    
< priority value ="DEBUG" />    
    
< appender-ref ref ="LOG.DEBUG" />    
< appender-ref ref ="LOG.INFO" />    
< appender-ref ref ="LOG.WARN" />    
< appender-ref ref ="LOG.ERROR" />    
< appender-ref ref ="LOG.FATAL" />    
root >    
    
log4j:configuration >    
 
 
 
log4j.xml另外一个模板
xml  version ="1.0"  encoding ="GB2312"  ?>

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

< appender  name ="STDOUT"  class ="org.apache.log4j.ConsoleAppender" >
                                
     < layout  class ="org.apache.log4j.PatternLayout" >
      < param  name ="ConversionPattern"
         value ="%-4r [%t] %-5p %c %x - %m%n"  />
     layout >
                                
     < filter  class ="org.apache.log4j.varia.LevelRangeFilter" >
    
      < param  name ="levelMin"  value ="INFO"  />
      < param  name ="levelMax"  value ="ERROR"  />
        
      < param  name ="AcceptOnMatch"  value ="true"  />
     filter >
appender >

< appender  name ="FILE"
     class ="org.apache.log4j.RollingFileAppender" >
    
     < param  name ="File"  value ="all.output.log"  />
     < param  name ="Append"  value ="true"  />
     < param  name ="MaxBackupIndex"  value ="10"  />
     < layout  class ="org.apache.log4j.PatternLayout" >
      < param  name ="ConversionPattern"  value ="%p (%c:%L)- %m%n"  />
     layout >
appender >

< root >
     < priority  value ="INFO"  />
     < appender-ref  ref ="FILE"  />
     < appender-ref  ref ="STDOUT"  />
root >

log4j:configuration >
 
 
【注意】

1、Log4j设置循环记录日志文件

       
       
       
       
  1. log4j.appender.fileout=org.apache.log4j.RollingFileAppender 
  2. log4j.appender.fileout.File=####  为文件名,这个存放的位置为project工程的根目录 
  3. log4j.appender.fileout.MaxFileSize=5MB 
  4. log4j.appender.fileout.MaxBackupIndex=50 
  5. log4j.appender.fileout.layout=org.apache.log4j.PatternLayout 
  6. log4j.appender.fileout.layout.ConversionPattern=%d{ABSOLUTE} %-5p %t %c{5} - %m%n 
 
  某个类输出日志到某个log文件配置 
log4j.rootLogger=info, stdout,console
log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.File=../log/updater.log
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
log4j.appender.stdout.Append=true
#console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
#log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
#app log
#com.wonibo.projectx.service.index.ReadTxtDaemon类使用warn级别且使用 txtfailure类型的appender
log4j.logger.com.wonibo.projectx.service.index.ReadTxtDaemon=warn, txtfailure
#未指定appender的则从root继承
log4j.logger.org.springframework=warn
log4j.logger.org.hibernate.ps.PreparedStatementCache=warn
log4j.logger.org.hibernate=warn
log4j.logger.org.hibernate.SQL=warn
log4j.logger.org.hibernate.type=warn
log4j.logger.com.danga.MemCached=warn
log4j.logger.org.apache.velocity=warn
log4j.appender. txtfailure=org.apache.log4j.FileAppender
log4j.appender. txtfailure.File=../log/txtfailure.log
log4j.appender. txtfailure.layout=org.apache.log4j.PatternLayout
log4j.appender. txtfailure.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %-17c{2} - %m%n
log4j.appender. txtfailure.Append=true
 
 

log4j.properties的放置位置

http://gigi-112.javaeye.com/blog/587965
 
  1. public  Logger m_log = null;  
  2.       
  3. public ETrafficPlanService(){  
  4.     PropertyConfigurator.configure("data//config//log4j//log4j_etraffic.properties");  
  5.     m_log = Logger.getLogger(ETrafficPlanService.class);  
  6.     m_log.debug("debug test...........");  
  7. }  
 
问题总结:
1、 PropertyConfigurator.configure("src\\test\\java\\log4j.properties");//位置相对于工程根目录的位置为起点 
【注意】只针对Properties文件有效,xml配置文件无效
 
读取XML配置文件: DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件
 
       
       
       
       
  1. private Logger logger; 
  2.  
  3.   public MyThread() { 
  4.       super(); 
  5.       //PropertyConfigurator.configure(System.getProperty("user.dir") + "/src/main/java/com/alibaba/thread/log.properties"); 
  6.       DOMConfigurator.configure(System.getProperty("user.dir") + "/src/main/java/com/alibaba/thread/log4j.xml"); 
  7.       logger = LoggerFactory.getLogger(this.getClass().getName()); 
  8.   } 
【注意】
相对路径: DOMConfigurator.configure(this.getClass().getClassLoader().getResource("com/alibaba/thread/log4j.xml"));
绝对路径:
DOMConfigurator.configure(System.getProperty("user.dir") + "/src/main/java/com/alibaba/thread/log4j.xml"); 
 
2、log4j.appender.stdout.File=../log/updater.log //位置的起点为工程的根目录为起点
例如../log/updater.log:表示工程根目录的上级目录下的log,再生成updater.log文件
 
3、Logger
默认使用log4j.rootLogger, 也可以自定义某些包或类的logger:log4j.logger.com.alibaba.maven.hello.Simple
 
log的日志级别:ALL< TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
常用为中间4种
 
4、Appender
AppenderSkeleton,  AsyncAppender,  ConsoleAppender,  DailyRollingFileAppender,  ExternallyRolledFileAppender,  FileAppender,  JDBCAppender,  JMSAppender, LF5Appender,  NTEventLogAppender,  NullAppender,  RollingFileAppender,  SMTPAppender,  SocketAppender,  SocketHubAppender,  SyslogAppender,  TelnetAppender, WriterAppender
 
API: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html
 
设置DailyRollingFileAppender时,可以设置之前的log修改成什么样的格式
log4j.appender.simple.DatePattern='_'yyyy-MM-dd
 
5、输出类型: layout
Simple layout-- org.apache.log4j.SimpleLayout
SimpleLayout formats the output in a very simple manner, it prints the Level, then a dash '-' and then the log message.
PatternLayout --org.apache.log4j.PatternLayout
PatternLayout formats the output based on a conversion pattern specified, or if none is specified, the default conversion pattern.
HTML layout-- org.apache.log4j.HTMLLayout
HTMLLayout formats the output as a HTML table.
XMLLayout-- org.apache.log4j.xml.XMLLayout
XMLLayout formats the output as a XML.
6、什么情况可以使用SLF4j
 
  如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。 
 

     < dependency >
       < groupId >com.alibaba.external groupId >
       < artifactId >org.slf4j.slf4j-api artifactId >
       < version >1.5.11 version >
     dependency >
     < dependency >
       < groupId >com.alibaba.external groupId >
       < artifactId >jakarta.log4j artifactId >
       < version >1.2.16 version >
     dependency >