Log4j2

作者: yang2yang | 来源:发表于2016-11-12 22:53 被阅读590次

    Log4j2

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

    日志级别

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

    • error:记录错误级别的日志信息,有异常发生之类的。
    • warn:记录警告级别的信息。
    • info:记录常用的日志信息,一般记录一些开始,结束和相关的关键字段。
    • debug:记录debug级别的调试信息。

    依赖

    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有下面几种。

    • ConsoleAppender:用来输出到控制台
    • FileAppender:用来输出到文件中
    • RollingFileAppender:用来将到一定大小的文件按时间进行存档

    Layout

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

    例子项目截图

    Log4j2例子目录结构

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

    Other

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

    一些其他问题

    • Log4j(或者Log4j2)和Spring是如何关联起来的,可以弄个详细的东西来简单描述一下。Spring的core包使用的日志工具会自动找寻classpath下面的jar包,如果发现有Log4j或者Log4j2的jar包,会直接导入进去的。
    • 但是如果没有使用Spring的话,是需要手动在web.xml中使用一个监听器来将Log4j(或者Log4j2)的配置文件给读入进去的。
    • 利用Log4j是可以将Mybatis里面最终执行的数据库的sql语句给纪录下来的,所以下次可以做一个简单的demo出来。

    参考

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

    相关文章

      网友评论

          本文标题:Log4j2

          本文链接:https://www.haomeiwen.com/subject/fkvfuttx.html