• SpringBoot Logback 日志配置


    前言

    之前使用 SpringBoot 的时候,总是习惯于将日志框架切换为 Log4j2,可能是觉得比较靠谱,也可能年龄大了比较排斥新东西。今天搞新项目的时候,想着每次搞这个迁移有点儿麻烦,就想着看看 Logback 这个 SpringBoot 一直默认集成(推荐)使用的框架具体是个什么样子,参考Spring 官方文档日志章节实践下来感觉不错,翻译和补充一下关键知识点。

    :本文仅涉及 SpringBoot 和 Logback 集成使用的相关内容,关于 Logback 的详细内容请自行参考官网

    日志格式

    以 SpringBoot 应用启动的一行日志为例:

    2021-12-08 10:21:45.585  INFO 28453 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
    

    日志由以下 8 个部分组成:

    1. 日期时间,精确到毫秒

      2021-12-08 10:21:45.585
      
    2. 日志级别

      INFO
      

      Logback 的日志级别:ERROR、WARN、INFO、DEBUG 和 TRACE。注意,Logback 不支持 FATAL,会映射给 ERROR。

    3. 进程ID

      28453
      

      Java(SpringBoot)应用进程ID。

    4. 分隔线

      ---
      

      仅作为日志头(1、2、3)和日志体(5、6、7)之间的分隔线,无实际意义。

    5. 线程名称

      [           main]
      

      方括号([])内部的字符串即为线程名称。

    6. 记录器名称

      o.s.b.w.embedded.tomcat.TomcatWebServer
      

      日志记录器(logger)名称,一般使用类名代替。

    7. 冒号

      :
      

      仅作为日志记录器(6)和日志消息(7)之间的分隔符,无实际意义。

    8. 日志消息

      Tomcat initialized with port(s): 8080 (http)
      

      日志消息内容。

    日志输出

    默认情况下,SpringBoot 仅会输出日志至控制台(Console),如果需要输出至日志文件,需要通过配置属性 logging.file.name 或 logging.file.path 开启日志文件输出功能。

    两个配置属性二选一即可,本文以 logging.file.name 为例:

    logging:
      file:
        name: /tmp/boot.log
    

    日志输出至控制台的同时,也会输出至日志文件 /tmp/boot.log,该日志文件大小达到 10 MB 时,会发生日志轮替:

    boot.log
    
    boot.log.2021-12-08.0.gz
    boot.log.2021-12-08.1.gz
    boot.log.2021-12-08.2.gz
    boot.log.2021-12-08.3.gz
    

    日志会以 天(日期,如:2021-12-08)为单位进行归档压缩(GZ 格式),考虑到该 天 内可能会有多个归档文件,归档压缩文件名称中会包含有序号(如:0、1、2、3)。

    日志轮替

    我们也可以通过配置属性自定义日志轮替过程:

    logging:
      file:
        name: /tmp/boot.log
      logback:
        rollingpolicy:
          file-name-pattern: /tmp/boot-%d{yyyy-MM-dd}.%i.log
          clean-history-on-start: false
          max-file-size: 1GB
          total-size-cap: 10GB
          max-history: 7
    

    日志轮替底层使用的是 Logback SizeAndTimeBasedRollingPolicy,同时支持按照 日志时间日志大小 进行归档。

    • logging.logback.rollingpolicy.file-name-pattern

      归档文件名称模式,即:按照什么样的规则生成归档文件名称,文件名称中可以包含时间和序号。
      时间,表示按日志时间归档,使用 %d{...} 用于指定具体的日期时间格式(Java SimpleDateFormat), yyyy-MM-dd 表示按天(日期)归档(按日志时间归档);
      序号,表示同一个归档时间下,因日志大小达到阈值,日志归档多次产生多个归档文件的序号;

      boot.log
      boot-2021-12-08.0.log
      boot-2021-12-08.1.log
      boot-2021-12-08.2.log
      boot-2021-12-08.3.log
      ......
      
    • logging.logback.rollingpolicy.max-file-size

      日志文件大小最大值,使用 KB/MB/GB/... 为单位进行指定;日志文件大小超过设置的最大值,会进行日志归档(按日志大小归档)。

    • logging.logback.rollingpolicy.total-size-cap

      日志文件(日志文件 + 归档文件)总大小,使用 KB/MB/GB/... 为单位进行指定;日志文件总大小超过设置的值,会删除老(旧)的归档文件,直到日志文件总大小小于设置的值。

    • logging.logback.rollingpolicy.max-history

      归档日志文件保留天数,归档时间超出保留天数范围的归档文件会被删除。

    • logging.logback.rollingpolicy.clean-history-on-start

      归档文件的删除是在日志输出过程中执行的,这个属性可以指定应用启动时是否执行一次归档文档(因日志时间或大小)的删除,true 为执行,false 为不执行。

    日志级别

    日志记录器(logger)是有层次结构的,我们可以为不同的层次的记录器指定不同的日志输出级别。

    指定根(root)记录器日志输出级别:

    logging:
      level:
        root: info
    

    如前文所述,日志记录器的名称通常是类名,我们可以认为日志记录器的层次结构是按照类名结构设计的:

    父包名 + 若干子包名 + 类名

    以 com.aopeila.meetu.boot.api.Main 为例,我们可以按照如下方式分别指定不同层次日志记录器的输出级别:

    logging:
      level:
        com: debug
        com.aopeila: info
        com.aopeila.meetu: warn
        com.aopeila.meetu.boot.api.Main: error
    

    日志记录器会按 最长前缀匹配 计算日志应使用的输出级别,如果没有匹配到,则使用根记录器的日志输出级别。

    日志分组

    我们可以把相关的一些日志记录器(logger)合并为一个分组(group),然后以分组为单位进行配置。

    比如,可以把所有 Tomcat 相关的日志记录器合并为一个分组:

    logging:
      group:
        tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
    

    我们把以下日志记录器:

    org.apache.catalina
    org.apache.coyote
    org.apache.tomcat

    合并为一个分组 tomcat。

    然后就可以使用分组 tomcat 进行日志属性的配置,如统一设置日志级别:

    logging:
      level:
        tomcat: "trace"
    

    将分组 tomcat 日志级别设置为 trace,也就是将前面提到的三个日志记录器的日志级别设置为 trace。

    小结

    SpringBoot 默认集成 Logback 提供的日志功能,应该可以满足我们日常大部分需求场景,配置也比较简单,推荐大家在实际项目中使用。

  • 相关阅读:
    【lwip】04内存管理
    微信小程序之获取当前位置经纬度以及地图显示
    Apache与Tomcat的区别和联系
    Jfinal中Db类的的使用
    利用GROUP_CONCAT和GROUP BY实现字段拼接
    实现easyui combobox中textField字段的拼接
    Jfinal数据库操作语句中占位符的使用
    Django项目部署到Apache服务器
    函数编程概念
    腾讯官网 样式初始化
  • 原文地址:https://www.cnblogs.com/yurunmiao/p/15663118.html
Copyright © 2020-2023  润新知