SpringBoot日志集成-LogBack

  • Log4J:最早的Java日志框架之一,由Apache基金会发起,提供灵活而强大的日志记录机制
  • JDK自带的日志框架:java.util.logging.Logg,是JDK1.4之后提供的日志API,已淘汰
  • logback: logback一个开源的日志框架,log4j作者为了代替log4j而开发的,SpringBoot默认的日志系统,也是目前性能最好的日志系统,推荐使用
  • slf4j: slf4j不能称之为一个日志框架,因为它仅仅提供了一系列的规范,提供一系列接口,但没有实现,采用的门面模式,底层可以采用logback,log4j等具体实现

日志级别

  • 日志级别是指记录日志信息的重要程度,用于限制输出日志的详细程度,不同的日志级别会对应不同的日志输出,SpringBoot默认日志级别是INFO
  • 日志级别介绍:IOFO是默认的日志级别,我们可以在代码中对日志的级别进行设置,低于设置级别的日志就会被忽略
    • TRACE:普通微量的日志,级别最低的日志信息
    • DEBUG:调试的时候的日志信息。TRACE和DEBUG级别的日志主要是对系统每一步的运行状态进行精确到记录。通过这种记录,可以查看某个操作每一步的执行情况,可以精确定位问题所在,MyBatis的SQL语句就需要在此级别下才会打印
    • INFO:普通的日志信息,记录系统正常运行的状态,日志的默认级别
    • WARN:警告日志,出现的问题不影响使用,但需要注意
    • ERROR:错误信息,级别较高的错误日志信息。这个级别的错误需要马上人工介入处理,但紧急程度低于fatal.ERROR和FATAL都是服务器自己的异常,像用户自己的操作不当等不应该被记为ERROR日志
    • FATAL:致命错误,最高日志级别,表示需要立即被处理的系统级错误。当该错误发生时,表示服务已经出现了不可用,也可以说服务挂了,需要技术人员立即介入处理。一般情况下,一个进程的生命周期中应该只记录一次fatal级别的日志,即进程遇到无法恢复的错误推出执行时

Logback实战

1.application.yml配置

logging:
  level:
    root: error #配置全局打印日志等级为error
    cn.lgc: trace #配置自己编写代码日志等级为trace
  pattern:
    file: "%d [%thread] %-5level %c %M %L: %msg%n"  #输出到文件的格式
    console: "%d [%thread] %-5level %c %M %L: %msg%n"  #编写打印到控制台日志的格式
  file:
    name: lgc.logs #日志同步到文件的路径

2.配置文件

Logback日志文件名称规范,取其他名称不生效

  • logback-spring.xml
  • logbak-spring.proovy
  • logback.xml
  • logback.proovy
Logback配置
XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>

<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

  <!-- 动态日志级别 -->
  <jmxConfigurator/>

  <!--*****************************************************************************-->
  <!--自定义项 开始-->
  <!--*****************************************************************************-->

  <!-- 定义日志文件 输出位置 -->
  <property name="log.home_dir" value="./logs"/>
  <property name="log.app_name" value="neuronet"/>
  <!-- 日志最大的历史 30天 -->
  <property name="log.maxHistory" value="30"/>
  <property name="log.maxSize" value="5MB"/>
  <!-- 日志界别 -->
  <property name="log.level" value="info"/>
  <!-- 打印sql语句 需要指定dao层包的位置 -->
  <property name="mapper.package" value="cn.itsource.mapper" />

  <!--*****************************************************************************-->
  <!--自定义项 结束-->
  <!--*****************************************************************************-->

  <!-- 彩色日志 -->
  <!-- 彩色日志依赖的渲染类 -->
  <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="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}}"/>


  <!-- ConsoleAppender 控制台输出日志 -->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <!--设置日志输出格式-->
      <pattern>${CONSOLE_LOG_PATTERN}</pattern>
      <!-- 设置字符集 -->
      <charset>UTF-8</charset>
    </encoder>
  </appender>

  <!-- ERROR级别日志 -->
  <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
  <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 过滤器,只记录WARN级别的日志 -->
    <!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!-- 设置过滤级别 -->
      <level>ERROR</level>
      <!-- 用于配置符合过滤条件的操作 -->
      <onMatch>ACCEPT</onMatch>
      <!-- 用于配置不符合过滤条件的操作 -->
      <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志输出位置 可相对、和绝对路径 -->
            <fileNamePattern>
                ${log.home_dir}/error/%d{yyyy-MM-dd}/${log.app_name}-%i.log
            </fileNamePattern>
            <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且<maxHistory>是6,
            则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 -->
            <maxHistory>${log.maxHistory}</maxHistory>
            <!--日志文件最大的大小-->
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>
                <!-- 设置日志输出格式 -->
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </encoder>
    </appender>


    <!-- WARN级别日志 appender -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 过滤器,只记录WARN级别的日志 -->
        <!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 设置过滤级别 -->
            <level>WARN</level>
            <!-- 用于配置符合过滤条件的操作 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 用于配置不符合过滤条件的操作 -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志输出位置 可相对、和绝对路径 -->
            <fileNamePattern>${log.home_dir}/warn/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <!--当天的日志大小 超过MaxFileSize时,压缩日志并保存-->
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>


    <!-- INFO级别日志 appender -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/info/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
        </encoder>
    </appender>


    <!-- DEBUG级别日志 appender -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/debug/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
        </encoder>
    </appender>


    <!-- TRACE级别日志 appender -->
    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>TRACE</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/trace/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
        </encoder>
    </appender>


    <!--设置一个向上传递的appender,所有级别的日志都会输出-->
    <appender name="app" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/app/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
        </encoder>
    </appender>


    <!--org.springframework.web包下的类的日志输出-->
    <logger name="org.springframework.web" additivity="false" level="WARN">
        <appender-ref ref="WARN"/>
    </logger>
    <!--dao层包下的类的日志输出-->
    <logger name="${mapper.package}" additivity="false" level="DEBUG">
        <appender-ref ref="app"/>
        <appender-ref ref="ERROR"/>
        <!--打印控制台-->
        <appender-ref ref="CONSOLE"/>
    </logger>


    <!-- root级别   DEBUG -->
    <root>
        <!-- 打印debug级别日志及以上级别日志 -->
        <level value="${log.level}"/>
        <!-- 控制台输出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 不管什么包下的日志都输出文件 -->
        <!--<appender-ref ref="ERROR"/>-->
        <!--<appender-ref ref="INFO"/>-->
        <!--<appender-ref ref="WARN"/>-->
        <!--<appender-ref ref="DEBUG"/>-->
        <!--<appender-ref ref="TRACE"/>-->
    </root>

</configuration>

3.使用

1.注入日志对象
java 复制代码
 private Logger loggerFactory = LoggerFactory.getLogger(AopTest.class);
2.@Slf4j注解

导入lombk包后,只用在类上面加@Slf4j注解,调用log对象使用

java 复制代码
log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warn");
        log.error("error");
相关推荐
许野平29 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
齐 飞2 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
狂放不羁霸2 小时前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
LunarCod2 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
计算机学长felix3 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
码农派大星。3 小时前
Spring Boot 配置文件
java·spring boot·后端
江深竹静,一苇以航3 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
杜杜的man4 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*4 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu4 小时前
Go语言结构体、方法与接口
开发语言·后端·golang