log4j.xml简单配置样例说明

一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述

二:老规矩,先来个栗子,然后再聊聊感受

(1)这里栗子有一点特别呀!给出了包名唉!想必有用,是的,配置文件中要特别说明一下的

package test.log4j.test8;

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

/**
 * Created by godtrue
 */
public class UseLog4j {
    //日志记录器
    private static Logger LOGGER = LogManager.getLogger(UseLog4j.class);
    //程序入口——主函数
    public static void main(String[]args) {
        //读取使用Java的特性文件编写的配置文件
        DOMConfigurator.configure( "D:\\workspace_test\\hello-log4j\\log4j.xml" );
        //输出日志信息,测试日志级别的作用(配置在配置文件中),仅仅输出大于等于目前有效级别的日志信息
        LOGGER.debug("[1]-my level is DEBUG 天");
        LOGGER.info("[2]-my level is INFO");
        LOGGER.warn("[3]-my level is WARN");
        LOGGER.error("[4]-my level is ERROR");
    }
}

(2)这段代码和(1)除了类名多了一个 _ ,并没有什么区别,那有什么用那?恩,有用的,一切为了测试,不信,你自己试试就更清楚了

package test.log4j.test8;

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

/**
 * Created by godtrue
 */
public class UseLog4j_ {
    //日志记录器
    private static Logger LOGGER = LogManager.getLogger(UseLog4j_.class);
    //程序入口——主函数
    public static void main(String[]args) {
        //读取使用Java的特性文件编写的配置文件
        DOMConfigurator.configure( "D:\\workspace_test\\hello-log4j\\log4j.xml" );
        //输出日志信息,测试日志级别的作用(配置在配置文件中),仅仅输出大于等于目前有效级别的日志信息
        LOGGER.debug("[1]-my level is DEBUG 天");
        LOGGER.info("[2]-my level is INFO");
        LOGGER.warn("[3]-my level is WARN");
        LOGGER.error("[4]-my level is ERROR");
    }
}

(3)如下的配置文件,仅列出了三种文件输出目的地的配置,他们相对比较常用,其中值得特别注意的是记录器的 name 和 additivity 这两个属性的作用,详情往下看注解,最好自己试试

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

<log4j:configuration>

    <!-- 将日志信息输出到控制台 -->
    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
        <!--过滤器设置输出的级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <!-- 设置日志输出的最小级别 -->
            <param name="levelMin" value="WARN" />
            <!-- 设置日志输出的最大级别 -->
            <param name="levelMax" value="ERROR" />
            <!-- 设置日志输出的xxx,默认是false -->
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>

    <!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
    <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
        <!-- 设置日志信息输出文件全路径名 -->
        <param name="File" value="D:/log4j/RollingFileAppender.log" />
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
        <param name="Append" value="true" />
        <!-- 设置保存备份回滚日志的最大个数 -->
        <param name="MaxBackupIndex" value="10" />
        <!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
        <param name="MaxFileSize" value="10KB" />
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
    </appender>

    <!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
    <appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <!-- 设置日志信息输出文件全路径名 -->
        <param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
        <!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
    </appender>


    <!--
     注意:
     1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
     2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
        2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
        2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则2-1的情况是一样的
        2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
     3:logger中定义的level和appender中的filter定义的level的区间取交集
     4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
     -->

    <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
    <logger name="test.log4j.test8.UseLog4j" additivity="false">
        <level value ="WARN"/>
        <appender-ref ref="DailyRollingFileAppender"/>
    </logger>

    <!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
    <logger name="test.log4j.test8.UseLog4j_" additivity="false">
        <level value ="ERROR"/>
        <appender-ref ref="RollingFileAppender"/>
    </logger>

    <!-- 根logger的设置-->
    <root>
        <level value ="INFO"/>
        <appender-ref ref="ConsoleAppender"/>
        <!--<appender-ref ref="DailyRollingFileAppender"/>-->
    </root>

</log4j:configuration

三:感受

      1)我们现在实际的项目使用的是log4j2,相应的配置方式和这里有所不同,抽时间我再好好玩一下

      2)如果整个log4j日志框架,按照比较平滑的学习曲线来学习的话,还是非常简单的,以前学习过,不过不做笔记就是学习一下,时间一长容易忘记各项配置都是干啥的,所以,在里再补上一笔,写博客的好处就体现出来了,等忘记了回头再看看,也许记忆就恢复了,谢谢博客园提供的游戏场所。——世界是个游乐场,我们都是上帝的孩子。

      3)编程这一行,我觉得应该重复的造轮子,特别是在学习某项技术的时候,网上关于log4j的博文也挺多的,刚开始我也找了一些来看,不过发现不好玩,不是自己的东西理解起来费劲不说,好多一实验还不灵,当然,有好多也是相当不错的,是经过试验的,不过不够详细。总之,好的要学习,而学习的最好途径还是自己多思考,多动手试验试验。

四:写这些博客我曾详细的看过一下资源(非常感谢,在此谢过!)

log4j官网

log4j教程

使用Log4j进行日志操作

最详细的Log4j使用教程

log4j百度百科

log4j维基百科

log4j详解与实战

log4j配置文件详解

log4j.properties配置详解与实例-全部测试通过

log4j.properties配置文件详解

log4j.xml配置文件详解

log4.xmlj配置文件详解

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Xml代码


<?xml version="1.0" encoding="UTF-8"?>     
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">     
        
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >     
        
    <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">     
        <layout class="org.apache.log4j.PatternLayout">     
            <param name="ConversionPattern"        
                value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />     
        </layout>     
        <!--过滤器设置输出的级别-->     
        <filter class="org.apache.log4j.varia.LevelRangeFilter">     
            <param name="levelMin" value="debug" />     
            <param name="levelMax" value="warn" />     
            <param name="AcceptOnMatch" value="true" />     
        </filter>     
    </appender>     
     
    <appender name="myFile" class="org.apache.log4j.RollingFileAppender">        
        <param name="File" value="D:/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>     
       
    <appender name="activexAppender" class="org.apache.log4j.DailyRollingFileAppender">     
        <param name="File" value="E:/activex.log" />       
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />       
        <layout class="org.apache.log4j.PatternLayout">     
         <param name="ConversionPattern"       
            value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />     
        </layout>       
    </appender>     
        
    <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->     
    <logger name="com.runway.bssp.activeXdemo" additivity="false">     
        <priority value ="info"/>       
        <appender-ref ref="activexAppender" />       
    </logger>     
     
    <!-- 根logger的设置-->     
    <root>     
        <priority value ="debug"/>     
        <appender-ref ref="myConsole"/>     
        <appender-ref ref="myFile"/>        
    </root>     
</log4j:configuration>

(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>
... ... ... ...

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1      简介
       一般log4j的xml配置方式基本步骤有3个,第一步:配置appender;第二步:配置logger;第三步:配置root。下面配置一个ConsoleAppender和两个DailyRollingFileAppender为例具体展开。

1.1  日志级别
       不考虑其他因素,日记级别FATAL>ERROR>WARN>INFO>DEBUG,这个是许多同学都清楚的,但是结合appender,logger,root的配置后,日志打印的结果会发生一些微妙的变化。

       首先,root的中的日志级别在用户没有为某一个具体的logger配置日志级别的时候才会对该logger生效。这里就可以用来解释有的同学问为什么在root中配置了ERROR级别,但是日志中依旧有INFO的日志输出。

       其次,如果某一个appender配置了日志过滤器,那使用该appender的logger配置日志级别的时候,范围不超出appender过滤的级别信息才会被输出。

2      配置appender
       图2-1是一个标准的ConsoleAppender配置:

                                                                  图 2‑1

       如注释所描述,ConsoleAppender一般在我们调试项目时候用处比较大,这里不再多余描述。

       图2-2是一个标准的FileAppender配置,这里我配置了一个info.log文件和一个eror.log,位于/opt/logs目录下面,分别用来记录一般消息和错误消息。

                                    

图 2‑2

         appender的配置相对比较简单,除了过滤器,没有特殊要注意的。

3   配置logger
       图3-1是两种looger配置。

图 3‑1

         logger的name属性指代的是程序包路径,不用赘述。additivity属性,表示是否遵循缺省的继承机制。

         需要注意:

         1如果我们配置了true,那我们最好不要再给该logger配置appender-ref属性,除非被配置的appender-ref我们没有继续添加在root的appender-ref中,否则我们会发现日志重复。

         2如果我们配置了false,那就必须为该logger配置appender-ref,否则日志不会被打印。

4   配置root
       图4-1是一个标准的root配置。

图 4‑1

         

root的作用是是收集所有配置的logger(additivity=true)反馈上来的信息流并且根据root中配置的appender-ref进行输出,所以,如果我们logger配置了additivity=true,又配置了appender-ref,会导致日志重复。

         注意:这里的level值对那些没有配置日志级别,而且additivity=true的logger才会有作用。

下面是具体的配置信息:

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

   <!--对于ConsoleAppender来说,在开发阶段还是比较有用的,能直接在ide中看到输出的日志内容,
   但是在实际的产品阶段,我们更希望将日志输出到指定的文件上查看,这就需要用到FileAppender-->
   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <param name="encoding" value="UTF-8" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
      </layout>
      <!--如果有过滤器,当前appender只会处理满足过滤器条件的日志信息-->
      <!--<filter class="org.apache.log4j.varia.LevelRangeFilter">
         <param name="levelMin" value="DEBUG" />
         <param name="levelMax" value="FATAL" />
         <param name="AcceptOnMatch" value="true" />
      </filter>-->
   </appender>

   <!-- 写到远端日志 -->
   <appender name="DEFAULT-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
      <param name="SyslogHost" value="${logServer}"/> 
       <param name="Facility" value="LOCAL1"/>
          <param name="FacilityPrinting" value="true"/>
       <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" value="%d %-5p %t %c %m%n" />
       </layout> 
   </appender>
   
   <appender name="FRAMEWORK-APPENDER-REMOTE" class="org.apache.log4j.net.SyslogAppender">
      <param name="SyslogHost" value="${logServer}"/> 
       <param name="Facility" value="LOCAL3"/>
          <param name="FacilityPrinting" value="true"/>
       <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" value="%d %-5p %t %c %m%n" />
       </layout> 
   </appender>
   <!-- 写到本地日志 -->
   <!--第一步:配置appender-->
   <appender name="INFO-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
      <param name="file" value="/opt/logs/info.log" />
      <param name="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
      <param name="encoding" value="UTF-8" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
      </layout>
      <!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
      <filter class="org.apache.log4j.varia.LevelRangeFilter">
         <param name="levelMin" value="DEBUG" />
         <param name="levelMax" value="INFO" />
         <param name="AcceptOnMatch" value="true" />
      </filter>
   </appender>
   <appender name="ERROR-LOCAL" class="org.apache.log4j.DailyRollingFileAppender">
      <param name="file" value="/opt/logs/error.log" />
      <param name="append" value="true" /><!--一般必须配置true,否则会覆盖而不是累加-->
      <param name="encoding" value="UTF-8" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %t %l %m%n" />
      </layout>
      <!--如果有过滤器,日志文件中就只会有符合过滤器的日志信息-->
      <filter class="org.apache.log4j.varia.LevelRangeFilter">
         <param name="levelMin" value="WARN" />
         <param name="levelMax" value="FATAL" />
         <param name="AcceptOnMatch" value="true" />
      </filter>
   </appender>

   <!--第二步:配置logger。
   如果不配置,系统会采用默认策略,即additivity="true",level value="DEBUG"。
   注意:additivity=true,表示遵循缺省的继承机制,此时就不应该继续配置appender-ref,否则日志会出现重复
   相反,如果additivity=false,就必须要配置appender-ref,否则日志不会被打印,配置也就没有意义-->
   <logger name="com.test.log4j" additivity="true">
      <!--给具体的logger配置日志级别,比如com.test包下面日志级别大于等于DEBUG的,
      才会交给appender进行处理。
      注意:对于com.test包而言,此处的级别会覆盖root下面的日志级别-->
      <level value="INFO" />
      <!--如果此处配置了append-ref,而且additivity="true",将会和root里面的同一个
      append-ref形成累加,即重复日志-->
      <!--<appender-ref ref="CONSOLE" />-->
      <!--<appender-ref ref="DEFAULT-LOCAL"/>-->
      <!--<appender-ref ref="ERROR-LOCAL"/>-->
   </logger>
   <logger name="com.test2" additivity="false">
      <level value="INFO" />
      <appender-ref ref="INFO-LOCAL" />
   </logger>

   <!--第三步:配置root-->
   <!--root的作用是收集所有配置的logger反馈上来的信息流并根据配置在root中appender进行输出,
   只要你在looger中配置了additivity="false",就不会反馈到root中。-->
   <root>
      <!--优先级小于具体的logger中配置的级别,只有当具体的logger没有配置的时候,
      这里才会对具体的looger起作用-->
      <level value="DEBUG" />
      <appender-ref ref="CONSOLE" />
      <appender-ref ref="INFO-LOCAL" />
      <appender-ref ref="ERROR-LOCAL"/>
   </root>
</log4j:configuration>  
--------------------- 
原文:https://blog.csdn.net/jingyuwang1/article/details/49430233 

猜你喜欢

转载自blog.csdn.net/bieleyang/article/details/83178632