站长工具最近查询,外贸流程是什么,国外网站模板,金本网站建设设计写在前面 Hello大家好#xff0c;今日是2024年的第一天#xff0c;祝大家元旦快乐#x1f389; 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用#xff1f;三、日志怎么用#xff1f;四、自定义日志打印#x1f4ac; 常见日志框架说明4.1 在程序…写在前面 Hello大家好今日是2024年的第一天祝大家元旦快乐 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用三、日志怎么用四、自定义日志打印 常见日志框架说明4.1 在程序中得到⽇志对象【Logger】4.2 使⽤⽇志对象打印⽇志4.3 ⽇志格式解读 五、日志级别5.1 日志级别的作用5.3 日志级别分类和使用 六、日志持久化【将日志保存下来】6.1 设置日志的保存路径6.2 配置⽇志⽂件的⽂件名 七、更简单的⽇志输出 — lombok7.1 添加 lombok 依赖7.2 使用 slf4j 输出日志7.3 lombok 原理解释7.4 lombok 更多注解说明 八、总结与提炼 一、前言 在我们日常的公司开发中难免都会存在着大大小小的BUG不可能会有公司说我们的项目做出来是没有BUG的那既然或多或少会BUG的话要如何去发现BUG呢 那对于我们程序员来说首先会想到的就是DeBug调试有关IDEA的一些调试技巧读者可以看看和这个视频 链接但是除了调试之外其实我们还有其他的方法既然我们在学习SpringBoot的话那就要知道它里面其实有个东西叫做 日志文件对于【日志】来说相信对大部分的开发者来说也是不陌生的因为我们日常的开发中如果遇到一些问题的话其实第一时间就会去查找日志因为有些错误仅仅通过调试是排查不出来的甚至是专业的排查工具也做不到但是【日志】却记录了很多程序运行过程中的种种细节 接下去就让我们来看看日志到底是个什么东西
二、日志有什么用 记录错误日志和警告日志发现和定位问题: 在交了钱之后却没有这位同学的记录了后期只能靠错误日志去排查 记录用户的登录日志 通过记录同学们的登录时间教务系统更新的时间如果发现有恶意的用户就将其IP加入到黑名单中 记录系统的操作日志 比方说在教务系统不小心将一个同学的班级转错了那就需要操作日志来进行数据恢复还可以通过这个操作日志才定位到操作人是谁误操作了防止推卸责任 程序执行日志
三、日志怎么用 Spring Boot 项⽬在启动的时候默认就有⽇志输出如下图所示 那有同学就会说既然都有日志了为什么还要再去学习呢 此时我便提出了以下几个问题 既然SpringBoot已经内置了日志那就要去明白它内置的日志究竟是什么默认情况下输出的⽇志并⾮是开发者定义和打印的那开发者怎么在程序中⾃定义打印⽇志呢⽇志默认是打印在控制台上的⽽控制台的⽇志是不能被保存的那么怎么把⽇志永久的保存下来呢既然它已经内置了日志框架了那这个框架应该怎么用
下⾯我们⼀起来找寻这些问题的答案
四、自定义日志打印 有的同学认为我们日常在写代码时使用 System.out.println()输出的内容就是日志那我们可以用这个方法来打印看看 RequestMapping(/sayhi)
public String sayHi(){System.out.println(打印日志);return hello world - myconfig;
}可以看到只是在这个方法调用之后打印了对应的语句但是这却不是我们想要看到的相关程序信息 那么接下来我来介绍如何通过得到日志对象来打印日志 常见日志框架说明 在这之前呢我们要先来聊聊前面所提到的【日志框架】首先你要知道的一点是SpringBoot是内置了日志框架的 我们可以来讲讲用户获取日志的调用流程 用户在去写日志的时候不是直接具体去操作某个框架的而是会先来到一个 日志门面 叫做Slf4j然后Slf4j再根据系统的配置决定要调用的具体框架是什么
这个Slf4j呢就类似于 房产中介我们在买房的时候不可能一家家地去找而是通过房产中介来进行对接以此可以看到不同的户型 我们在最早的时候使用这个log4j 1 是比较多的后面就慢慢升级成log4j 2了
⚠ 注意在去年log4j 被报出了漏洞而且漏洞很严重它可以通过这个漏洞直接把你的应用服务给关掉。那这个其实对许多公司来说是很大的一个问题这里的话就不细讲了有兴趣的同学可以去了解一下 链接 所以到后面我们都换成了logback这个日志框架了它就有人维护比较稳定一些不过它的写法就不太一样了类名、方法名都不一样了所以我们直接去对接这个框架的话成本是非常高的但如果此时我们有了Slf4j这个门面就不一样了 就和我们之前在讲解 JDBC连接数据库 的时候一样为什么要有JDBC呢就是因为不同的数据库有不同的驱动如果当一个项目突然要换数据库的话MySQL — Oracle就会很麻烦了。所以我们才有了JDBC这个东西程序员直接去操作JDBC就可以了它就是一套规范就是一个【门面】程序员们通过JDBC去适配不同的数据库就可以做到很好地解耦了 我们也可以去验证一下SpringBoot是否真的内置了这两个框架那可以观察到确实是有的 4.1 在程序中得到⽇志对象【Logger】 在大致了解了SpringBoot中内置的框架后我们就可以去试试看要如何获取到当前程序的日志 ⭐不过对于个日志对象的定义可以非常有讲究的
首先要明白我们这个日志对象是 方法级别只能在某一个方法中去使用类级别可以在整个类的任何地方都能使用 那可以很清楚地知道我们和这个日志对象一定是类级别的因为要在整个类的任何方法都能获取到
那还要看的是这个日志对象是共有的还是私有的那可以很明确每个类都有自己的日志对象所以它肯定是私有的所以要用private来进行修饰并且这个还得是 静态的让其可以在方法中直接调用那么就要用static来进行修饰还有一点你期望这个日志对象在某个方法中被修改吗当然不想所以我们还要再加上final关键字作为修饰 那么再加上一步步的修饰后我们就要通过Slf4j所提供的接口去新建出一个日志对象了注意在这里我们要选择org.slf4j这个包下的不要导⼊错包 那我们知道对于一个接口来说是我们在获取⽇志对象还需要使⽤⽇志⼯⼚ LoggerFactory然后使用到里面的getLogger这个方法这里一共有两种重写方法我们先选择Class? clazz
以下是它的源码我们后面通过查看打印出来日志的形式来进行观察
public static Logger getLogger(Class? clazz) {Logger logger getLogger(clazz.getName());if (DETECT_LOGGER_NAME_MISMATCH) {Class? autoComputedCallingClass Util.getCallingClass();if (autoComputedCallingClass ! null nonMatchingClasses(clazz, autoComputedCallingClass)) {Util.report(String.format(Detected logger name mismatch. Given name: \%s\; computed name: \%s\., logger.getName(), autoComputedCallingClass.getName()));Util.report(See https://www.slf4j.org/codes.html#loggerNameMismatch for an explanation);}}return logger;
}4.2 使⽤⽇志对象打印⽇志
接下去我们就将这个日志对象给打印出来吧
// 打印日志
logger.trace(test2 trace);
logger.debug(test2 debug);
logger.info(test2 info);
logger.warn(test2 warn);
logger.error(test2 error);通过运行并访问路由我们可以发现当前程序的日志信息被打印出来了但是呢却不是从trace开始打印的而是从info开始打印的这个的话就要追溯到 日志等级的优先级 和 默认级别 了这个我们在下一模块会展开详细讲解 4.3 ⽇志格式解读 看到了打印出来的日志信息后相信有很多读者并不是很了解每一条日志信息到底想告诉我们什么现在就让我们来分析一下这些日志信息吧 这里我们主要来关注两块地方 第一个是这边的包名你是否觉得c.e.controller这个名称有点熟悉呢没错它就是我们在这个包下创建类的时候自动导入的包名前面两个c和e即为缩写 package com.example.demo.controller;第二块的话就是后面的类名Test2Controller了这个的话就要去回忆我们上面为 工厂类LoggerFactory 中的getLogger这个方法所传入的当前类类名所以SpringBoot靠着这些很好地识别到并打印出了相应的日志信息 还记得我们在上面所谈到的getLogger这个方法的第二种形式吗我们一起再来看看 此时我们再创建一个类然后采取不同的getLogger方法 以下是具体的测试代码
RestController // Controller ResponseBody
public class StudentController {private static final Logger logger LoggerFactory.getLogger(StudentController);RequestMapping(/stu/sayhi)public String sayhi(){logger.info(student info);logger.error(student error);return student sayhi;}
}然后我们来观察一下结果并与之前的方法进行一个对比就可以发现所打印出来的日志信息有着很大的不同对于传入name来说所并不会展现出完整的包名路径而是只有一个类名所以想看到怎么样的日志信息读者可以自己来进行控制 以下是它的源码供阅读参考
public static Logger getLogger(String name) {ILoggerFactory iLoggerFactory getILoggerFactory();return iLoggerFactory.getLogger(name);
}五、日志级别 整体地介绍完日志消息后我们再来详细地介绍一下其中的一个东西叫做【日志级别】 5.1 日志级别的作用
⽇志级别可以帮你筛选出重要的信息⽐如设置⽇志级别为 error那么就可以只看程序的报错⽇志了对于普通的调试⽇志和业务⽇志就可以忽略了从⽽节省开发者信息筛选的时间。⽇志级别可以控制不同环境下⼀个程序是否需要打印⽇志如【开发环境】我们需要很详细的信息⽽【⽣产环境】为了保证性能和安全性就会输⼊尽量少的⽇志⽽通过⽇志的级别就可以实现此需求。
5.3 日志级别分类和使用 trace微量少许的意思级别最低 debug需要调试时候的关键信息打印 info普通的打印信息默认⽇志级别 warn警告不影响使⽤但需要注意的问题 error错误信息级别较⾼的错误⽇志信息 fatal致命的因为代码异常导致程序退出执⾏的事件。
⽇志级别的顺序 级别越高所能接收到的消息就越少了比如说error只能接收到error和fatal级别的日志 清楚各个日志级别后我们就来配置文件中实际地来操作一下吧 ⽇志级别配置只需要在配置⽂件中设置“logging.level”配置项即可如下所示
# 日志级别设置
logging:level:root: error然后我们通过去访问不同的路由地址就可以看到即使我们选择打印不同的日志级别但是打印出来的内容只有error 我们还可以做进一步更加严格的设置只打印我们当前项目中controller层中的所触发的日志信息
# 日志级别设置
logging:level:root: errorcom:example:demo:controller: trace先把项目重启一下我们可以看到任何多余的日志都没有看到就等待我们去访问 接着去访问一下就可以看到打印出来了相关的日志信息而且很干净并没有任何杂志 所以在学习了日志级别后我们就可以清除掉配置⽂件中的原先⽇志设置从而随心地去控制日志的打印内容
六、日志持久化【将日志保存下来】 以上的⽇志都是直接输出在控制台上的然⽽在⽣产环境上咱们需要将⽇志保存下来以便出现问题之后追溯问题把⽇志保存下来的过程就叫做【持久化】 想要将⽇志进⾏持久化只需要在配置⽂件中 指定⽇志的存储⽬录 或者是 指定⽇志保存⽂件名 之后Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了
6.1 设置日志的保存路径
首先我们来看看如何设置日志的保存路径这里在对于路径的设置要注意以下两点 尽量不要将保存的路径写在系统盘路径中不要出现中文和空格 比方说我现在将日志文件的输出路径放到了D盘下的home文件夹下
# 日志保存路径
logging:file:path: D:\\home然后我们将项目重启并访问相关路由就可以看到名为spring.log的文件就出现了点进去一看确实出现了我们上面在控制台中所出现的日志信息 我们来看看几位同学的问题(・∀・(・∀・(・∀・*) 那有同学就说那在项目重启之后会不会丢失呢 答案是不会的。日志文件一旦产生那么日志文件及其内容就会永久得保存不会出现文件或内容的丢失无论任何操作都会保持以上的特性 那在重启项目后再去运行存储的日志会不会将之前的日志覆盖掉呢 答案是不会的。对于日志的记录是一个append追加的过程而不会产生一个覆盖的现象
我们可以将项目重启后再来访问一下看看便可以观察到上一次的日志信息确实还存留并且追加上了这一次的日志信息 如果一直像上面那样追加如果文件变得越来越大怎么办呢 这个不需要担心有最大文件大小限制如果超过了的话就会重新去创建一个可以看 Spring的官方文档 6.2 配置⽇志⽂件的⽂件名 那么除了可以设置日志的保存路径外呢我们还可以去配置⽇志⽂件的⽂件名可以不用系统默认的自己也可以起名哦~ 比方说我在这里将名字取为springboot.log不过要记得取名字的同时也要带上路径哦否则就就无法输出到指定的路径了就会直接保存在当前项目中
# 日志保存名称
logging:file:name: D:\\home\\springboot.log来运行一下看看确实可以看到出现了一个名为springboot.log的文件 那这个时候又有同学问了什么东西都存在文件里万一系统被入侵了文件不是很容易丢失吗 这个问题问得很好 在公司中做大项目的时候我们并不是所有的日志信息都放在文件中对于有些文件我们则是选择存放在【数据库】 中 对于生产级别日志分类 —— 根据业务场景来定 程序运行日志存放在文件中 属于边缘性的东西简单看一下 业务日志存放到数据库中 记录系统关键操作的关键人以及其修改前后的操作 【综合练习】将 controller 包下 error 级别以上的⽇志保存到 log_all.log 下将 service 下warn 级别以上的⽇志保存到 log_all.log 下
七、更简单的⽇志输出 — lombok 每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐且每个类都添加⼀遍也很麻烦这⾥讲⼀种更好⽤的⽇志输出⽅式使⽤ lombok 来更简单的输出。 7.1 添加 lombok 依赖
首先我们要在IDEA中去安装一个插件叫做EditStarters 接下去就要在pom.xml依赖文件中通过这个插件去生成相关的lombok依赖
然后在文件中就会多出来以下依赖了
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency7.2 使用 slf4j 输出日志
有了依赖的支持接下去我们就可以通过 slf4j 这个注解去代替前面繁琐的日志对象创建过程了这个注解会给当前的类提供一个log对象使用这个对象就可以去调用对应日志级别了 RequestMapping(/log/sayhi)
public String sayhi(){log.info(info log);log.warn(warn log);log.error(error log);return log sayhi;
}然后我们来运行一下试试便可以观察到与前面获取到的日志信息是一样的~ 7.3 lombok 原理解释 但是光这样子是不够的我们要做到的是 知其然知其所以然。对于lombok 来说它呢是编译期间的一个框架 通过我们之前的学习可以知道对于一个普通的Java程序来说当用户写好代码之后进行编译然后生成一个.class为后缀的字节码文件将其放到JVM虚拟机上去运行就可以让程序跑起来了 但是对于lombok框架支持后它就会与普通的java程序一同进行编译然后生成.class为后缀的字节码文件 那怎么去证实呢我们一起来看看 首先我们在启动项目后到target文件中去进行查看然后打开内部的controller文件 在其内部我们看到了编译好的.class为后缀的字节码文件将其拖入到IDEA中观察一下 将编译前后的文件进行对比我们可以发现因为Slf4j注解的缘故出现了我们在前面所学习的Logger接口所新建出来的对象不过这里叫做log 那其实我们就看得很明确了其实 lombok 的这个注解所做的工作其实就是在做生成日志对象的转换工作这就是为何说 Spring面向注解开发 的原因了 7.4 lombok 更多注解说明 当然lombok 这个框架可不知那么一个注解它的功能还是很强大的其中的很多注解都可以帮助我们快速地去进行开发 基本注解
注解作用Getter⾃动添加 getter ⽅法Setter⾃动添加 setter ⽅法ToString⾃动添加 toString⽅法EqualsAndHashCode⾃动添加 equals 和 hashCode ⽅法NoArgsConstructor⾃动添加⽆参构造⽅法AllArgsConstructor⾃动添加全属性构造⽅法顺序按照属性的定义顺序NonNull属性不能为 nullRequiredArgsConstructor⾃动添加必需属性的构造⽅法final NonNull 的属性为必需
组合注解
注解作用DataGetter Setter ToString EqualsAndHashCode RequiredArgsConstructor NoArgsConstructor
⽇志注解
注解作用Slf4j添加⼀个名为 log 的⽇志使⽤ slf4j
八、总结与提炼 接下去来总结一下本文所学习的内容 首先我们简单地来聊了聊日志是什么⽇志是程序中的重要组成部分使⽤⽇志可以快速的发现和定位问题SpringBoot 内容了⽇志框架SLF4J 与 logback 是我们最常用的两个其二者通过 SLF4J 这个日志门面可以实现很好的解耦方便后期的替换维护与我们之前所讲的 JDBC 有着异曲同工之妙然后我们又讲到了如何去获取日志对象在这一块首先我们讲到了使用一个 工厂类LoggerFactory 去实现Logger接口然后通过调用其中的方法并传入对应的参数来获取到对应的日志对象接着再通过这个对象去调用【日志级别】来进行输出然后我们便详细地说到了【日志级别】其包含 6 个级别 trace微量少许的意思级别最低debug需要调试时候的关键信息打印info普通的打印信息⭐默认⽇志级别⭐warn警告不影响使⽤但需要注意的问题error错误信息级别较⾼的错误⽇志信息fatal致命的因为代码异常导致程序退出执⾏的事件。 然后呢我们又学了什么是日志持久化 通过去设置 日志的保存路径 以及 ⽇志⽂件的⽂件名 便可以控制我们所观察到的日志信息最后呢我们又学了一个很棒的框架 它叫做 lombok通过 lombok 提供的 Slf4j 注解和 log 对象我们可以实现快速的打印⾃定义⽇志当然我们还去好好地探究了一番这个注解究竟怎么一回事做到了 “知其然知其所以然” 以上就是本文要介绍的所有内容诚挚感谢您对本文的观看