Spring Boot Sample 007之spring-boot-log4j2 一、环境 二、目的 三、步骤 四、添加测试文件

  • Idea 2020.1
  • JDK 1.8
  • maven

二、目的

spring boot 整合多环境log4j2.

三、步骤

3.1、点击File -> New Project -> Spring Initializer,点击next

Spring Boot Sample 007之spring-boot-log4j2
一、环境
二、目的
三、步骤
四、添加测试文件

3.2、在对应地方修改自己的项目信息

Spring Boot Sample 007之spring-boot-log4j2
一、环境
二、目的
三、步骤
四、添加测试文件

3.3、选择Web依赖,选中Spring Web。可以选择Spring Boot版本,本次默认为2.2.6,点击Next

Spring Boot Sample 007之spring-boot-log4j2
一、环境
二、目的
三、步骤
四、添加测试文件

3.4、编辑工程名和项目路径,确定后点击Finish完成

Spring Boot Sample 007之spring-boot-log4j2
一、环境
二、目的
三、步骤
四、添加测试文件

3.5、项目结构

Spring Boot Sample 007之spring-boot-log4j2
一、环境
二、目的
三、步骤
四、添加测试文件

四、添加测试文件

添加依赖:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.ouyushan</groupId>
    <artifactId>spring-boot-log4j2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-log4j2</name>
    <description>Log4j2 project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <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>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-access</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 使用log4j2 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="PID">????</Property>
        <Property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />

        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
添加配置文件log4j2-uat.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="PID">????</Property>
        <Property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />

        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
配置默认application.yaml
spring:
  profiles:
    active: uat
    
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: Asia/Chongqing
配置默认application-dat.yaml
logging:
  config: classpath:log4j2-dat.xml
配置默认application-uat.yaml
logging:
  config: classpath:log4j2-uat.xml
五、log4j2配置详情
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--status="WARN" :用于设置log4j2自身内部日志的信息输出级别,默认是OFF-->
<!--monitorInterval="30"  :间隔秒数,自动检测配置文件的变更和重新配置本身-->
<configuration status="warn" monitorInterval="60" strict="true">
  <properties>
    <!--自定义一些常量,之后使用${变量名}引用-->
    <property name="logpath">./logs</property>
    <property name="charset">UTF-8</property>
    <!--自定义的输出格式-->
    <property name="pattern">%-d{yyyy-MM-dd HH:mm:ss.SSS}@@%p@@%X{ip}@@%t %C@@%X{requestId} %M %m %n </property>
  </properties>
  <!--appenders:定义输出内容,输出格式,输出方式,日志保存策略等,常用其下三种标签[console,File,RollingFile]-->
  <!--Appender可以理解为日志的输出目的地-->
  <appenders>
    <!--console :控制台输出的配置-->
    <Console name="console" target="SYSTEM_OUT">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
    </Console>
    <!--RollingRandomAccessFile性能比RollingFile提升官网宣称是20-200%-->
    <RollingRandomAccessFile name="YZY.TRACE" immediateFlush="true" bufferSize="1024"
      fileName="${logpath}/trace.log"
      filePattern="${logpath}/trace.log.%d{yyyy-MM-dd}.gz">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="trace.log.*.gz"/>
          <IfLastModified age="3d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.SYSTEM" immediateFlush="true" bufferSize="4096"
      fileName="${logpath}/system.log"
      filePattern="${logpath}/system.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <!--引用上面自定义的输出格式-->
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <Filters>
        <!--ThresholdFilter :日志输出过滤-->
        <!--level="info" :日志级别,onMatch="ACCEPT" :级别在info之上则接受,onMismatch="DENY" :级别在info之下则拒绝-->
        <!--与logger、root中定义的日志级别相配合,相当于两个闸门,先判断logger、root的级别,符合了才会用到该filter中的level,此时再进行一次筛选-->
        <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
        <!--<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>-->
        <!--<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->
      </Filters>
      <!-- Policies :日志滚动策略-->
      <Policies>
        <!--<TimeBasedTriggeringPolicy interval="1" modulate="true"/>-->
        <CronTriggeringPolicy schedule="0 0 2 * * ?" evaluateOnStartup="true"/>
      </Policies>
      <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件-->
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="system.log.*.gz"/>
      <!--只保留7天,超过则删除-->
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.ERROR" immediateFlush="true" bufferSize="4096"
      fileName="${logpath}/error.log"
      filePattern="${logpath}/error.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <Filters>
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="error.log.*.gz"/>
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.AUDIT" immediateFlush="false" bufferSize="8192"
      fileName="${logpath}/audit.log"
      filePattern="${logpath}/audit.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <Filters>
        <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="audit.log.*.gz"/>
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.POOL" immediateFlush="true" bufferSize="1024"
      fileName="${logpath}/pool.log"
      filePattern="${logpath}/pool.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="pool.log.*.gz"/>
          <IfLastModified age="3d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.MONITOR" immediateFlush="true" bufferSize="1024"
      fileName="${logpath}/monitor.log"
      filePattern="${logpath}/pool.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="pool.log.*.gz"/>
          <IfLastModified age="3d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
    <RollingRandomAccessFile name="YZY.BIZ" immediateFlush="true"
      fileName="${logpath}/biz.log"
      filePattern="${logpath}/biz.log.%d{yyyy-MM-dd}.gz"
      ignoreExceptions="false">
      <PatternLayout pattern="${pattern}" charset="${charset}"/>
      <TimeBasedTriggeringPolicy/>
      <DefaultRolloverStrategy>
        <Delete basePath="${logpath}" maxDepth="2" followLinks="true">
          <IfFileName glob="biz.log.*.gz"/>
          <IfLastModified age="7d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
  </appenders>
  
  <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
  <loggers>
    <!--additivity="false"表示在该logger中输出的日志不会再延伸到父层logger。这里如果改为true,则会延伸到Root Logger,遵循Root Logger的配置也输出一次。-->
    <Logger additivity="false" name="YZY.TRACE" level="INFO">
      <AppenderRef ref="YZY.TRACE"/>
    </Logger>
    <Logger additivity="false" name="YZY.SYSTEM" level="INFO">
      <AppenderRef ref="YZY.SYSTEM"/>
      <AppenderRef ref="YZY.ERROR"/>
    </Logger>
    <Logger additivity="false" name="YZY.BIZ" level="INFO">
      <AppenderRef ref="YZY.BIZ"/>
    </Logger>
    <!--Logger节点用来单独指定日志的形式,name为包路径,比如要为org.apache包下所有日志指定为INFO级别等。 -->
    <Logger additivity="false" name="org.apache" level="INFO">
      <AppenderRef ref="console"/>
    </Logger>
    <Logger additivity="false"
      name="com.alibaba.dubbo.common.threadpool.monitor.MonitorPoolRunnable" level="INFO">
      <AppenderRef ref="YZY.POOL"/>
    </Logger>
    <Logger additivity="false" name="com.alibaba.dubbo.monitor.dubbo.sfextend.SfMonitorExtend"
      level="INFO">
      <AppenderRef ref="YZY.MONITOR"/>
    </Logger>
    <!--针对,request以及reponse的信息配置输出级别,生产线请配置为error-->
    <Logger additivity="true" name="com.alibaba.dubbo.rpc.protocol.rest.support" level="INFO">
      <AppenderRef ref="console"/>
    </Logger>
    <!-- 在开发和测试环境启用,输出sql -->
    <Logger additivity="true" name="com.YZY.mapper" level="DEBUG">
    </Logger>
    <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
    <Root level="DEBUG" includeLocation="true">
      <AppenderRef ref="console"/>
      <AppenderRef ref="YZY.SYSTEM"/>
      <AppenderRef ref="YZY.ERROR"/>
      <AppenderRef ref="YZY.AUDIT"/>
    </Root>
  </loggers>
</configuration>