spring boot项目的日志配置

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.控制台效果:
    image
    2.文件效果:
    image
    image
    image

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>
    
  • 运行效果
    1.控制台效果:
    image
    2.文件效果:
    image
posted @   _mcj  阅读(242)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示