Log4j2

2016-11-12  本文已影响590人  yang2yang

Log4j2

log4j2的好处看了以下主要体现在这么几点,提升底层运行效率,异步输出之类的,配置文件支持json等相关优化,对API进行了优化,但是API对外表现的好像看不太出来。

日志级别

log4j2的日志级别有很多,但是一般使用error,info,debug最多在加上一个warn(一般也没有使用到,另外trace是最低级别)。

依赖

log4j2需要导入两个jar包,分别为

log4j-core-xx.jar
log4j-api-xx.jar

如果使用maven导入相关jar,可以参考下面的pom文件。
pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.qingtianr</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--<dependency>-->
        <!--<groupId>log4j</groupId>-->
        <!--<artifactId>log4j</artifactId>-->
        <!--<version>1.2.14</version>-->
        <!--</dependency>-->

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

    </dependencies>

</project>

Example

log4j2Test.java

package cn.qingtianr;

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


public class log4j2Test {
    //使用LogManager来获得Logger(和log4j不一样了)
    private static Logger logger = LogManager.getLogger(log4j2Test.class);

    public static void main(String[] args) {

        logger.error("我是error信息");
        logger.warn("我是warn信息");
        logger.info("我是info信息");
        logger.debug("我是debug信息");


    }
}

配置文件

在classpath目录下面需要有一个配置文件。

在默认情况下,系统选择configuration文件的优先级如下:(classpath为scr文件夹)

  1. classpath下名为 log4j-test.json 或者log4j-test.jsn文件
  2. classpath下名为 log4j2-test.xml
  3. classpath下名为 log4j.json 或者log4j.jsn文件
  4. classpath下名为 log4j2.xml

如果是用maven管理的话,那么可以直接放在resouces里面就可以了。其实可以发现log4j2是不在支持properties,但是都是支持xml来配置的。

下面这个可以认为是没有配置文件时的时候的默认配置。

<?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>  
    <root level="error">  
      <appender-ref ref="Console"/>  
    </root>  
  </loggers>  
</configuration>

所以在默认的配置下面可以在控制台中看到以下输出信息。因为默认是error级别的信息,所以只会有error级别的信息。

14:35:54.002 [main] ERROR cn.qingtianr.log4j2Test - 我是error信息

如果把<root level="error">中的error改为info,那么将会输出以下日志信息。也就是说会输出所有info级别及以上级别的日志信息。

14:38:01.086 [main] ERROR cn.qingtianr.log4j2Test - 我是error信息
14:38:01.088 [main] WARN  cn.qingtianr.log4j2Test - 我是warn信息
14:38:01.088 [main] INFO  cn.qingtianr.log4j2Test - 我是info信息

Appenders

<?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="true">
            <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="info">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </root>

    </loggers>
</configuration>

把这个配置文件和之前简单的配置文件进行比较可以知道appender的使用方式,主要的appender有下面几种。

Layout

可以将传入的日志信息已一定格式进行输出,有HTML格式的,CVS格式的等,最主要使用的应该就是PatternLayout,有点类似于格式化输出的情况。

例子项目截图

Log4j2例子目录结构

其中有自己log4j的东西,省略.....

Other

具体的配置文件中的东西,可以参考官方文档。

一些其他问题

参考

log4j2的API
log4j2的提升点
Log4j的isdebugEnabled的作用
Log4j 2使用教程

上一篇 下一篇

猜你喜欢

热点阅读