SpringBoot中的日志框架

学习视频:拉钩教育

日志是什么?

日志是一个记录事件的组件,无论是记录运行情况还是追踪线上问题,都需要分析日志。

为什么需要日志框架?

场景演变:
1、最初时利用System.out.println("msg")来输出关键信息到控制台
2、当需要隐藏一些信息就需要手动注释掉代码
3、当关键信息不需要输出到控制台而是文件中,方便后续跟踪,则又需要统一修改代码
4、此时可以初步实现一个日志框架1.0版本
5、当需要日志记录不会阻塞程序的运行,或者统一归档,又或者按照时间来分类记录
6、此时需要开发一个日志框架2.0
7、同时需要替换原来的jar包,这就需要修改相关的API,这样每次更新都要频繁的修改API
8、借鉴JDBC和数据库驱动的思想,我们需要设计一个统一的接口API和不同的API实现,这样在不修改源代码的基础上只需更换API的实现jar包就可以更改底层实现逻辑

常见的日志框架

  1. 日志抽象层:JCL、SLF4J、jboss-logging
  2. 日志实现层:jul、log4j、logback、log4j2
    分析:
    jboss-logging-----对于特定框架来使用
    JCL-----已经不更新了
    jul-----功能不够强大
    log4j-----存在性能问题
    logback-----优化log4j新产生的实现
    log4j2-----功能强大,根据Slf4j+logback进行开发的项目(既规定了接口log4j-api又有实现log4j-core)

Spring框架默认使用JCL(Commmons logging)作为日志输出
SpringBoot采用的日志框架为:日志抽象层SLF4J + 具体实现logback

SLF4J的使用

SLF4J官方案例

首先导入SLF4J的jar包

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {

  public static void main(String[] args) {
    // 创建一个记录器,用来专门记录HelloWorld.class类的相关信息
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    // 日志输出 
    logger.info("Hello World");
  }
}

使用SLF4J结合不同的日志实现

  1. SLF4始终作为日志门面,绑定log4j和jul时需要引入适配工具 Adaptation layer,
  2. 每个日志实现框架都有自己的配置文件,所以在使用SLF4J之后还需要使用日志实现的配置文件。
    image

统一日志框架

在项目中会使用其他第三方框架,他们默认会引入其他的日志实现,导致项目中的日志实现jar包有多又乱,所以需要统一日志框架:

  1. 排除项目中其他日志框架
  2. 使用中间包替换排除的日志框架
  3. 引入需要统一的日志框架
    image

SpringBoot中默认是SLF4J+logback,已经完成其他日志框架的排除,比如:

通过<exclusions>和<exclusion>标签排除Commons-logging实现

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-console</artifactId>
    <version>${activemq.version}</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用

yaml中日志级别配置

日志级别:trace < debug < info(默认) < warn < error < fatal,低于设置日志级别的日志不会输出,若全局日志级别改成 trace,则系统所有的日志都能看到

logging:
  level:
    root:info # 没有指定日志级别的包会跟随根记录器的设置
    com.example.demo: trace #com.example.demo为包名
  • trace是最低优先级的日志,一般用来追踪详细的程序运行流,比如程序的运行过程中,运行到了哪一个方法,进入了哪一条分支。
public void method1(){
    log.trace("method1");
    ...
}
  • debug是比trace高一级别的日志,该级别的日志就是用来debug用的。这类日志往往用在判断是否有出现bug的场景,为了记录信息往往记录了代码运行的详细信息,比如方法调用传入的参数信息。
public void method2(int param){
    log.trace("method1");
    log.debug("param");
    ...
}
  • info比debug高一级别,用来记录程序运行的一些关键信息,它不像trace那样记录程序运行的整个流程,也不像debug那样为了解决问题而记录详细的信息。info记录的是整个系统的运行信息,比如系统运行到了哪一个阶段,到达了哪一个状态。
public void method3(){
    ...
    log.info("xxxx is ok!");
}
  • warn比info的级别更高,用来记录一些警告信息。警告信息表示,程序进入了一个特殊的状态,在该状态下程序可以继续运行,但是不建议让程序进入该状态,因为该状态可能导致结果出现问题。
public void method4(){
   ...
   if(出现不推荐的情况,但也可以使用){
   log.warn("warning msg!");
 }
}
  • error级别的日志是最高优先级了,用来记录运行时的错误信息,表示程序运行过程中出现了需要被解决的问题,往往是一些异常。使用error日志的时候,一般会将详细的异常出现的原因记录。
public void method5(){
    try{
      ...
    } catch(Exception e) {
      log.error(msg, e.getCause());
    }
}

yaml中日志输出格式

默认输出格式

2022-11-26 09:58:01.627  INFO 38324 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-11-26 09:58:01.627  INFO 38324 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 710 ms
2022-11-26 09:58:01.833  INFO 38324 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-11-26 09:58:01.839  INFO 38324 --- [           main] c.e.s.SpringbootDemoApplication          : Started SpringbootDemoApplication in 1.212 seconds (JVM running for 1.732)

即,指定控制台日志输出格式

logging:
  pattern:
    console:%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n

其中,关键字段有:

%d{yyyy-MM-dd HH:mm:ss.SSS}:日期

%-5level:日志级别

%thread:日志线程

%logger:日志输出的类名

%msg:日志输出内容

格式设置有:

%highlight():颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色

%15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 

%-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符

%n:换行符

yaml中日志输出路径

# 二者规定其一,若同时指定以第一种为准
logging:
  file:
    name:my.log # 在指定目录下生成自定义文件名文件
# 或者
logging:
  file:
    path:/var/log # 在指定目录下生成spring.log文件

指定日志文件的输出格式

logging:
  pattern:
    file:%d{yyyy-MM-dd HH:mm:ss.SSS} ==== %-5level ==== [%thread] ==== %logger{40} : %msg%n

SpringBoot替换日志框架

1、排除父依赖中的spring-boot-starter-logging
2、添加新的依赖

自定义日志配置文件 logback-spring.xml设置

看这里最全面

posted @   Anti-kill  阅读(1685)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示