springboot 日志管理之 logback

1、logback 简介

        在springboot 中,任何一个 spring-boot-starter-* 都会默认导入一个 spring-boot-starter-logging 启动器依赖,默认集成的是 logback 日志,可以在项目的 application.yml 中添加日志相关配置,也可以直接指定日志配置文件进行配置。

2、集成 logback 的方式

2.1、springboot 方式

        任何一个 spring-boot-starter-* 都会默认导入一个 spring-boot-starter-logging 启动器依赖,因此只要当前项目的依赖中有starter,无需显式引入。

2.2、非 springboot 项目

        需要在当前项目中的 pom 文件中引入以下依赖:

<!-- slf4j日志门面的一个具体实现 -->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.3</version>
</dependency>

3、日志配置文件的命名规范

        springboot 框架默认加载 logback 的日志配置文件是 logback-spring.xml,如果需要自定义配置文件名,需要在当前项目中指定日志配置文件。配置文件引入配置如下:

logging.location=classpath:mylogback.xml  # 在 resources 目录下定义

4、logback 配置文件详解

4.1、logback 配置文件使用的标准

        一般 logback-spring.xml 文件中没有这些信息,添加之后可以在写配置文件的时候有提示

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://ch.qos.logback/xml/ns/logback"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback 
               https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/xsd/logback.xsd" debug="true">  
4.2、动态加载配置文件
<!-- 在 configuration 标签中添加 scan 标签-->
<configuration scan="true" scanPeriod="10 seconds" debug="false">  
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true;
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟;
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
4.3、引用/自定义属性值
<!-- 用来加载logback的配置属性 -->
<!-- 使用classpath的方式引入文件,只需写明文件名即可-->
<property resource="logback.properties"/>    
<contextName>logback</contextName>   <!-- 属性文件中定义的属性前缀 -->

<!-- 自定义属性值:
name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。
定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="D:/mylog" />
4.4、appender 标签

        appender 标签是 configuration 的子节点,是负责写日志的组件;其有两个必要的属性: name 和 class。

name 表示 appender 的名称,class 表示使用 appender 类型的全限定类名。

主要有以下几种 appender:

<!-- 1、控制台输出的appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
</appender>
<!-- 2、文件输出的appender -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
</appender>
<!-- 3、滚动记录文件输出的appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
<!-- 4、异步输出的appender -->
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
</appender>
4.4.1、控制台输出的 ConsoleAppender
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
 <encoder>
  <!-- 日志输出的格式 -->
  <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
     <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
  </encoder>
</appender> 
4.4.2、输出到文件的 FileAppender
<!--写入文件的appender-->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">  
    <file>testFile.log</file>   <!--定义日志文件名-->
    <append>true</append>       <!--是否追加-->
    <encoder>  
       <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>  
    </encoder>  
</appender>  
4.4.3、滚动输出到文件 
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">   
   <file>test.log</file>  

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">   
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>   
      <maxHistory>30</maxHistory>    
    </rollingPolicy> 
   
   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">   
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>   
      <minIndex>1</minIndex>   
      <maxIndex>3</maxIndex>   
   </rollingPolicy>  
    
   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">   
      <maxFileSize>5MB</maxFileSize>   
   </triggeringPolicy>   
   <encoder>   
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   
   </encoder>   
</appender> 
4.4.3.1、滚动策略(RollingPolicy):

1、TimeBasedRollingPolicy:最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。

有以下几个标签:

1)、fileNamePattern:必要节点,包含文件名及“%d”转换符, 如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。

2)、maxHistory:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且值是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。

3)、file:RollingFileAppender 的file子节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。

4)、totalSizeCap:日志最大保存的大小。当超过该值,会自动删除老的日志文件。必须和maxHistory一起使用,而且maxHistory先生效,其次是判断是否达到totalSizeCap。

5)、cleanHistoryOnStart:默认false。如果设置为true,再项目启动的时候会自动删除老的日志文件。

2、FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。

有以下几个标签:

1)、minIndex:窗口索引最小值。

2)、maxIndex:窗口索引最大值。

3)、fileNamePattern : 必须包含 %i,例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件 mylog1.log 和 mylog2.log。还可以指定文件压缩选项,例如,mylog1.log.gz 或者 mylog1.log.zip。

4.4.3.2、触发策略(TriggeringPolicy) :

1、SizeBasedTriggeringPolicy:查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。

有以下子标签:

maxFileSize:这是活动文件的大小,默认值是 10MB;

4.4.3.3、过滤器 (Filter)

1、LevelFilter :级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据 onMath 和 onMismatch 接收或拒绝日志;

有以下子节点 :
level: 设置过滤级别;

onMatch: 用于配置符合过滤条件的操作,DENY,NEUTRAL,ACCEPT;

onMismatch: 用于配置不符合过滤条件的操作,DENY,NEUTRAL,ACCEPT。

2、ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝,只有一个 level 子节点。

4.5、logger 标签

        用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 appender;仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。

name:用来指定受此 logger 约束的某一个包或者具体的某一个类;

level:用来设置打印级别,大小写无关,还有一个特定值 INHERITED 或者同义词 NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。

additivity:是否向上级 logger 传递打印信息,默认是 true。

<Logger name="org.springframework" level="info" additivity="false">
   <AppenderRef ref="Console"/>
</Logger>
4.6、root 标签

        root 标签是必选节点,用来指定最基础的日志输出级别,只有一个 level 属性,默认是 debug,可以包含零个或多个元素。标识这些 appender 将会添加到这个 logger。

root 表示当前项目中根节点的日志,如果一个项目名称为 com.test.demo,有几个 logger 记录器:root -> com -> com.test -> com.test.demo。

<root level="info">
   <appender-ref ref="CONSOLE" />
   <appender-ref ref="DEBUG_FILE" />
   <appender-ref ref="INFO_FILE" />
   <appender-ref ref="WARN_FILE" />
   <appender-ref ref="ERROR_FILE" />
</root>

5、完整的 logback-spring.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://ch.qos.logback/xml/ns/logback"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback 
               https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/xsd/logback.xsd" debug="true"
               scan="true" scanPeriod="10 seconds">  
    <!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
	scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的		时间间隔为1分钟。-->
    <!-- 用来加载logback的配置属性 -->
	<!-- 使用classpath的方式引入文件,只需写明文件名即可-->
	<property resource="logback.properties"/>    
    <contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="D:/mylog" />
      <!-- 彩色日志格式 -->
    <property name="CONSOLE_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}}"/>

    <!-- 指定日志输出的位置 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <!--<encoder>:对日志进行格式化:一是把日志信息转换成字节数组,二是把字节数组写入到输出流。-->
        <encoder>
            <!-- 日志输出的格式 -->
            <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
            <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
        </encoder>
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <!-- 此日志文件只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--写入文件的appender-->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">  
        <file>testFile.log</file>  
        <append>true</append>   <!--是否追加-->
        <encoder>  
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
        </encoder>  
   </appender>  
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <file>test.log</file>      
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">   
          <fileNamePattern>tests.%i.log.zip</fileNamePattern>   
          <minIndex>1</minIndex>   
          <maxIndex>3</maxIndex>   
        </rollingPolicy>      
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">   
          <maxFileSize>5MB</maxFileSize>   
        </triggeringPolicy>   
        <encoder>   
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   
        </encoder>   
   </appender>            


    <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
    <root level="DEBUG">
        <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
        <appender-ref ref="STDOUT" />
    </root>
    <!-- 根据特殊需求指定局部日志级别 -->
    <logger name="com.test.mapper" level="DEBUG"/>
</configuration>

总结:springboot 默认集成的是 logback 日志框架,使用的是 sl4j 日志门面。以上关于 logback 的使用和配置足以满足项目的使用。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值