SpringBoot日志详解

简介: 日志是程序的重要组成部分,如果程序报错了,我们可以打开控制台看日志,来找到报错的原因。

1.日志及日志的作用


日志是程序的重要组成部分,如果程序报错了,我们可以打开控制台看日志,来找到报错的原因。


除了发现和定位问题之外,我们还可以通过日志实现以下功能。


  • 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
  • 记录系统的操作日志,方便数据恢复和定位操作人。
  • 记录程序的执行时间,方便为以后优化程序提供数据支持。

微信图片_20230111202932.png

如图所示,就是SpringBoot的日志打印。


2.自定义日志打印


完成自定义日志的打印需要以下两步:

1、在一个类中先获取到打印日志对象(日志框架提供日志对象,日志框架默认已经集成到SpringBoot中了)

2、使用日志对象提供的方法实现日志的打印


下边具体阐述:


2.1 得到日志对象


在程序中获取日志对象需要使用日志工厂LoggerFactory,如下代码所示:


@Controller
public class UserController {
    private static final Logger log= 
            LoggerFactory.getLogger(UserController.class);
}


日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、直观的定位到问题类。


注意:Logger对象是属于org.slf4j包下的,不要导错包


微信图片_20230111202925.png

因为SpringBoot中内置了日志框架Slf4j,所以咱们可以直接在程序中调用slf4j来输出日志。


2.2 使用日志对象打印日志


日志对象的打印方法有很多种,如下代码所示:


@Controller
@ResponseBody
public class UserController {
    //1.先得到日志对象(来自slf4j)
    private static final Logger log=
            LoggerFactory.getLogger(UserController.class);
    @RequestMapping("/sayhi")
    public void sayHi() {
        //2.使用日志对象提供的打印方法进行日志打印
        log.trace("我是trace");
        log.debug("我是debug");
        log.info("我是info");
        log.warn("我是warn");
        log.error("我是error");
    }
}


运行结果如下图:


微信图片_20230111202918.png

我们可以发现,我们调用了五个方法来进行打印的,但是控制台中只显示了三条我们的打印信息,这是因为有日志级别的约束,默认的日志级别是info级别,只能打印info及info以上的日志信息,日志级别的具体详情见下:


3.日志级别


3.1 日志级别有什么用?


日志级别可以帮你筛选出重要的信息,比如设置日志级别为error,那么就可以只看程序的报错日志了,对于普通的调式日志和业务日志就可以忽略了,从而节省开发者信息筛选的时间。

日志级别可以控制不同环境下,一个程序是否需要打印日志,如开发环境我们需要很详细的信息,而生产环境为了保证性能和安全性就会输入尽量少的日志,而通过日志的级别就可以实现此需求。


3.2 日志级别的分类


日志的级别如下:

1.trace:少许日志(级别最低)

2.debug:调试日志

3.info:普通信息日志(默认日志级别)

4.warn:警告日志

5.error:错误日志

6.fatal:致命的日志(系统输出的日志,不能自定义打印)


日志级别的顺序:


微信图片_20230111202915.png

3.3 日志级别的设置


日志级别配置只需要在配置文件中设置logging.level配置项即可,如下所示:


微信图片_20230111202911.png

再次打印日志信息看结果:


微信图片_20230111202907.png

可以发现这次的日志打印信息少了很多,这是因为全局的日志级别是warn,比warn级别低的日志信息不会被打印,而在controller包下设置的日志级别是trace,所以它的五条日志信息都进行了打印。


根据上边的日志打印结果我们可以得出结论:

当存在局部日志级别和全局日志级别时,当访问局部日志时,使用的是局部日志级别,也就是局部日志级别>全局日志级别


4.日志持久化


以上的日志都是打印在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。


想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名,SpringBoot就会将控制台的日志写到相应的目录或文件下了。


微信图片_20230111202903.png

注意\会引起转义,所以可以使用\\或者/来防止转义。

再次运行,可以看到日志信息已经被写到指定的文件中了。


微信图片_20230111202900.png

5.通过Lombok实现更简单的日志输出


我们每次都使用LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加一遍,也很麻烦,下边我们展示使用lombok来实现更简单的日志输出。

1.添加lombok框架支持

2.使用@slf4j注解输出日志


5.1 添加lombok依赖


我们可以先下载以下插件:


微信图片_20230111202855.png

然后在pom.xml文件中右键->generate->插件,将lombok依赖引入pom.xml配置文件中


微信图片_20230111202852.png

5.2 输出日志

1、使用@Slf4j得到日志对象log

2、使用log对象自定义打印日志


微信图片_20230111202848.png

5.3 lombok更多注解说明


基本注解:


微信图片_20230111202845.png

组合注解:


微信图片_20230111202841.png

日志注解:


微信图片_20230111202831.png


6.总结


日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot内置了日志框架,默认情况下使用的是info日志级别将日志输出到控制台的,我们可以通过lombok提供的@Slf4j注解和log对象快速的打印自定义日志,日志包含6个级别:


微信图片_20230111202826.png

日志级别依次提升,而日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
Java
SpringBoot 集成log4j2
SpringBoot 集成log4j2
SpringBoot 集成log4j2
|
2月前
|
XML Java 数据格式
【二十九】springboot整合logback实现日志管理
【二十九】springboot整合logback实现日志管理
147 1
|
10天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
15天前
|
Java 数据安全/隐私保护 开发者
【SpringBoot】讲清楚日志文件&&lombok
【SpringBoot】讲清楚日志文件&&lombok
22 5
|
1月前
|
XML Java 数据库连接
Springboot中使用日志框架
Springboot中使用日志框架
|
1月前
|
Java 程序员
SpringBoot集成log4j2出现Logback configuration error detected: current ElementPath is
SpringBoot集成log4j2出现Logback configuration error detected: current ElementPath is
35 0
|
2月前
|
XML Java 开发者
【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之SpringBoot整合众多日志管理系统服务starter-logging
【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之SpringBoot整合众多日志管理系统服务starter-logging
40 1
|
2月前
|
SQL NoSQL Java
【七】springboot整合AOP实现日志操作
【七】springboot整合AOP实现日志操作
46 0
QGS
|
4月前
|
Java 数据库连接 Apache
Springboot日志框架logback与log4j2
Springboot日志框架logback与log4j2
QGS
44 0
|
4月前
|
存储 监控 安全
【Spring】SpringBoot日志
【Spring】SpringBoot日志