Log4j2开发配置

1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是版本号):

    log4j-core-xx.jar

    log4j-api-xx.jar

2. 或者maven引入:

<dependencies>
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-api</artifactId>
 <version>2.4.1</version>
 </dependency>
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-core</artifactId>
 <version>2.4.1</version>
 </dependency>
</dependencies>

3. 在某个类中使用log4j记录日志,只需要申明下面的成员变量:

private static Logger logger = LogManager.getLogger(MyApp.class.getName());

    这里getLogger有一个参数指定的是这个logger的名称,这个名称在配置文件里面可是有需要的,这个待会儿再说。

声明了Logger对象,我们就可以在代码中使用他了。


4.配置文件
    log4j是apache的一个开源项目,首先需要注意的是,log4j 2.x与以往的1.x有一个明显的不同,其配置文件只能采用.xml, .json或者 .jsn。

<?xml version="1.0" encoding="UTF-8"?>  
<configuration status="OFF">  
  <appenders>  
    <Console name="Console" target="SYSTEM_OUT">  
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>  
    </Console>  
  </appenders>  
  <loggers>  
   <logger name="hellolog" level="error" additivity="false">  
      <appender-ref ref="Console"/>  
    </root>  
    <root level="error">  
      <appender-ref ref="Console"/>  
    </root>  
  </loggers>  
</configuration>  

首先介绍loggers标签,用于定义logger的lever和所采用的appender,其中appender-ref必须为先前定义的appenders的名称,例如,此处为Console。那么log就会以appender所定义的输出格式来输出log。

     root标签为log的默认输出形式,如果一个类的log没有在loggers中明确指定其输出lever与格式,那么就会采用root中定义的格式。需要注意的是 additivity选项,如果设置为true(默认值)则hellolog的log会被打印两次,第二次打印是由于hellolog同时也满足root里面定义的error。


5.其他配置

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

<configuration status="error">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--这个都知道是输出日志的格式-->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--建立一个默认的root的logger-->
        <root level="trace">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </root>

    </loggers>
</configuration>

这里定义了三个appender,Console,File,RollingFile,看意思基本也明白,第二个是写入文件,第三个是“循环”的日志文件,意思是日志文件大于阀值的时候,就开始写一个新的日志文件。


  这里我们的配置文件里面的注释算比较详细的了。所以就大家自己看了。有一个比较有意思的是ThresholdFilter ,一个过滤器,其实每个appender可以定义很多个filter,这个功能很有用。如果你要选择控制台只能输出ERROR以上的类别,你就用ThresholdFilter,把level设置成ERROR,onMatch="ACCEPT" onMismatch="DENY" 的意思是匹配就接受,否则直接拒绝,当然有其他选择了,比如交给其他的过滤器去处理了之类的,以后再慢慢琢磨。

Layout配置:

通常,用户不止希望能定义log输出的位置,还希望可以定义输出的格式。这就可以通过将Appender与一个layout相关联来实现。Log4j中定义了一种类似C语言printf函数的打印格式,如"%r [%t] %-5p %c - %m%n" 格式在真实环境下会打印类似如下的信息:


176 [main] INFO  org.foo.Bar - Located nearest gas station.


其中,各个字段的含义分别是:


%r 指的是程序运行至输出这句话所经过的时间(以毫秒为单位);


%t 指的是发起这一log request的线程;


%c 指的是log的level;


%m 指的是log request语句携带的message。


%n 为换行符。


6. 一个实用的配置文件:

  我们用日志一方面是为了记录程序运行的信息,在出错的时候排查之类的,有时候调试的时候也喜欢用日志。所以,日志如果记录的很乱的话,看起来也不方便。所以我可能有下面一些需求:
  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,内容如下:

<File name="ERROR" fileName="logs/error.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
 </File>

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

<appender-ref ref="ERROR" />

>然后,增加一个RollingFile的appender,设置基本上同上面的那个配置文件。

>最后,在logger中进行相应的配置。不过如果你的logger中也有日志级别的配置,如果级别都在error以上,你的appender里面也就不会输出error一下的信息了。

7.与spring mvc的整合

maven引入依赖包:

<dependency>
     <groupId>org.apache.logging.log4j</groupId>
     <artifactId>log4j-web</artifactId>
     <version>2.4.1</version>
</dependency>

web.xml配置:

<context-param>
	<param-name>isLog4jAutoInitializationDisabled</param-name>
	<param-value>true</param-value>
</context-param>

8.mybatis控制台输出日志
jog4j.xml中加入:

<logger name="log4j.logger.noModule" level="fatal" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.org.mybatis.jpetstore" level="trace" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.com.opensymphony.xwork2" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.com.ibatis" level="trace" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.com.ibatis.common.jdbc.SimpleDataSource" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.com.ibatis.common.jdbc.ScriptRunner" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.org.mybatis" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.java.sql" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.java.sql.Connection" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.java.sql.Statement" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.java.sql.PreparedStatement" level="debug" additivity="false">
      <appender-ref ref="Console"/>
    </logger>
    <logger name="log4j.logger.java.sql.ResultSet" level="debug" additivity="false">
      <appender-ref ref="Console"/>

光有这个配置是不行滴,因为mybatis加载日志组件是有顺序的,他会按

SLF4J

Apache Commons Logging

Log4j 2

Log4j

JDK logging

的顺序查找。所以,如果在web应用中用了spring之类的框架,他会包含commons-log包,根据优先级,他就不会去用log4j了,所以还得在mybatis配置文件中配置一条语句,如下:

<settings>
     <setting name="logImpl" value="LOG4J2"/>
</settings>

本文章参考文章: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值