java日志文件(log4j)使用

来源:互联网 发布:c语言跑马灯程序 编辑:程序博客网 时间:2024/06/04 17:58

Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局)。
log4j的配置文件也可以是多种格式的,但主要是xml文件和properties文件

 

一、properties文件

1.配置根logger:
语法:log4j.rootLogger =[level],appenderName1,appenderName2,...
level :OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL的其中一个。
appenderName:日志输入的目的地,可以有多个地方
根logger是一定存在的,根logger指定了默认的日志配置。
2.配置日志输入的目的地(appender)
语法:log4j.appender.appenderName = fully.qualified.name.of.appender.class
    fully.qualified.name.of.appender.class 可以是以下的几种:
    (1).org.apache.log4j.ConsoleAppender(控制台)
    (2).org.apache.log4j.FileAppender(文件)
    (3).org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    (4).org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    (5).org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
其中每一个又有不同的配置选项:
(1).org.apache.log4j.ConsoleAppender(控制台)的选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).org.apache.log4j.FileAppender的选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).org.apache.log4j.DailyRollingFileAppender的选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
    1)'.'yyyy-MM: 每月
    2)'.'yyyy-ww: 每周
    3)'.'yyyy-MM-dd: 每天
    4)'.'yyyy-MM-dd-a: 每天两次
    5)'.'yyyy-MM-dd-HH: 每小时
    6)'.'yyyy-MM-dd-HH-mm: 每分钟
(4).org.apache.log4j.RollingFileAppender
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

3.配置日志输入的格式
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
这里需要说明的就是日志信息格式中几个符号所代表的含义:
-: 信息输出时左对齐;
   %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
   %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
   %r: 输出自应用启动到输出该log信息耗费的毫秒数
   %c: 输出日志信息所属的类目,通常就是所在类的全名
   %t: 输出产生该日志事件的线程名
   %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
   %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
   %%: 输出一个"%"字符
   %F: 输出日志消息产生时所在的文件名称
   %L: 输出代码中的行号
   %m: 输出代码中指定的消息,产生的日志具体信息
   %n: 输出一个回车换行符,Windows平台为"rn",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字符,就从左边交远销出的字符截掉。

 

二、xml文件

(1). 输出方式appender一般有5种:

             org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
             org.apache.log4j.ConsoleAppender (控制台) 
             org.apache.log4j.FileAppender (文件)
             org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
             org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)

(2). 日记记录的优先级priority,优先级由高到低分为
            OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
            Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。

(3). 格式说明layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):
                %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        输出产生该日志事件的线程名

 

xml declaration and DTD

xml配置文件的头部包括两个部分:xml声明和DTD声明。头部的格式如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">          

log4j:configuration (root element)

  • xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间,取定值"http://jakarta.apache.org/log4j/"
  • appender [* child] : 一个appender子元素定义一个日志输出目的地
  • logger [* child] : 一个logger子元素定义一个日志写出器
  • root [? child] : root子元素定义了root logger

appender

appender元素定义一个日志输出目的地。

  • name [#REQUIRED attribute] : 定义appender的名字,以便被后文引用
  • class [#REQUIRED attribute] : 定义appender对象所属的类的全名
  • param [* child] : 创建appender对象时传递给类构造方法的参数
  • layout [? child] : 该appender使用的layout对象

layout

layout元素定义与某一个appender相联系的日志格式化器。

  • class [#REQUIRED attribute] : 定义layout对象所属的类的全名
  • param [* child] : 创建layout对象时传递给类构造方法的参数

logger

logger元素定义一个日志输出器。

  • name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
  • additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
  • level [? child] : 定义该logger的日志级别
  • appender-ref [* child] : 定义该logger的输出目的地

root

root元素定义根日志输出器root logger。

  • param [* child] : 创建root logger对象时传递给类构造方法的参数
  • level [? child] : 定义root logger的日志级别
  • appender-ref [* child] : 定义root logger的输出目的地

level

level元素定义logger对象的日志级别。

  • class [#IMPLIED attribute] : 定义level对象所属的类,默认情况下是"org.apache.log4j.Level类
  • value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出
  • param [* child] : 创建level对象时传递给类构造方法的参数

appender-ref

appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender。

  • ref [#REQUIRED attribute] : 一个appender元素的名字的引用
  • appender-ref元素没有子元素

param

param元素在创建对象时为类的构造方法提供参数。它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。

  • name and value [#REQUIRED attributes] : 提供参数的一组名值对
  • param元素没有子元素

在xml文件中配置appender和layout

创建不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以使用param子元素来设定不同的参数值。

创建ConsoleAppender对象

ConsoleAppender的构造方法不接受其它的参数。

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

创建FileAppender对象

可以为FileAppender类的构造方法传递两个参数:File表示日志文件名;Append表示如文件已存在,是否把日志追加到文件尾部,可能取值为"true"和"false"(默认)。

... ... ... ...<appender name="file.log" class="org.apache.log4j.FileAppender">  <param name="File" value="/tmp/log.txt" />  <param name="Append" value="false" />  <layout ... >    ... ...  </layout></appender>... ... ... ...          

创建RollingFileAppender对象

除了File和Append以外,还可以为RollingFileAppender类的构造方法传递两个参数:MaxBackupIndex备份日志文件的个数(默认是1个);MaxFileSize表示日志文件允许的最大字节数(默认是10M)。

... ... ... ...<appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender">  <param name="File" value="/tmp/rollingLog.txt" />  <param name="Append" value="false" />  <param name="MaxBackupIndex" value="2" />  <param name="MaxFileSize" value="1024" />  <layout ... >    ... ...  </layout></appender>... ... ... ...          

创建PatternLayout对象

可以为PatternLayout类的构造方法传递参数ConversionPattern。

... ... ... ...<layout class="org.apache.log4j.PatternLayout>  <param name="Conversion" value="%d [%t] %p - %m%n" /></layout>... ... ... ...

 

 

 

模板

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> 


    <!--输出方式:输出到控制台--> 
    <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> 

 

 


 

原创粉丝点击