log4j 2.5 使用教程详解(怎么使用log4j2)

前言
   log4j 1.x的版本你们都已经很熟悉了,由于项目须要咱们的项目由log4j 1.x的版本替换为log4j 2.x的版本;这一替换没关系,要改的内容却不少,log4j 2.5/2.0的详细用法以下,有问题欢迎留言探讨:

1. 开始使用:
  咱们知道,要在某个类中使用log4j记录日志,只须要申明下面的成员变量(其实不必定要是成员变量,只是为了方便调用而已)  
  log4j 2.5/2.0 申明变量与log4j 1.x的版本有些不一样,具体以下:
     private static Logger logger = LogManager.getLogger(MyApp.class.getName());
 这里getLogger有一个参数指定的是这个logger的名称,这个名称在配置文件里面但是有须要的,这个待会儿再说。声明了Logger对象,咱们就能够在代码中使用他了。

2. 日志的级别:
  咱们如今要调用logger的方法,不过在这个Logger对象中,有不少方法,因此要先了解log4j的日志级别,log4j规定了默认的几个级别:        trace<debug<info<warn<error<fatal等。这里要说明一下:
  1)级别之间是包含的关系,意思是若是你设置日志级别是trace,则大于等于这个级别的日志都会输出。
  2)基本上默认的级别没多大区别,就是一个默认的设定。你能够经过它的API本身定义级别。你也能够随意调用这些方法,不过你要在配置文件里面好好处理了,不然就起不到日志的做用了,并且也不易读,至关于一个规范,你要彻底定义一套也能够,不用没多大必要。

  3)这不一样的级别的含义你们都很容易理解,这里就简单介绍一下:
    trace: 是追踪,就是程序推动如下,你就能够写个trace输出,因此trace应该会特别多,不过不要紧,咱们能够设置最低日志级别不让他输出。
    debug: 调试么,我通常就只用这个做为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就行了么。
    info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。
    warn: 有些信息不是错误信息,可是也要给程序员的一些提示,相似于eclipse中代码的验证不是有error 和warn(不算错误可是也请注意,好比如下depressed的方法)。
    error: 错误信息。用的也比较多。
    fatal: 级别比较高了。重大错误,这种级别你能够直接中止程序了,是不该该出现的错误么!不用那么紧张,其实就是一个程度的问题。

3. 日志调用:
  这里随便写个类,调用就是这么简单,log4j的核心在配置文件上。
html

  1. import org.apache.logging.log4j.Level;
    程序员

  2. import org.apache.logging.log4j.LogManager;
    apache

  3. import org.apache.logging.log4j.Logger;
    json

  4. public class Hello {
    mybatis

  5.     static Logger logger = LogManager.getLogger(Hello.class.getName());
    app

  6.     public boolean hello() {
    框架

  7.         logger.entry();   //trace级别的信息,单独列出来是但愿你在某个方法或者程序逻辑开始的时候调用,和logger.trace("entry")基本一个意思
    eclipse

  8.         logger.error("Did it again!");   //error级别的信息,参数就是你输出的信息
    分布式

  9.         logger.info("我是info信息");    //info级别的信息
    ide

  10.         logger.debug("我是debug信息");

  11.         logger.warn("我是warn信息");

  12.         logger.fatal("我是fatal信息");

  13.         logger.log(Level.DEBUG, "我是debug信息");   //这个就是制定Level类型的调用:谁闲着没事调用这个,也不必定哦!

  14.         logger.exit();    //和entry()对应的结束方法,和logger.trace("exit");一个意思

  15.         return false;

  16.     }

  17. }  

复制代码

 若是没有自定义配置文件,上面这个类在写一个main方法,控制台会输入下面的样子:

  1. 19:09:40.256 [main] ERROR cn.lsw.base.log4j2.Hello - Did it again!

  2. 19:09:40.260 [main] FATAL cn.lsw.base.log4j2.Hello - 我是fatal信息

复制代码

看到没,只有>=ERROR的日志输出来了(这是由于Log4j有一个默认的配置,它的日志级别是ERROR,输出只有控制台)。若是我已经定义好了日志,我把日志级别改为了TRACE,输出会变成下面这样: 

  1. 19:11:36.941 TRACE cn.lsw.base.log4j2.Hello 12 hello - entry

  2. 19:11:36.951 ERROR cn.lsw.base.log4j2.Hello 13 hello - Did it again!

  3. 19:11:36.951 INFO  cn.lsw.base.log4j2.Hello 14 hello - 我是info信息

  4. 19:11:36.951 DEBUG cn.lsw.base.log4j2.Hello 15 hello - 我是debug信息

  5. 19:11:36.951 WARN  cn.lsw.base.log4j2.Hello 16 hello - 我是warn信息

  6. 19:11:36.952 FATAL cn.lsw.base.log4j2.Hello 17 hello - 我是fatal信息

  7. 19:11:36.952 DEBUG cn.lsw.base.log4j2.Hello 18 hello - 我是debug信息

  8. 19:11:36.952 TRACE cn.lsw.base.log4j2.Hello 19 hello - exit

复制代码

 全部的日志都打印出来了,你们能够对照上面的代码看一看。

4. 配置文件:
  log4j是apache的一个开源项目,在写这篇博客的时候已经发布了2.0的beta版本,首先须要注意的是,log4j 2.0与以往的1.x有一个明显的不一样,其配置文件只能采用.xml, .json或者 .jsn,新建配置文件 在 classpath(classpath为scr文件夹)下名为 log4j2.xml

 原本觉得Log4J 2应该有一个默认的配置文件的,不过好像没有找到,下面这个配置文件等同于缺省配置

  1. <?xml version="1.0" encoding="UTF-8"?>


  2. <configuration status="error">

  3.     <!--先定义全部的appender-->

  4.     <appenders>

  5.         <!--这个输出控制台的配置-->

  6.         <Console name="Console" target="SYSTEM_OUT">

  7.             <!--控制台只输出level及以上级别的信息(onMatch),其余的直接拒绝(onMismatch)-->

  8.             <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>

  9.             <!--这个都知道是输出日志的格式-->

  10.             <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

  11.         </Console>

  12.         <!--文件会打印出全部信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->

  13.         <File name="log" fileName="log/test.log" append="false">

  14.             <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

  15.         </File>


  16.         <!--这个会打印出全部的信息,每次大小超过size,则这size大小的日志会自动存入按份-月份创建的文件夹下面并进行压缩,做为存档-->

  17.         <RollingFile name="RollingFile" fileName="logs/app.log"

  18.                      filePattern="log/${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">

  19.             <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>

  20.             <SizeBasedTriggeringPolicy size="50MB"/>

  21.         </RollingFile>

  22.     </appenders>

  23.     <!--而后定义logger,只有定义了logger并引入的appender,appender才会生效-->

  24.     <loggers>

  25.         <!--创建一个默认的root的logger-->

  26.         <root level="trace">

  27.             <appender-ref ref="RollingFile"/>

  28.             <appender-ref ref="Console"/>

  29.         </root>


  30.     </loggers>

  31. </configuration>

复制代码

说复杂,其实也不复杂,这一个例子主要是为了讲一下appenders。
  这里定义了三个appender,Console,File,RollingFile,看意思基本也明白,第二个是写入文件,第三个是“循环”的日志文件,意思是日志文件大于阀值的时候,就开始写一个新的日志文件。

  这里咱们的配置文件里面的注释算比较详细的了。因此就你们本身看了。有一个比较有意思的是ThresholdFilter ,一个过滤器,其实每一个appender能够定义不少个filter,这个功能颇有用。若是你要选择控制台只能输出ERROR以上的类别,你就用ThresholdFilter,把level设置成ERROR,onMatch="ACCEPT" 的意思是匹配就接受,不然直接拒绝,固然有其余选择了,好比交给其余的过滤器去处理了之类的,详情你们本身去琢磨吧。

  为何要加一个这样的配置文件呢?其实这个配置文件我感受挺好的,他的实用性就在下面:
一个实用的配置文件:

  咱们用日志一方面是为了记录程序运行的信息,在出错的时候排查之类的,有时候调试的时候也喜欢用日志。因此,日志若是记录的很乱的话,看起来也不方便。因此我可能有下面一些需求:

  1)我正在调试某个类,因此,我不想让其余的类或者包的日志输出,不然会不少内容,因此,你能够修改上面root的级别为最高(或者谨慎起见就用ERROR),而后,加一个针对该类的logger配置,好比第一个配置文件中的设置,把他的level设置trace或者debug之类的,而后咱们给一个appender-ref是定义的File那个appender(共三个appender,还记得吗),这个appender的好处是有一个append为false的属性,这样,每次运行都会清空上次的日志,这样就不会由于一直在调试而增长这个文件的内容,查起来也方便,这个和输出到控制台就一个效果了。

  2)我已经基本上部署好程序了,而后我要长时间运行了。我须要记录下面几种日志,第一,控制台输出全部的error级别以上的信息。第二,我要有一个文件输出是全部的debug或者info以上的信息,相似作程序记录什么的。第三,我要单独为ERROR以上的信息输出到单独的文件,若是出了错,只查这个配置文件就行了,不会去处理太多的日志,看起来头都大了。怎么作呢,很简单。

  >首先,在appenders下面加一个Console类型的appender,经过加一个ThresholdFilter设置level为error。(直接在配置文件的Console这个appender中修改)

  >其次,增长一个File类型的appender(也能够是RollingFile或者其余文件输出类型),而后经过设置ThresholdFilter的level为error,设置成File好在,你的error日志应该不会那么多,不须要有多个error级别日志文件的存在,不然你的程序基本上能够重写了。
  这里能够添加一个appender,内容以下:

  1. <File name="ERROR" fileName="logs/error.log">

  2.             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

  3.             <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>

复制代码

并在loggers中的某个logger(如root)中引用(root节点加入这一行做为子节点)。 

  1. <appender-ref ref="ERROR" />

复制代码

  >而后,增长一个RollingFile的appender,设置基本上同上面的那个配置文件。
  >最后,在logger中进行相应的配置。不过若是你的logger中也有日志级别的配置,若是级别都在error以上,你的appender里面也就不会输出error一下的信息了。

  还记得上面的Test类里面有一个被注释掉的for循环么?这个是为了作配置文件中RollingFile那个appender的配置的,取消注释,运行商一次或几回,看你的输出配置文件的地方,他是怎么“RollingFile”的,这里给个我测试的截图:(这里你能够把 <SizeBasedTriggeringPolicy size="50MB"/>这里的size改为2MB,要生成50MB的日志仍是比较慢的。为了方便观察么!而后把Console的ThresholdFilter的level设置成error这样的较高级别,否则控制台输出东西太多了
来源:佳云网版权全部,转载请注明来源和连接!
连接: http://www.garyun.com/thread-581-1-1.html

【编辑推荐】

相关文章
相关标签/搜索