日升时奋斗,日落时自省
目录
在了解日志之前,要有一定Spring Boot基础(可以先通过这两篇博客了解一下)
(11条消息) SpringBoot创建和使用_学习自省的博客-CSDN博客
(11条消息) Spring Boot配置文件_学习自省的博客-CSDN博客
首先要了解日志是干什么的,我们运行程序是不可少的,针对报错有着极好的处理措施
1、日志功能
<1>监控系统:通过记录系统运行状态,可以监控系统的性能、稳定性和可用性。例如,记录 CPU、内存、磁盘等指标,可以帮助管理员及时发现系统资源不足或瓶颈等问题。
<2>维护系统:通过记录错误信息,可以帮助开发人员定位和解决问题。例如,记录异常、崩溃、请求超时等错误,可以帮助开发人员快速找到问题所在,修复 bug 或进行代码优化。
<3>安全审计:通过记录用户操作,可以对用户的行为进行审计,保证系统的安全和合规性。例如,记录用户登录、操作时间、IP 地址、操作内容等信息,可以追踪用户的行为,防止账号被盗用或数据被篡改。
<4>性能分析:通过记录用户请求、响应时间等信息,可以分析系统性能瓶颈,进行性能优化。例如,记录请求的处理时间、数据库查询时间等指标,可以帮助开发人员找到系统的瓶颈,并进行针对性优化。
其实当我们开始启动Spring项目的时候就会看见日志的打印,这是spring boot系统进行打印的
这些都是日志,只不过是通过系统打印出来的,但是控制台打印问题还有很多疑问?
<1>Spring boot 内置日志框架,如何操作打印日志的
<2>默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志
<3>日志如果在控制台上打印只能是临时的,控制台不能保存,一旦项目关闭就不能保存,如何将日志永久保存下来(以下就针对这三个问题展开)
2、SpringBoot内置日志框架
springboot使用框架分为两个部分,日志门面和日志实现
日志门面:像是是一个中转站,中转之后会有多条路可以走
日志实现:就恰好是哪多条路,如果有一条路坍塌了,同样是可以选择另一条路
(以下有这么几种日志框架)
SLF4J (Simple Logging Facade for Java) - SLF4J是日志门面的鼻祖,它提供了一套标准、规范的API框架,使得开发者可以在不同的日志实现之间进行切换(避免了某个日志实现框架出现问题后程序瘫痪)。SLF4J的目标是提供一种简单易用的方式来访问不同的日志实现。(Spring Boot使用的也是SLF4J日志门面+logback日志实现)
事实上也是有根据的,Maven项目的目录中也的(了解)
日志门面:
日志实现:
3、日志打印
日志打印有多种方法,我们刚刚已经看见了日志打印的方式了,就是开篇控制打印的那一段,就是日志,简要的看到有时间,有内容
有的友友会想到System.out.println()方法也可以打印,只要加上时间内容就可以了,也能做到日志打印,同时也要显示该类的路径,确实可以做到简单的打印,最重要的一点就是不能持久化存储
3.1、日志格式说明
3.2、手动打印日志
slf4j提供只是一个接口,所以需要使用工厂方法来获取其中方法
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger log=LoggerFactory.getLogger(TestController.class);
@RequestMapping("/log")
public void sayhi(){
log.info("my first log");
}
}
经过路由进行访问以后就会打印日志:
4、日志级别
4.1、级别的作用
日志级别在日志记录中起着非常重要的作用。通过配置日志级别,可以控制日志信息的输出量,减少对系统性能的影响,同时也方便了日志的管理和分析。
主要作用:
<1>控制日志信息量:日志级别的设置可以帮助开发者控制日志信息的输出量,避免日志记录过多,导致系统性能受到影响。
<2>提高日志信息的可读性:根据不同的日志级别,可以使日志信息更加易于阅读和理解,从而帮助开发人员快速定位问题。
<3>方便日志的管理和分析:通过设置不同的日志级别,可以将日志信息分类,方便后续的日志管理和分析工作。
4.2、日志级别的分类和使用
日志级别分为:
<1>trace(最低级别):用于记录一些追踪信息,这些信息对用户来说不太有用,但对开发人员进行调试和问题定位非常有帮助。
<2>debug:用于记录程序中一些调试信息,用于调试和诊断程序的运行情况。
<3>info:用于输出程序运行过程中的一些正常信息,如程序启动的信息、业务处理成功的信息、用户请求的响应等。
<4>warn:用于记录警告信息,通常表示某个地方出现了不符合预期的情况,但程序仍能正常运行。
<5>error:用于记录错误信息,表示程序运行出现了错误或异常,需要开发人员进行问题定位和修复。
<6>fatal(最高级别):用于记录非常严重的错误信息,例如程序崩溃或不可恢复的故障(该级别是系统自己处理了,我们在程序中也设定不了)。
注:前五种是可以设置,最后一种级别是不能设置的
针对这五种级别的顺序
注:级别设置越高接收的消息就越少,例如:设置了warn级别就只能接收到warn、error。fatal级别的日志
4.3、日志打印
4.3.1、类进行日志打印
这里就尝试打印各种级别的日志看看效果:
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger log=LoggerFactory.getLogger(TestController.class);
@RequestMapping("/log")
public void sayhi(){
log.trace("my first log trace");
log.debug("my first log debug");
log.info("my first log info");
log.warn("my first log warn");
log.error("my first log error");
}
}
运行结果(访问路由后的打印结果):
这里只有三条日志打印,系统本身日志级别就时INFO,所以这里只能接受到INFO以上级别的日志
4.3.2、类名进行日志打印
这里只需要修改getLogger方法参数(类名)
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger log=LoggerFactory.getLogger("TestController");
@RequestMapping("/log")
public void sayhi(){
log.trace("my first log trace");
log.debug("my first log debug");
log.info("my first log info");
log.warn("my first log warn");
log.error("my first log error");
}
}
访问路由后的运行结果:
注:这里推荐使用类 来获取日志级别,避免不同包下有相同类名 产生日志混淆
4.4、配置文件设置级别
日志不仅仅是打印时可以设置,在没有设置的情况下打印日志都是INFO级别及其以上级别,配置文件中也可以设置日志级别
例如:我们不想看见报错以外的级别(配置文件中设置,这里是在yml配置文件中设置)
logging:
level:
root: error
注:root表示根目录
启动结果如下:(级别低于ERROR的都不会再出现)
默认日志输出级别:日志输出级别默认是INFO级别
5、日志持久化
日志持久化是指将日志信息存储到永久性的数据存储介质中,以便后续进行查询、分析和审计等工作(这里只是简单介绍了两种存储方式,主要以文件的形式进行存储演示,当然不止于这两种方式)
<1>文件存储:将日志记录到本地文件系统中,这是最常见的一种日志持久化方式。在应用程序中,可以通过配置日志框架将日志信息输出到指定的日志文件中,并设置日志文件的大小和数量等参数
<2>数据库存储:将日志记录到数据库中,这种方式可以使得日志信息更加灵活地进行管理和查询。在实际应用中,通常使用关系型数据库(如MySQL、Oracle)或非关系型数据库(如MongoDB、Redis)来存储日志信息
此处想要将日志进行持久化,只需要在配置文件中指定日志存储目录或者指定日志保存文件名之后,Spring Boot就会将控制台的日志写到相应的目录或文件下
5.1、配置文件设置日志保存路径
这里可以不用设置 文件名,配置文件会自己给,也可以自己设置,在路径后面加上文件即可
这里我们设定了日志打印的级别,不需要把基本信息都打印进去
logging:
level:
root: error
file:
path: D:\\javaSpring
运行结果:
试问:如果再次重新项目进行访问,会不会覆盖掉原来的内容??
答案:不会
5.2、配置日志文件的文件名
设置文件名:
logging:
level:
root: error
file:
name: D:\\javaSpring\\spring-fist-csdn.log #后面这部分就是文件名
运行结果:
5.3、文件大小设置
日志文件内容会叠加,但是叠加多了也不好,如果以个1G进行加载也不会很快把,并且也不放变,所以在开始的时候就已经规定了日志文件大小不能超过10MB(可以去配置文件中看)
注:上面注释到log文件最大也就是10MB,当然这些都是可以设置的,如果你觉得还是很大的话,可以自己设置1MB,5MB等等,
6、简洁日志输出(lombok)
每次都是使用工厂类比较繁琐,且每个类都添加一遍,能简化就简化,一种更简单更好用的日志输出方式,使用lombok来更简单的输出
<1>添加lombok框架支持
<2>使用@slf4j注解输出日志
6.1、添加lombok依赖
lombok直接添加依赖,此处再开始的时候就已经把lombok依赖添加进来了,如果在开始没有添加的话(如下操作)
一种方式就是:mvn,在mvn中央仓库,搜索lombok,找到对应的依赖
网址输入:mvn 搜索lombok找到以下对应依赖,引入即可和maven项目相同
另一种方法就是:下载一个插件EditStarters
File -> Settings -> plugins
搜索插件名称EditStarters ,安装插件(并勾选)
使用方式:
6.2、输出日志
lombok提供的Slf4j注解输出日志:
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
@RequestMapping("/log")
public void sayhi(){
log.trace("my first log trace");
log.debug("my first log debug");
log.info("my first log info");
log.warn("my first log warn");
log.error("my first log error");
}
}
注:这里定义日志属性为log(下面解释原因),访问路由后运行结果与原来无异
6.3、lombok日志原理
lombok能够打印日志的原因就在target目录中,target目录为项目的最终执行代码,查看target目录
项目启动后,经过路由访问target会记录最终结果(这里我的日志是写在TestController类中的)
双击后就能看见生成点class文件的原貌了
其他的什么都没有变,只是Slf4j注解消失了,取而代之的是我们最开始输入的一行日志获取代码,属性定义为log,所以刚刚的代码能直接使用log打印不同日志级别
java程序运行过程:
过程简单的要走这几个步骤;
java用户代码 -> .class文件 -> (加载、运行)JVM
Lombok的作用在哪里生效:
(java用户代码+Lombok) -> .class文件 -> (加载、运行)JVM
java用户代码生成时此时里面就包含了lombok提供的注解,通过编译成.class字节码的时候,注解也就进行编译了,转换成了,我们刚刚看见那一行代码,最后在交给JVM处理