浅谈log4j

 Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明:


    1、 Loggers


        Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高,则可以启动,否则屏蔽掉。


    Java程序举例来说:


    //建立Logger的一个实例,命名为“com.foo”


    Logger  logger = Logger.getLogger("com.foo");


    //设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。


    logger.setLevel(Level.INFO);


    Logger barlogger = Logger.getLogger("com.foo.Bar");


    //下面这个请求可用,因为WARN >= INFO


    logger.warn("Low fuel level.");


    //下面这个请求不可用,因为DEBUG < INFO


    logger.debug("Starting search for nearest gas station.");


    //命名为“com.foo.bar”的实例barlogger会继承实例“com.foo”的级别。因此,下面这个请求可用,因为INFO >= INFO


    barlogger.info("Located nearest gas station.");


    //下面这个请求不可用,因为DEBUG < INFO


    barlogger.debug("Exiting gas station search");


    这里“是否可用”的意思是能否输出Logger信息。


        在对Logger实例进行命名时,没有限制,可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例,这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息,便于管理。比如:


    static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());


    2、 Appenders


        禁用与使用日志请求只是Log4j其中的一个小小的地方,Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。


    其语法表示为:


    org.apache.log4j.ConsoleAppender(控制台),




    org.apache.log4j.FileAppender(文件),
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)


    配置时使用方式为:


    log4j.appender.appenderName = fully.qualified.name.of.appender.class


    log4j.appender.appenderName.option1 = value1


    …


    log4j.appender.appenderName.option = valueN


    这样就为日志的输出提供了相当大的便利。


    3、 Layouts


        有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。


    其语法表示为:


    org.apache.log4j.HTMLLayout(以HTML表格形式布局),
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)


    配置时使用方式为:


         log4j.appender.appenderName.layout =       fully.qualified.name.of.layout.class
         log4j.appender.appenderName.layout.option1 = value1
         …
         log4j.appender.appenderName.layout.option = valueN


        以上是从原理方面说明Log4j的使用方法,在具体Java编程使用Log4j可以参照以下示例:
    1、 建立Logger实例:
        语法表示:public static Logger getLogger( String name)
        实际使用:static Logger logger = Logger.getLogger   (ServerWithLog4j.class.getName ()) ;
    2、 读取配置文件:
        获得了Logger的实例之后,接下来将配置Log4j使用环境:
        语法表示:
        BasicConfigurator.configure():自动快速地使用缺省Log4j环境。
        PropertyConfigurator.configure(String configFilename):读取使用Java的特性文件编写的配置文件。
        DOMConfigurator.configure(String filename):读取XML形式的配置文件。
        实际使用:PropertyConfigurator.configure("ServerWithLog4j.properties");
    3、 插入日志信息
        完成了以上连个步骤以后,下面就可以按日志的不同级别插入到你要记录日志的任何地方了。
        语法表示:
        Logger.debug(Object message);
        Logger.info(Object message);
        Logger.warn(Object message);
        Logger.error(Object message);
        实际使用:logger.info("ServerSocket before accept: " + server);


        在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用,具体如下:
    1、 配置根Logger,其语法为:
        log4j.rootLogger = [ level ] , appenderName, appenderName, …
    这里level指Logger的优先级,appenderName是日志信息的输出地,可以同时指定多个输出地。如:log4j.rootLogger= INFO,A1,A2
    2、 配置日志信息输出目的地,其语法为:
        log4j.appender.appenderName = fully.qualified.name.of.appender.class
        可以指定上面所述五个目的地中的一个。
    3、 配置日志信息的格式,其语法为:
        log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
        这里上面三个步骤是对前面Log4j组件说明的一个简化;下面给出一个具体配置例子,在程序中可以参照执行:
        log4j.rootLogger=INFO,A1
        log4j.appender.A1=org.apache.log4j.ConsoleAppender
        log4j.appender.A1.layout=org.apache.log4j.PatternLayout
        log4j.appender.A1.layout.ConversionPattern=
                                            %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
        这里需要说明的就是日志信息格式中几个符号所代表的含义:
        -X号: X信息输出时左对齐;
        %p: 日志信息级别
        %d{}: 日志信息产生时间
        %c: 日志信息所在地(类名)
        %m: 产生的日志具体信息
        %n: 输出日志信息换行


    根据上面的日志格式,某一个程序的输出结果如下:
    0    INFO  2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]
    16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'
    16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD
    16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'
    16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP
    16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'

    16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT


常用log4j配置,一般可以采用两种方式,.properties和.xml,下面举两个简单的例子:

一、log4j.properties

### 设置org.zblog域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1,A2 ##
log4j.category.org.zblog=ERROR,A1
log4j.category.org.zblog=INFO,A2

log4j.appender.A1=org.apache.log4j.ConsoleAppender
### 设置输出地A1,为ConsoleAppender(控制台) ##
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
### 设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式)##
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
### 配置日志输出的格式##

log4j.appender.A2=org.apache.log4j.RollingFileAppender
### 设置输出地A2到文件(文件大小到达指定尺寸的时候产生一个新的文件)##
log4j.appender.A2.File=E:/study/log4j/zhuwei.html
### 文件位置##
log4j.appender.A2.MaxFileSize=500KB
### 文件大小##
log4j.appender.A2.MaxBackupIndex=1
log4j.appender.A2.layout=org.apache.log4j.HTMLLayout
##指定采用html方式输出

二、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="org.zblog.all" class="org.apache.log4j.RollingFileAppender">
<!-- 设置通道ID:org.zblog.all和输出方式:org.apache.log4j.RollingFileAppender -->
   <param name="File" value="E:/study/log4j/all.output.log" /><!-- 设置File参数:日志输出文件名 -->
   <param name="Append" value="false" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
   <param name="MaxBackupIndex" value="10" />
   <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 设置输出文件项目和格式 -->
   </layout>
</appender>

<appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender">
   <param name="File" value="E:/study/log4j/zhuwei.output.log" />
   <param name="Append" value="true" />
   <param name="MaxFileSize" value="10240" /> <!-- 设置文件大小 -->
   <param name="MaxBackupIndex" value="10" />
   <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
   </layout>
</appender>

<logger name="zcw.log"> <!-- 设置域名限制,即zcw.log域及以下的日志均输出到下面对应的通道中 -->
   <level value="debug" /><!-- 设置级别 -->
   <appender-ref ref="org.zblog.zcw" /><!-- 与前面的通道id相对应 -->
</logger>

<root> <!-- 设置接收所有输出的通道 -->
   <appender-ref ref="org.zblog.all" /><!-- 与前面的通道id相对应 -->
</root>

</log4j:configuration>


三、配置文件加载方法:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

public class Log4jApp {
   public static void main(String[] args) {
       DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加载.xml文件
       //PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加载.properties文件

       Logger log=Logger.getLogger("org.zblog.test");
       log.info("测试");
   }
}

四、项目使用log4j
在web应用中,可以将配置文件的加载放在一个单独的servlet中,并在web.xml中配置该servlet在应用启动时候加载。对于在多人项目中,可以给每一个人设置一个输出通道,这样在每个人在构建Logger时,用自己的域名称,让调试信息输出到自己的log文件中。


五、常用输出格式

# -X号:X信息输出时左对齐;
# %p:日志信息级别
# %d{}:日志信息产生时间
# %c:日志信息所在地(类名)
# %m:产生的日志具体信息
# %n:输出日志信息换行

  1. <!-- 类似定义logger节点打印具体类,或某包中的指定级别以上日志 -->  
  2.     <logger name="common.TestLog4j">  
  3.         <level value="debug" />  
  4.         [color=red]<appender-ref ref="console" />[/color]  
  5.     </logger>  
  6.           
  7.          <!-- 和logger节点功能差不多,打印具体类,或某包中的指定级别以上日志  
  8.         <category name="common.TestLog4j">  
  9.              <priority value="warn"/>  
  10.         </category>  
  11.          -->  
  12.   
  13.   
  14.     <appender name="console" class="org.apache.log4j.ConsoleAppender">  
  15.         <!--param name="Threshold" value="INFO"  为打印logger 去掉Threshold参数配置 /-->  
  16.         <layout class="org.apache.log4j.PatternLayout">  
  17.             <param name="ConversionPattern"  
  18.                 value="【AppLog】 %d{ABSOLUTE} %-5p %m%n" />  
  19.         </layout>  
  20.     </appender>  
  21.   
  22.     <appender name="file"  
  23.         class="org.apache.log4j.DailyRollingFileAppender">  
  24.         <param name="File" value="log.txt" />  
  25.         <!--日志过滤门槛,记录warn以上级别日志  -->  
  26.         <param name="Threshold" value="WARN" />  
  27.         <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  
  28.         <layout class="org.apache.log4j.PatternLayout">  
  29.             <param name="ConversionPattern" value="%d %-5p %m %n" />  
  30.         </layout>  
  31.     </appender>  
  32.               
  33.     <root>  
  34.         <!-- root 整体设置过滤优先级,如果appender 没有设置filter或Threshold 默认采用该级别,定义的logger不在其中(即不会被过滤掉)。 -->  
  35.         <priority value="INFO" />  
  36.         <appender-ref ref="console" />  
  37.         <appender-ref ref="file" />  
  38.     </root>  

  <!--输出方式:输出到控制台-->  
    <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
    <!-- 
     设置通道名称和输出方式,其中输出方式appender有5种,分别为
      org.apache.log4j.RollingFileAppender    
     org.apache.log4j.ConsoleAppender (控制台)
     org.apache.log4j.FileAppender (文件)   
     org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)   
     org.apache.log4j.WriterAppender (将日志信息以流格式发送到指定地方)
     -->  
    <param name="Target" value="System.out"/>  
    <param name="Threshold" value="INFO"/>  
    <!--
      Threshold是个全局的过滤器,他将把低于所设置的level的信息过滤不显示出来
     -->  

    <!-- 设置日志输出的格式-->  
    <layout class="org.apache.log4j.PatternLayout">  
    
    <!-- 
      参数都以%开始后面不同的参数代表不同的格式化信息:   
       %c  输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的范围
       如:"org.apache.elathen.ClassName",%C{2}将输出elathen.ClassName    
     
      %d  输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}   

      %l  输出日志事件发生位置,包括类目名、发生线程,在代码中的行数  
 
       %n  换行符   
       
       %m  输出代码指定信息,如info(“message”),输出message   
        
      %p  输出优先级,即 FATAL ,ERROR 等   
         
       %r  输出从启动到显示该log信息所耗费的毫秒数   
        
       %t  输出产生该日志事件的线程名-->  

      <!-- The default pattern: Date Priority [Category] Message\n -->
      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>  
    </layout>  
  </appender>  

  <!--输出方式是:每天一个日志文件-->  
  <!--设置通道名称是:file,输出方式DailyRollingFileAppender-->
  <appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender">  

    <!--日志文件路径和文件名称 -->  
    <!-- 加../在logs,加/在C盘,不加在bin目录 -->
    <!-- 
      如果在加载时设置了变量System.setProperty("WebApp", appRoot),
       可在此取出来${WebApp} -->
    <param name="File" value="../logs/mylog.log"/>  
    
    <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->  
    <param name="Append" value="true"/>  
  
    <!-- Rollover at midnight each day -->  
    <!-- e.g. mylog.log.2009-11-25.log -->
    <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/>  

    <!-- Rollover at the top of each hour   
    <param name="DatePattern" value="'.'yyyy-MM-dd-HH'.log'"/>  
    -->  

    <layout class="org.apache.log4j.PatternLayout">  

      <!-- 
        The default pattern: Date Priority [Category] Message\n 
      -->  
      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
  
      <!-- 
        The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n -->
      <!--   
      <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>  
       -->  
    </layout>       
  </appender>  
       
  <appender name="ERROR_LOG" class="org.apache.log4j.DailyRollingFileAppender">  
      <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>  
      <param name="File" value="error.log"/>  
      <param name="Append" value="true"/>  
      <!-- 指定日志输出级别 -->
      <param name="Threshold" value="INFO"/>  
      <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/>  
      <layout class="org.apache.log4j.PatternLayout">  
      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  
      </layout>  
   </appender>       
     

    <!--
        level:是日记记录的优先级,优先级由高到低分为    
          OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。   
          Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这四个级别。
     -->  

    <!-- 指定logger的设置,additivity指示是否叠加输出log,如果是false,
      在DsErrorLog logger中日志不会被其它logger满足条件的logger(比如root)   
     输出   
    -->    
    <!-- 将名称为DSErrorLog的logger,输出到“EEROR_LOG”的appender   
         所谓logger的名字也就是,在定义Logger时,构造函数的参数   
          Logger log = Logger.getLogger("DSErrorLog");   
    -->  
    <logger name="DSErrorLog" additivity="false">  
        <level class="org.apache.log4j.Level" value="DEBUG"/>  
        <appender-ref ref="ERROR_LOG"/>  
    </logger>  
           
   <!--
      输出指定类包中的日志,比如想输出   
       Hibernate运行中生成的SQL语句,可作如下设置   
    -->  
   <category name="org.hibernate.SQL">  
     <priority value="DEBUG"/>  
      <!--   
          如果指定一个appender,这些log将被输出到指定的appender   
          如:<appender-ref ref="myFile"/>     
          否则将作用于所有的appender   
       -->  
   </category>  
               
     <!-- 
       根默认会自动构建一个 root,输出INFO级别的日志到控制台,供logger继承
      -->       
     <root>       
         <priority value ="INFO"/>       
         <appender-ref ref="myConsole"/>       
         <appender-ref ref="myFile"/>          
    </root>          
</log4j:configuration>  







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值