Log4j2

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使用教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,948评论 6 342
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,081评论 1 13
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,023评论 0 6
  • log4j是一个被广泛使用的Java日志记录框架,通过使用该框架,我们可以在自己的项目中根据自身需求灵活配置日志输...
    LilacZiyun阅读 5,964评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,914评论 18 139