• Spring Boot 日志文件


    前言

            本篇博客主要介绍自定义的日志打印、日志的级别高低、如何保存日志等等.....

    一、日志是什么?日志有什么用?

    日志就是我们控制台上输出的内容,控制台上的输出的信息就是日志信息,如下所示:

    日志有什么用?

            日志最大的作用就是可以定位和发现问题;除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:

    记录⽤户登录⽇志⽅便分析⽤户是正常登录还是恶意破解⽤户

    记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。

    记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。

    以上就是⽇志的一些主要功能。

    二、自定义日志打印

    2.1、能否使用System.out.print来打印日志?

            前面我们说过,日志就是输出在控制台的信息,那么我们自定义日志打印是不是就是直接使用System.out.print来输出信息到控制台呢?我们先来看一下日志包含的各个信息,再来说是否可以直接使用System.out.print来输出。

    日志的格式说明: 

            通过这个我们可以看出,打印的日志信息中,时间、打印日志所在的类、日志的具体信息,这些我们都可以在System.out.print中直接输出,但是日志的级别,我们是无法获取的,日志级别也是很重要的,可以在我们排查问题的时候,可以根据日志级别来更快的找到我们所要的信息的。

            还有一点很重要的是,System.out.print打印的信息无法持久化的保存。因此,我们使用System.out.print来打印日志是不合适的。

    2.2、使用Logger对象打印日志

            首先我们要在程序中获取⽇志对象需要使⽤⽇志⼯⼚LoggerFactory。接着再通过日志对象打印日志。

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

    接下来我们用代码来演示一下:

    这里一定得选择slf4j这个包下的Logger类;

    到了这里之后,这里会出现两个getLogger方法,这两个方法的区别在于:

    一个是传入一个类对象,一个是直接传一个字符串;

    传递这个的意义就在于在打印日志时,输出的类所在的位置,当我们传入的是一个字符串时,打印出来的效果就是我们自己设置的位置当我们传入当前类对象的时候,打印出来的效果就是这个类所在的具体位置,从包名到类名,十分详细。因此,这里建议传入一个类对象。

    打印日志代码:

    1. package com.example.bloglog.controller;
    2. import org.slf4j.Logger;
    3. import org.slf4j.LoggerFactory;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. @RestController
    8. public class TestController {
    9. private static final Logger log = LoggerFactory.getLogger(TestController.class);
    10. @RequestMapping("/sayhi")
    11. public String sayHi(){
    12. log.trace("trace日志");
    13. log.debug("debug日志");
    14. log.info("info日志");
    15. log.warn("warn日志");
    16. log.error("error日志");
    17. return "hello";
    18. }
    19. }

    运行结果: 

            以上代码就是最基本的自定义日志打印的代码了,但是这里我们预计是输出五个日志都打印,但是这里只打印了后面的三个日志;这里就涉及到日志级别及日志级别的问题了。

    三、日志级别 

    日志总的来说:可以分为六个级别,分别是:

    trace:微量,少许的意思,级别最低;

    debug:需要调试时候的关键信息打印;

    info:普通的打印信息(默认⽇志级别);

    warn:警告,不影响使⽤,但需要注意的问题;

    error:错误信息,级别较⾼的错误⽇志信息;

    fatal:致命的,因为代码异常导致程序退出执⾏的事件。

    日志级从高到底排序图: 

    日志默认级别的设置:如下所示:只需要设置logging.level,root=xxx(设置日志级别)即可

            以下代码我们是设置了日志级别为trace,代表的就是trace及以上的日志就会输出,如果不设置的话,默认的日志级别就是info,只有大于等于info级别的日志才会输出。

    四、日志持久化保存 

            我们在生产环境上的日志是需要保存下来的,因为一旦在生产环境下出现了什么问题,我们才可以通过日志来进行分析问题,进而才能更快更好的解决问题。

            日志的持久化保存我们需要设置的东西有两个,一个是日志文件的名称,一个是日志文件的保存位置。

    4.1、使用logging.file.path设置日志路径

    对于设置日志的保存位置及日志的名称,我们需要在配置文件中进行设置,设置的代码如下:

            使用logging.file.path设置来保存的路径,但是这个方法设置不了日志的文件名,只能设置日志保存的位置;运行之后产生的日志文件如下所示:默认的日志文件名就是spring.log

            

    4.2、使用logging.file.name设置日志保存位置及名称 

            我们还可以使用logging.file.name来设置,使用这个方法设置我们不仅可以设置日志的保存位置,还可以设置日志名称。设置代码如下所示:

    运行后产生的文件如下:这时候我们就可以设置日志名称和位置了

            当我们使用logging.file.name设置了日志文件名称之后,不设置保存路径,默认会保存到当前项目的路径下。如下所示:

    4.3、能不能使用logging.file.path设置日志保存位置再使用logging.file.name来设置日志保存名称?

            答案是:不可以,因为当这两个属性一起出现时,会以logging.file.name为主,就不会再去看logging.file.path的设置了,如果这时候logging.file.name中没设置路径的话,就会直接保存到当前项目的路径下。如下所示:

    4.4、关于 logging.file.path与logging.file.name的总结

    对于logging.file.name和logging.file.path的使用我们只需要记住以下三点规则:

    1.logging.file.path只能设置日志保存的位置,不能设置日志保存名称;

    2.logging.file.name既可以设置日志保存位置+名称,但是不能单独设置日志保存的位置;

    3.当logging.file.name和logging.file.path一起使用时,会以logging.file.name的设置为主,logging.file.path中的设置不生效。

            还有一个需要特别注意的就是:当我们只使用了logging.file.name并且只设置了日志的保存位置时,没有设置日志的名称时,即使这时候也使用logging.file.path设置路径了,日志都是不会保存的!!!如下所示:

    五、使用Lombok更简单的打印日志

            我们前面的自定义日志输出,需要在每一个类中都去从日志工厂获取一个日志对象,而且在选择LoggerFactory的时候还需要特别注意,一不小心就会选错,选成其他包下面的,因此这还是比较麻烦的。这里我们就可以直接使用Lombok来获取日志对象,这样子不仅不容易出错,而且还更简单。代码如下所示:

    至于如何在IDEA中安装使用Lombok,可以看这篇博客☞ Spring执行流程及Bean的作用域与生命周期_小白学编程~的博客-CSDN博客

  • 相关阅读:
    设计模式:组合模式
    Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业
    软件工程与计算总结(五)软件需求基础
    多玩家“角力”会议平板
    _kbhit函数详解
    图解系统:
    SMT32F767通过STM32CUBE HAL库配置QSPI和W25Q256驱动
    游戏工作时d3dcompiler_47.dll缺失怎么修复?5种修复方法分享
    静态共享代理和静态独享有哪些区别?怎么选择?
    使用JSON字符串生成Java实体类
  • 原文地址:https://blog.csdn.net/m0_64986499/article/details/132794613