Skip to content
log4j2-spring-test.xml 文件放在 classpath: 下面即
resources目录下,会自动被读取到
在 applications.properties 或者 application.yml 中指定 具体的配置文件名

格式占位符说明

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

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

关于日志level

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

关于异步日志:

    有两种模式:
        a>全部日志异步配置 参考:https://www.jianshu.com/p/9f0c67facbe2
            1>可以在运行jar 时指定参数
                -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -DAsyncLogger.WaitStrategy=busyspin
            2>在系统启动时 设置系统属性
                System.setProperty("log4j2.contextSelector","org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
                要在SpringApplication.run(ApplicationProvider.class);运行之前
            Making All Loggers Asynchronous
            Log4j-2.9 and higher require disruptor-3.3.4.jar or higher on the classpath.
            Prior to Log4j-2.9, disruptor-3.0.0.jar or higher was required.
            This is simplest to configure and gives the best performance.
            To make all loggers asynchronous, add the disruptor jar to the classpath
            and set the system property log4j2.contextSelector to org.apache.logging.log4j.core.async.AsyncLoggerContextSelector.


        b>同步与异步混合模式,不需要设置系统的属性
            1>  <asyncRoot> or <asyncLogger>

            <loggers>
                includeLocation = true 会降低性能,主要是
                <AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">
                    //包含需要异步的logger,没有包含的就是同步方式
                  <AppenderRef ref="RandomAccessFile"/>
                </AsyncLogger>
                // 下面这个就是同步的 ,如果要用异步的 用<asyncRoot> <AppenderRef ref="RandomAccessFile"/></asyncRoot>
                <Root level="info" includeLocation="true">
                  <AppenderRef ref="RandomAccessFile"/>
                </Root>
            </loggers>

参考官网:
    1> https://logging.apache.org/log4j/2.x/manual/async.html#Performance
    2> Mixing Synchronous and Asynchronous Loggers 这一节讲述了混合日志的配置方式

日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL

Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出

设置log4j2的自身log级别为warn monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数

spring web 项目 exclusioins

xml
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

spring webflux 项目 exclusioins

xml
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
  <groupId>com.lmax</groupId>
  <artifactId>disruptor</artifactId>
  <version>3.4.2</version>
</dependency>
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" monitorInterval="30">
    <Properties>
        <property name="PATTERN">%d %p %c{1.} [%t] %m %ex%n</property>
        <property name="PATTERN_1">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%t] -|%c -|%L -| %msg%n</property>
        <property name="PATTERN_2">%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n</property>
        <property name="PATTERN_3">[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n</property>
        <property name="PATTERN_4">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n</property>
        <property name="PATTERN_5">%highlight{%d}{yyyy-MM-dd HH:mm:ss} - %highlight{[%p] %l [%t]}{FATAL=red,ERROR=red,WARN=yellow,INFO=cyan,DEBUG=cyan,TRACE=blue}: %m%n</property>
        <property name="PATTERN_6">%-d{yyyy-MM-dd HH:mm:ss} - %highlight{[%p] %l}{FATAL=red,ERROR=red,WARN=yellow,INFO=cyan,DEBUG=cyan,TRACE=blue}: %m%n</property>
    </Properties>
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN_5}"/>
        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="LogFile" fileName="./logs/log.log" append="false" immediateFlush="false">
            <PatternLayout pattern="${PATTERN}"/>
        </File>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo"
                     fileName="./logs/info.log"
                     filePattern="./logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileWarn"
                     fileName="./logs/warn.log"
                     filePattern="./logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <RollingFile name="RollingFileError"
                     fileName="./logs/error.log"
                     filePattern="./logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和hibernate的一些无用的debug信息-->
        <!--
         <logger name="org.springframework" level="INFO">
         </logger>
         <logger name="org.mybatis" level="INFO">
         </logger>
         -->

        <root level="INFO" includeLocation="true">
            <!--            <appender-ref ref="LogFile"/>-->
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>

文章来源于自己总结和网络转载,内容如有任何问题,请大佬斧正!联系我