1. <slf4j-api.version>1.5.11</slf4j-api.version> 
  2.         <log4j.version>1.2.16</log4j.version> 
  3.         <slf4j-log4j12.version>1.5.6</slf4j-log4j12.version> 
  4.  
  5. <!-- log4j --> 
  6.         <dependency> 
  7.             <groupId>com.alibaba.external</groupId> 
  8.             <artifactId>org.slf4j.slf4j-api</artifactId> 
  9.             <version>${slf4j-api.version}</version> 
  10.         </dependency> 
  11.         <dependency> 
  12.             <groupId>com.alibaba.external</groupId> 
  13.             <artifactId>jakarta.log4j</artifactId> 
  14.             <version>${log4j.version}</version> 
  15.         </dependency> 
  16.         <dependency> 
  17.             <groupId>com.alibaba.external</groupId> 
  18.             <artifactId>org.slf4j.slf4j-log4j12</artifactId> 
  19.             <version>${slf4j-log4j12.version}</version> 
  20.         </dependency> 
 
 
 
 
 
 
 
  1. <dependency> 
  2.           <groupId>com.alibaba.external</groupId> 
  3.          <artifactId>jakarta.log4j</artifactId> 
  4.          <version>1.2.16</version> 
  5. </dependency> 
 
  知识点梳理:
   (1)让下一次增加的log内容添加到log文件最后,而不是覆盖, <param name="Append" value="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" ?>    
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">    
<!--#log4j中有5级logger ,#FATAL 0 ,#ERROR 3 ,#WARN 4 ,#INFO 6 ,#DEBUG 7 -->    
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>    
    
<!--输出到控制台-->    
<!--    
<appender name="LOG.Console" class="org.apache.log4j.ConsoleAppender">        
<layout class="org.apache.log4j.PatternLayout">        
    <param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />        
</layout>        
</appender>    
-->    
    
<!--将级别为DEBUG的信息输出到控制台-->    
<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>    
    
<!--将级别为INFO的信息输出到控制台-->    
<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>    
    
<!--将级别为WARN的信息输出到控制台-->    
<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>    
    
<!--将级别为ERROR的信息输出到控制台-->    
<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>    
    
<!--将级别为FATAL的信息输出到控制台-->    
<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>    
    
<!--    
<appender name="InitAction" class="org.apache.log4j.DailyRollingFileAppender">    
<param name="File" value="d:/dbcon.log"/>    
<param name="MaxFileSize" value="5120KB"/>    
<param name="MaxFileSize" value="10" />    
<param name="MaxBackupIndex" value="2" />    
<param name="DatePattern" value="'.'yyyy-MM-dd'.'log"/>    
<layout class="org.apache.log4j.PatternLayout">    
    <param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} - %m%n"/>    
    <param name="ConversionPattern" value="%d{DATE} [%-5p] %c {%F:%L} - %m%n"/>    
</layout>    
</appender>    
-->    
    
<!--设置org.logicalcobwebs包的输出级别为INFO-->    
<!--    
<category name="org.logicalcobwebs">    
<priority value="INFO" />    
<appender-ref ref="LOG.Console" />    
</category>    
-->    
<root>    
<priority value="DEBUG"/>    
<!--    
<appender-ref ref="LOG.Console" />    
    
-->    
<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" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<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">
    <!-- 设置通道file和输出方式:org.apache.log4j.RollingFileAppender -->
    <param name="File" value="all.output.log" /><!-- 设置File参数:日志输出文件名 -->
    <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" /><!-- 与前面的通道id相对应 -->
    <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的放置位置

 
  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
 
 
设置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,那么这种转换将是非常轻松的事情。 
 
<!-- slf4j & log4j -->
    <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>