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.控制台效果:

springboot 禁止输出mybatis日志 springboot不输出日志_配置文件

 

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>

运行效果

springboot 禁止输出mybatis日志 springboot不输出日志_spring_02