Spring Boot 日志

Spring Boot 日志

​ 在 Spring Boot 里面是有一个内置了的日志框架的,所以才能运行的时候在控制台打印出来。默认情况下的日志是系统定义和打印的,但我们也可以自行自定义打印日志。

日志的好处:

1、发现问题和定位问题;☆(最常见,最实用)

2、记录用户的登录信息,方便大数据分析;

3、记录操作日志,方便追溯操作人;

4、记录方法的执行时间,方便后续程序的优化。

文章目录

一、日志打印

在程序中自定义日志

1.1、在程序中得到打印日志的对象

首先需要在程序中使用 日志工厂 LoggerFactory:

java 复制代码
private static Logger logger = LoggerFactory.getLogger(LoginController.class);

.getLogger() 里面是当前类,当前类.class

注意:在引用日志工厂的时候需要在 orj.slf4j 这个包下面导入,不要导入错包

使用 slf4j 框架说明:

​ 在 Spring Boot 中 slf4j 相当于一个门面,访问里面的日志实现首先需要通过门面这个渠道才能访问到后面的日志实现。就好比如日常生活需要网购,网购都需要借助平台才能具体的访问到商家进行购物,这里的 slf4j 是一个道理,只有进入 slf4j 这个包才能进行后面一下的操作,具体实现的日志是哪一个这个 Spring Boot 系统自动使用的,默认情况下使用的是 logback。

2.1、日志级别

​ 日志对象打印的方法有很多种,他们每一种都是有级别的,简单理解就是过滤掉冗余不需要的日志,可以自己自定义想看的日志类型方便排查问题,他们级别分别是:

​ 打印的日志内容也是从低到高,就比如说,打印的是 info 级别,那么info 级别->error 级别的日志都会打印出来,后面以此类推。

里面的 fatal 是调用不出来的,因为他直接是致命程序运行不了出现终断退出等现象,不是程序员可以调用的,这个方法是系统里面自己调用的

java 复制代码
@Controller
@ResponseBody
public class LoginController {

    private static Logger logger = LoggerFactory.getLogger(LoginController.class);

    //localhost:9090/login.html
    @RequestMapping("/login") // url 与前端的 ajax 参数 url 要一致
    public String login(String username, String password) { // SpringBoot可以直接传参自动获得request对象调用getparameter方法
        logger.trace("日志级别 trace");
        logger.debug("日志级别 debug");
        logger.info("日志级别 info");
        logger.warn("日志级别 warn");
        logger.error("日志级别 error");
    }
}

打印日志结果及日志格式说明:

​ 从日志结果信息来看,日志默认级别是 info ,只有info之后才有日志内容,

总结日志自定义打印:

1、使用 日志工厂 这个对象 LoggerFactory,导包是导 orj.slf4j 这个包;

2、根据这个对象调用方法,调用的方法有5种,就是这个日志级别

二、在配置里面配置日志 (日志使用)

​ 日志的级别配置,只需要在配置文件里面设置 logging.level 即可。

yaml 复制代码
# 配置日志
logging:
  level:
    root: error

这个代码表示,root 在这个项目属于根目录也就是说所有项目目录级别都是配置的 error级别。

yaml 复制代码
logging:
  level:
    root: error
    com:
      example:
        demo:
          controller: info

这个代码表示,在指定路径下的项目程序设置的日志是 info 级别;当 root 和 指定路径同时在的时候优先执行指定的目录。

三、日志持久化

​ 在控制台里面输出的是都不能长期保存,idea 一关日志就没了,但是在之后的生产环境中需要把日志长期保存下来,以便后续可以追溯问题,那么把日志保存下来的过程就叫做持久化。

在yml配置文件里配置日志文件的保存路径:

yaml 复制代码
# 配置日志
logging:
  file:
    path: E:\file # 日志保存路径

​ 这样他就可以在指定的目录生成日志文件了。Spring Boot 就会将控制台的日志写在相应的目录下。

yaml 复制代码
# 配置日志
logging:
  file:
    name: E:\file\spring Boot.log

​ 这是个文件设定名称,可以在保存日志的时候自定义名称,当有多个日志的时候,Spring Boot 它会自动在后面加上数字,非常的方便。

四、更简单的日志输出------lombok

​ Spring Boot 大多数都是可以用注解解决问题的,输出日志也是不例外,之前使用 日志工厂 LoggerFactory.getLogger(xxx.class) ,如果需要多个不同类的日志那么这样添加起来就很麻烦,这里就是用更简单的日志输出方式,使用lombok 提供的注解 @slf4jlog 对象快速的打印自定义日志。

1、首先添加 lombok 的依赖在 pom.xml 中

xml 复制代码
<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
</dependency>

2、使用注解 @Slf4j ,输出日志

java 复制代码
@Controller
@ResponseBody
@Slf4j
public class LoginController {

//    private static Logger logger = LoggerFactory.getLogger(LoginController.class);
    @RequestMapping("/login") 
    public String login(String username, String password) { 
        log.trace("日志级别 trace");
        log.debug("日志级别 debug");
        log.info("日志级别 info");
        log.warn("日志级别 warn");
        log.error("日志级别 error");
    }
}

​ 使用了注解就不必再使用日志工厂了,但是程序是使用的 log 对象进行输入日志,并且只有 log 对象才能输出,这是 lombok 提供的对象名。

五、lombok原理分析

​ lombok 的实现原理,它是在 java 整个程序中的编码阶段进行处理的

​ 它在编译的时候生成taget 目录,看看生成字节码的里面的代码

​ 这样就可以说明 lombok 在编译期间的时候把注解 @slf4j 给替换掉了,生成字节码文件的时候又自动把日志厂的对象给编译在代码中。这些都是因为 lombok 通过遵循 jdk 编译期增强的规范,实现了一个 java 源代码在生成字节码的时候的功能增强。其中就比如: @slf4j;@Setter/@Getter ...

lombok更多注解:

注解 作用
@Getter ⾃动添加 getter ⽅法
@Setter ⾃动添加 setter ⽅法
@ToString ⾃动添加 toString ⽅法
@EqualsAndHashCode ⾃动添加 equals 和 hashCode ⽅法
@NoArgsConstructor ⾃动添加⽆参构造⽅法
@AllArgsConstructor ⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull 属性不能为 null
@RequiredArgsConstructor ⾃动添加必需属性的构造⽅法,final + @NonNull 的 属性为必需

注解的组合:

注解 作用
@Data @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor +@NoArgsConstructor

日志注解:

注解 作用
@Slf4j 添加⼀个名为 log 的⽇志,使⽤ slf4j
相关推荐
计算机学姐1 分钟前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
救救孩子把17 分钟前
深入理解 Java 对象的内存布局
java
落落落sss20 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
万物皆字节25 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭32 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由39 分钟前
速成java记录(上)
java·速成
一直学习永不止步1 小时前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明1 小时前
面试知识储备-多线程
java·面试·职场和发展
Yvemil71 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节