zoukankan      html  css  js  c++  java
  • 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

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

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

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

    3.5、项目结构

    四、添加测试文件

    添加依赖:
    <?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>
  • 相关阅读:
    在Windows .NET平台下使用Memcached
    Windows下配置使用MemCached
    B/S 网站技术选型
    HttpHandler与HttpModule的用处与区别
    TCP长连接与短连接的区别
    页和区 sql server
    聚集索引和非聚集索引的区别
    MicrosoftSQLServer中的锁模式
    我是如何在SQLServer中处理每天四亿三千万记录的
    datetime模块处理时间
  • 原文地址:https://www.cnblogs.com/ouyushan/p/13025005.html
Copyright © 2011-2022 走看看