log4j2 使用介绍

Apache Log4j2是对Log4j的升级版,参考了Logback的一些优秀设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:

  • 异常处理,在Logback中,Appender中的异常不会被应用感知,但是在Log4j2中,提供了一些异常处理机制。
  • 性能提升,Log4j2相较于Log4j和Logback都具有很明显的性能提升。
  • 自动重载配置,参考了Logback的设计,当然会提供自动刷新参数的配置,最实用的就是我们在生产上可以动态的修改日志的级别,而不需要重启应用。
  • 无垃圾机制,Log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。

配置文件的名称以及在项目中的存放位置:
log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为.xml,.json 或者.jsn。系统选择配置文件的优先级(从先到后)如下:

  • classpath 下的名为log4j2-test.json或者log4j2-test.jsn的文件.
  • classpath 下的名为log4j2-test.xml的文件.
  • classpath 下名为log4j2.json或者log4j2.jsn的文件.
  • classpath 下名为log4j2.xml的文件.

我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。

log4j2 日志级别:

  • All:最低等级的,用于打开所有日志记录.
  • Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
  • Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
  • Info:消息在粗粒度级别上突出强调应用程序的运行过程.
  • Warn:输出警告及warn以下级别的日志.
  • Error:输出错误信息日志.
  • Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
  • OFF:最高等级的,用于关闭所有日志记录.

pattern参数:

%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行

其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数

需要的Maven依赖:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifact
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log
    <artifactId>log4j-core</artifac
    <version>2.13.3</version>
</dependency>
<!--slf4j+log4j2-->
<dependency>
    <groupId>org.apache.logging.log
    <artifactId>log4j-slf4j-impl</a
    <version>2.13.3</version>
</dependency>
<!--log4j2 异步日志依赖-->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifact
    <version>3.4.2</version>
</dependency>

log4j2.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!--
status          log4j2自身内部的日志级别
monitorInterval Log4j自动检测间隔秒数
-->
<configuration status="WARN" monitorInterval="30">

    <properties>
        <!--日志目录-->
        <Property name="LOG_HOME">logs2</Property>
    </properties>
    
    <appenders>

        <!--控制台输出-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>

        <!--简单的日志文件-->
        <File name="log" fileName="${LOG_HOME}/test.log" append="false">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- 日志输出到文件 并指定拆分规则-->
        <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">

            <!--过滤器 只统计info级别-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--日志信息 格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <!--指定规则-->
            <Policies>
                <!--按照时间拆分 规则如上filePattern-->
                <TimeBasedTriggeringPolicy/>
                <!--指定日志文件尺寸-->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!--指定保留文件的个数 默认同一目录下7个-->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
        </root>
    </loggers>
</configuration>
posted @ 2020-08-31 21:29  宁川  阅读(495)  评论(0)    收藏  举报