springboot学习之六(项目的日志配置)

1. 日志的作用

日志记录了系统行为的时间、地点、状态等相关信息,能够帮助我们了解并监控系统状态,在发生错误或者接近某种危险状态时能及时提醒我们处理,同时在系统产生问题,能够帮助我们快速定位、诊断问题。

2. 常用的日志框架

log4j:Log4j是Apache的一个Java的日志库,是一款非常古老的日志框架,开发团队于2015年宣布log4j生命的终结
logback:Logback由实现Log4j的开发人员编写,其目标是成为其继任者。它遵循与Log4j相同的概念,但被重写是为了提高性能,以及实现其他一些改进,如高级过滤选项和自动重新加载日志配置。目前spring boot项目默认使用的就是lagback日志。
log4j2:Log4j2是对Log4j的升级,它比其前身Log4j提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题,目前是这三种日志框架中速度最快的。

3. 日志门面SLF4J

简单日志门面(Simple Logging Facade For Java)slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案。也可以将其理解为一个多种类型的转接头,提供一个接口来对接不同的日志框架。也就是我们平时项目开发的时候使用的@Slf4j注解,无论我们使用的是log4j还是logback日志框架,都可以通过使用这个注解,然后通过log.info()等来进行日志的打印。

4. 日志框架的详解

由于只实践了logback与log4j2这两种日志框架,所以在这边只介绍logback和log4j2这两种日志框架。

4.1 logback日志框架

    • 日志级别
      TRACE < DEBUG < INFO < WARN < ERROR < FATAL
    • 添加依赖
      由于spring boot项目中默认使用的就是logback日志框架,logback的依赖spring-boot-starter-logging已经包含在了spring-boot-starter依赖中,所以只要引入的有spring-boot-starter依赖我们这边就不需要再次引入依赖
    • 日志配置
      其主要有两种配置方式,一种是简单的配置,直接再applicatin.properties配置文件中进行相关的配置即可,第二种则是通过xml配置文件进行配置,在使用xml配置文件进行配置的时候需要注意,如果配置文件的名称不是logback-spring.xml并且是再resource目录下时,需要通过在application.properties配置文件中进行如下设置:
logging.config=classpath:日志配置文件名.xml

(1)通过application.properties配置文件配置日志信息

#配置日志格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %-50logger{36} : %msg%n
#日志输出文档路径
logging.file.name=D:/log/music/log.log
#日志归档,这边的意思时每天输出一个日志文件
logging.logback.rollingpolicy.file-name-pattern=D:/log/music/log-info-%d{yyyy-MM-dd}.%i.log
logging.logback.rollingpolicy.clean-history-on-start=false
logging.logback.rollingpolicy.max-file-size=10MB
#设置日志最多存在的个数,如果上面日期格式是天的话,这里就是最多存在30天,如果是月的话,最多就是30个月
logging.logback.rollingpolicy.max-history=30

(2)通过xml配置文件进行配置

    • 配置参数说明:
      • 根节点<configuration>:标签包含三个属性
        scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
        scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
        debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
        例如:
        <configuration scan="true" scanPeriod="10 seconds" debug="false">
        </configuration>
      • 子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。
        例如:
        <contextName>musicLogback</contextName>
      • 子节点<property>:标签用来定义变量值,有name和value两个属性,能够在上下文通过${}来进行引用变量,可以说就相当于一个map,name为key,value为value
        name:变量的名称
        value:变量定义的值
        例如:
        <property name="LOG_PATH" value="D:/log/music"/>
        <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
        PS:(1)使用的时候直接${LOG_PATH}或者${FILE_LOG_PATTERN}就可直接引用这个value的值了
        (2)pattern的具体参数信息描述可看下面完整的xml中的注释。
      • 子节点<timestamp>:标签,有key和datePattern两个属性
        key:标识该timestamp标签的名字
        datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
        例如:
        <timestamp key="SECOND" datePattern="yyyy-MM-dd HH:mm:ss"/>
      • <appender>标签,负责写日志的组件,有两个必要的属性name和class,
        name:指定appender名称,
        class:指定appender全限定名
        • ConsoleAppender:把日志输出到控制台,有以下子节点

          • <encoder>:对日志进行格式化

          例如:

          <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
              <encoder>
                  <pattern>${LOG_PATTERN}</pattern>
                  <!--字符集-->
                  <charset>UTF-8</charset>
              </encoder>
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>INFO</level>
              </filter>
          </appender>
        • FileAppender:把日志添加到文件,有以下子节点

          • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
          • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
          • <encoder>:对日志进行格式化

          例如:

          <appender name="INFO_FILE" class="ch.qos.logback.core.FileAppender">
              <file>${LOG_PATH}/info/log.log</file>
              <append>true</append>
              <encoder>
                  <pattern>${FILE_LOG_PATTERN}</pattern>
                  <charset>UTF-8</charset>
              </encoder>
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>INFO</level>
              </filter>
          </appender>
        • RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点

          • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
          • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
          • <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,有如下:
            • class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy":最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
              • <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d
              • <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
            • class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy":查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。有以下节点:
              • <maxFileSize>:活动文件的大小,默认值是10MB。
            • class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy":根据固定窗口算法重命名文件的滚动策略。有以下子节点:
              • <minIndex>:窗口索引最小值
              • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
              • <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 log%i.log,会产生归档文件log1.log和log2.log。还可以指定文件压缩选项log%i.log.gz或者log%i.log.zip

          例如:

          <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${LOG_PATH}/info/log.%d{yyyy-MM-dd}.log</fileNamePattern>
                  <maxHistory>30</maxHistory>
              </rollingPolicy>
              <encoder>
                  <pattern>${FILE_LOG_PATTERN}</pattern>
                  <charset>UTF-8</charset>
              </encoder>
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>INFO</level>
              </filter>
          </appender>
      • <filter>标签:主要是过滤,一般用在<appender>标签中,有如下两个过滤器,也就是类名:
        • LevelFilter:根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。比如:
          <level>INFO</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
          onMatch值有三个选项:
              ACCEPT:表示匹配该级别及以上
              DENY:表示不匹配该级别及以上
              NEUTRAL:表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
          onMisMatch值有三个选项:
              ACCEPT:表示匹配该级别以下
              DENY:表示不匹配该级别以下的
              NEUTRAL:表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
        • ThresholdFilter:过滤低于指定阈值的事件。 对于等于或高于阈值的事件通行,比如:
          <level>DEBUG</level>
          表示只打印日志级别高于等于DEBUG级别的日志
      • <logger>标签:用来设置某一个包或具体的某一个类的日志打印级别、以及指定,具有name,level,additivity属性
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF
        additivity:是否向上级logger传递打印信息,也就是是否将日志流反馈到root中。默认是true。
        例如:
        <logger name="com.apache.ibatis" level="TRACE"/>
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
      • <root>标签:全局配置,本质上也是一个logger,只不过name属性恒为root,是所有logger的上级,默认所有的Logger都继承此配置
        例如:
        <root>
            <!--appender-ref标签:用来指定日志输出到哪个appender-->
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="INFO_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
            <appender-ref ref="ROLLING_FILE"/>
        </root>
    • 完整的xml配置文件
      <?xml version="1.0" encoding="UTF-8" ?>
      <!--日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出-->
      <!--configuration 标签包含三个属性
          scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
          scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
          debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
      -->
      <configuration scan="true" scanPeriod="10 seconds" debug="false">
          <!--子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。-->
          <contextName>musicLogback</contextName>
      
          <!-- property标签用来定义变量值,有name和value两个属性,能够在上下文通过${}来进行引用变量,可以说就相当于一个map,name为key,value为value
             name:变量的名称
             value:变量定义的值
           -->
          <property name="LOG_PATH" value="D:/log/music"/>
      
          <!-- timestamp标签,有key和datePattern两个属性
             key:标识该timestamp标签的名字
             datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
             -->
          <timestamp key="SECOND" datePattern="yyyy-MM-dd HH:mm:ss"/>
          <!--彩色日志依赖的渲染类-->
          <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
          <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
          <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
          <!-- 控制台彩色日志格式 -->
          <property name="LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
          <!-- 写入到文件日志格式 -->
          <!--
              -X号: X信息输出时左对齐;
              %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
              %r: 输出自应用启动到输出该log信息耗费的毫秒数
              %c: 输出日志信息所属的类目,通常就是所在类的全名
              %t: 输出产生该日志事件的线程名
              %%: 输出一个"%"字符
              %F: 输出日志消息产生时所在的文件名称
              %L: 输出代码中的行号
              %m: 输出代码中指定的消息,产生的日志具体信息
              %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
              可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
              1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
              2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
              3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
              4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
              5)更多命令描述链接:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
          -->
          <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
          <!-- appender标签,负责写日志的组件,有两个必要的属性name和class,
              name:指定appender名称,
              class:指定appender全限定名
                  ConsoleAppender:把日志输出到控制台,有以下子节点
                      <encoder>:对日志进行格式化
                  FileAppender:把日志添加到文件,有以下子节点
                      <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
                      <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
                      <encoder>:对日志进行格式化
                  RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点
                      <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
                      <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
                      <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,有如下:
                          class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy":最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
                              <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}
                              <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
                          class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy":查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。有以下节点:
                              <maxFileSize>:活动文件的大小,默认值是10MB。
                          class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy":根据固定窗口算法重命名文件的滚动策略。有以下子节点:
                              <minIndex>:窗口索引最小值
                              <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
                              <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 log%i.log,会产生归档文件log1.log和log2.log。还可以指定文件压缩选项log%i.log.gz或者log%i.log.zip
      
          -->
          <!--将日志输出到控制台,并且只输出INFO级别及比其级别高的日志-->
          <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
              <encoder>
                  <pattern>${LOG_PATTERN}</pattern>
                  <!--字符集-->
                  <charset>UTF-8</charset>
              </encoder>
              <!-- filter标签:主要是过滤,有两个过滤器
                  LevelFilter:根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。比如:
                      <level>INFO</level>
                      <onMatch>ACCEPT</onMatch>
                      <onMismatch>DENY</onMismatch>
                      这种表示只记录INFO级别的
                      onMatch值有三个选项:
                          ACCEPT:表示匹配该级别及以上
                          DENY:表示不匹配该级别及以上
                          NEUTRAL:表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
                      onMisMatch值有三个选项:
                          ACCEPT:表示匹配该级别以下
                          DENY:表示不匹配该级别以下的
                          NEUTRAL:表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
                  ThresholdFilter:过滤低于指定阈值的事件。 对于等于或高于阈值的事件通行,比如:
                      <level>DEBUG</level>
                      表示只打印日志级别高于等于DEBUG级别的日志
              -->
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>INFO</level>
              </filter>
      
          </appender>
      
          <!--输出日志到指定文件目录的log.log中,日志被追加到文件结尾,输入INFO及比其等级高的日志-->
          <appender name="INFO_FILE" class="ch.qos.logback.core.FileAppender">
              <file>${LOG_PATH}/info/log.log</file>
              <append>true</append>
              <encoder>
                  <pattern>${FILE_LOG_PATTERN}</pattern>
                  <charset>UTF-8</charset>
              </encoder>
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>INFO</level>
              </filter>
          </appender>
      
          <!--输出日志到指定文件目录的log.log中,日志被追加到文件结尾,只输入ERROR级别的日志-->
          <appender name="ERROR_FILE" class="ch.qos.logback.core.FileAppender">
              <file>${LOG_PATH}/error/log.log</file>
              <append>true</append>
              <encoder>
                  <pattern>${FILE_LOG_PATTERN}</pattern>
                  <charset>UTF-8</charset>
              </encoder>
              <filter class="ch.qos.logback.classic.filter.LevelFilter">
                  <level>ERROR</level>
                  <onMatch>ACCEPT</onMatch>
                  <onMismatch>DENY</onMismatch>
              </filter>
          </appender>
      
          <!--每天生成一个日志文件,保存30天的日志。这个可以理解为按照天数,每天一个日志文件及逆行保存日志记录,保存INFO及INFO级别以上的日志-->
          <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${LOG_PATH}/info/log.%d{yyyy-MM-dd}.log</fileNamePattern>
                  <maxHistory>30</maxHistory>
              </rollingPolicy>
              <encoder>
                  <pattern>${FILE_LOG_PATTERN}</pattern>
                  <charset>UTF-8</charset>
              </encoder>
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>INFO</level>
              </filter>
          </appender>
      
          <!-- logger标签:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>,具有name,level,additivity属性
              name:用来指定受此logger约束的某一个包或者具体的某一个类。
              level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF
              additivity:是否向上级logger传递打印信息,也就是是否将日志流反馈到root中。默认是true。
          -->
          <logger name="com.apache.ibatis" level="TRACE"/>
          <logger name="java.sql.Connection" level="DEBUG"/>
          <logger name="java.sql.Statement" level="DEBUG"/>
          <logger name="java.sql.PreparedStatement" level="DEBUG"/>
      
          <!--root标签:全局配置,本质上也是一个logger,只不过name属性恒为root,是所有logger的上级,默认所有的Logger都继承此配置-->
          <root>
              <!--appender-ref标签:用来指定日志输出到哪个appender-->
              <appender-ref ref="CONSOLE"/>
              <appender-ref ref="INFO_FILE"/>
              <appender-ref ref="ERROR_FILE"/>
              <appender-ref ref="ROLLING_FILE"/>
          </root>
      
      </configuration>

      运行效果
      1.控制台效果:

       

 

4.2 log4j2日志框架

    • 日志级别
      ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
    • 引入依赖
      这边需要注意的的是由于spring boot项目自动引入了logback日志的依赖,所以这边要使用log4j2需要先把logback的依赖过滤出去
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!--使用log4j2需要把logback的依赖排除,防止冲突,需要在每个有spring-boot-start的依赖中添加-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--log4j2日志依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

在网上找到了一个全局排除spring-boot-logging依赖的方法

<!--全局排除spring-boot-starter-logging内的所有依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
    • 日志配置

这边我主要是通过xml配置文件进行日志配置的,这边需要注意的是当配置文件的名称不是log4j2-spring.xml时,需要在application.properties配置文件中,配置下面的属性指定日志文件的位置:

logging.log4j2.config.override=classpath:日志配置文件的名称.xml

(1)通过xml文件进行日志配置

    • 配置参数说明
      这边的配置参数与logback日志的参数基本上一样,这边就不在此说明了
    • 完整的xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration>
    <Properties>
        <Property name="LOG_PATH">D:/log/music/log4j2</Property>
        <!--彩色日志-->
        <Property name="CONSOLE_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>
        <!--写入到文件中的日志,非彩色-->
        <Property name="FILE_LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} --- [%15.15t] %-40.40c{1.} : %m%n%xwEx</Property>
    </Properties>
    <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${CONSOLE_LOG_PATTERN}"></PatternLayout>
        </Console>
        <!-- 打印出所有的info及以上级别信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
        <RollingFile name="INFO_LOG" fileName="${LOG_PATH}/log-info.log"
                     filePattern="${LOG_PATH}/log-info-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1, 单位到底是月 天 小时 分钟,根据filePattern配置的日期格式而定,本处的格式为天,则默认为1天-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--按大小分-->
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            <Filters>
                <!-- 只记录info和以上级别信息 -->
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <!-- 存储所有error信息 -->
        <RollingFile name="ERROR_LOG" fileName="${LOG_PATH}/log-error.log"
                     filePattern="${LOG_PATH}/log-error-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1, 单位到底是月 天 小时 分钟,根据filePattern配置的日期格式而定,本处的格式为天,则默认为1天-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--按大小分-->
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            <Filters>
                <!-- 只记录error级别信息 -->
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
            <DefaultRolloverStrategy max="1000"/>
        </RollingFile>
        <!--大于5分钟宽带查询接口单独打印-->
        <RollingFile name="DAYU_LOG" fileName="${LOG_PATH}/log-dayuInfo.log"
                     filePattern="${LOG_PATH}/log-dayuInfo-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1, 单位到底是月 天 小时 分钟,根据filePattern配置的日期格式而定,本处的格式为天,则默认为1天-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--按大小分-->
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            <Filters>
                <!-- 只记录info及以上级别信息 -->
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="CONSOLE"/>
            <AppenderRef ref="INFO_LOG"/>
            <AppenderRef ref="ERROR_LOG"/>
        </Root>

        <!--将logger中的 additivity 属性配置为 false,则这个logger不会将日志流反馈到root中。-->
        <Logger name="DAYU_LOG" additivity="true" level="INFO">
            <!--<appender-ref ref="sendCodeFile" level="INFO" />-->
            <appender-ref ref="DAYU_LOG" level="INFO" />
        </Logger>
    </Loggers>
</Configuration>

运行效果

 

 

转 : https://www.cnblogs.com/mcj123/p/16816378.html

 

posted @ 2023-04-23 14:56  与f  阅读(274)  评论(0编辑  收藏  举报