zoukankan      html  css  js  c++  java
  • 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 提供的日志功能,应该可以满足我们日常大部分需求场景,配置也比较简单,推荐大家在实际项目中使用。

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/yurunmiao/p/15663118.html
Copyright © 2011-2022 走看看