JavaEE进阶 - Spring Boot 日志文件 - 细节狂魔
异常:This application has no explicit mapping for /error, so you are seeing this as a fallback解决方法
⽇志有什么⽤?
⽇志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?
答案是否定的,写程序不是买彩票,不能完全靠猜,因此⽇志对于我们来说,最主要的⽤途就是排除和定位问题。
这就跟去医院看病一样,医生听了你的病情描述后,先定位一个方向,然后就让你做一些检查,来进一步确认他的猜想,从而锁定病情。
日志就像医生教你去做的检查,通过 这些 “检查的结果(日志)”来锁定病因(代码异常位置)。
除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:
1、记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。
假设有一个平台,一天被登录了10万次,登录日志暴增!
正常情况下,可能一天 ,顶多1 万多点。
但是,此时我们发现这一天的登录日志暴增,并且查到有好几个账号,在这一天里登录上万次!这还需要想嘛?肯定有人对着几个账号进行了暴力破解!(盗号)
我们马上就可以对其进行冻结操作,让真正的用户修改密码信息后,才能恢复正常使用。
甚至说:直接拉黑名单。
2、记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。
试想一下:当某个人在某个时间段进行了一次错误操作,而操作日志会把这个操作的具体信息给记录下来了(操作人,操作时间,执行的操作,数据改动的前后状态)。
此时,我们就可以根据这个日志,锁定 执行该操作的人(bb 他一顿),让其 对 操作数据 进行 回滚(还原) 操作【根据日志的记录】。
3、记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。’
你可以理解为:日志,记录了每一个方法的执行时间(在一个统一的地方记录)。
就是说:记录每一个方法之前,我们先做一个拦截,每一个方法执行之后,再做一个拦截。
这样我们就能记录每一个方法的执行时间了。
那么,记录方法的执行时间有什么作用呢?
可以方便我们以后 对 程序进行针对性的优化。
公司里面的 主管/经理,每周都会做一件事:按照方法执行时间来对日志进行排序。
将执行时间最长的 前十个方法,挑出来进行优化。
要想进行优化,没有日志,你怎么知道哪些方法的运行时间很长。
更别提对这些方法进行优化,提升执行效率。
提升用户的体验感,等于 “痴人说梦”。
以上这些都是⽇志提供的⾮常实⽤的功能!!!
发现和定位问题,是日志 的 “ 程序属性 ”;记录⽤户登录⽇志,记录系统的操作⽇志,记录程序的执⾏时间,是日志的“业务属性”。
这两种“属性”加一块,才是 日志 的用途(作用)。
常⻅的⽇志框架说明(了解)
项目结构
注意:controller层要和Springboot3Application平级,否则地址栏访问不到
UserController
package com.example.springlog.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@Controller
@ResponseBody
public class UserController {
private final static Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping("/sayhi")
public String sayHi() {
logger.trace("我是trace");
logger.debug("我是debug");
logger.info("我是info");
logger.warn("我是warn");
logger.error("我是error");
return "hello springboot3";
}
}
注意:pom中java版本有17改为1.8,否则报错
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- <version>2.7.2</version>-->
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springlog</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot3</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
注意:此设置将trace,debug级别的日志也打印出来,默认只打印info,warn,error级别的
application.properties
logging.level.root = trace
在控制台输出日志
启动项目,访问地址
http://localhost:8080/sayhi
注意:要访问地址后才会打印我是info这些
默认打印的日志
全部打印
保存日志/日志持久化
需要先创建好想保存日志的文件夹
application.properties
## logging.level.root = trace
logging.path=C:\\Users\\U100926\\Desktop\\springboot_log\\
路径或者不写转义符号,都可以
logging.path=C:/log/
@slf4j 注解简化输出⽇志
package com.example.springlog.demo.controller;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@Controller
@Slf4j
@ResponseBody
public class UserController {
//private final static Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping("/sayhi")
public String sayHi() {
/* logger.trace("我是trace");
logger.debug("我是debug");
logger.info("我是info");
logger.warn("我是warn");
logger.error("我是error");*/
log.trace("我是trace2");
log.debug("我是debug2");
log.info("我是info2");
log.warn("我是warn2");
log.error("我是error2");
return "hello springboot3";
}
}
访问地址http://localhost:8080/sayhi
效果一样的,不需要定义
private final static Logger logger = LoggerFactory.getLogger(UserController.class);
设置日志保存的名称
logging.file = C:/Users/U100926/Desktop/sblog/spring-boot.log
-
访问浏览器地址
http://localhost:8080/sayhi -
生成指定名字日志文件