log4j的使用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
 
 
  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 >
 
 
 本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/244266,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
Java 数据库
Log4j介绍
Log4j介绍
64 0
|
2月前
|
XML Java 数据库连接
|
5月前
|
XML 移动开发 Java
|
12月前
|
XML 运维 Java
Log4j2使用总结
Log4j2使用总结
108 0
|
XML JSON 网络协议
Log4j2-Log4j 2介绍及使用
Log4j2-Log4j 2介绍及使用
205 0
|
安全 Java Apache
玩大了,Log4j 2.x 再爆雷。。。
最近沸沸扬扬的 Log4j2 漏洞门事件炒得热火朝天,历经多次版本升级。。。
玩大了,Log4j 2.x 再爆雷。。。
|
Android开发
Log
Log框架 Logger (简单,漂亮,强大的Android日志工具) Hugo (在调试版本上注解的触发方法进行日志记录) Timber (一个小的,可扩展的日志工具)
1229 3
|
Java Maven
|
Java Unix 应用服务中间件